• 编写的Spark程序代码,运行在driver端还是executor端呢?


    在Spark中:

    driver是运行用户编写Application的main()函数的地方,具体负责DAG的构建、任务的划分、task的生成与调度等。job,stage,task生成都离不开rdd自身,rdd的相关的操作不能缺少driver端的sparksession/sparkcontext。

    executor是真正执行task地方,而task执行离不开具体的数据,这些task运行的结果可以是shuffle中间结果,也可以持久化到外部存储系统。一般都是将结果、状态等汇集到driver。但是,目前executor之间不能互相通信,只能借助第三方来实现数据的共享或者通信。

    那么,编写的Spark程序代码,运行在driver端还是executor端呢?

    先看个简单例子:通常我们在本地测试程序的时候,要打印RDD中的数据。

    在本地模式下,直接使用rdd.foreach(println)或rdd.map(println)在单台机器上,能够按照预期打印并输出所有RDD的元素。

    但是,在集群模式下,由executor执行输出写入的是executor的stdout,而不是driver上的stdout,所以driver的stdout不会显示这些!

    要想在driver端打印所有元素,可以使用collect()方法先将RDD数据带到driver节点,然后在调用foreach(println)(但需要注意一点,由于会把RDD中所有元素都加载到driver端,可能引起driver端内存不足导致OOM。如果你只是想获取RDD中的部分元素,可以考虑使用take或者top方法)

    总之,在这里RDD中的元素即为具体的数据,对这些数据的操作都是由负责task执行的executor处理的,所以想在driver端输出这些数据就必须先将数据加载到driver端进行处理。

    最后做个总结:所有对RDD具体数据的操作都是在executor上执行的,所有对rdd自身的操作都是在driver上执行的。比如foreach、foreachPartition都是针对rdd内部数据进行处理的,所以我们传递给这些算子的函数都是执行于executor端的。但是像foreachRDD、transform则是对RDD本身进行一列操作,所以它的参数函数是执行在driver端的,那么它内部是可以使用外部变量,比如在Spark Streaming程序中操作offset、动态更新广播变量等。

     

  • 相关阅读:
    jQuery的事件处理
    《CSS mastery》 读书笔记
    javascript 基础三
    javascript 基础二
    webpack全局引入jquery的方法
    解决mongoVue的collections不显示问题
    javascript 实现一个回文数字
    nth-child和:nth-of-type的区别
    iscroll5实现一个下拉刷新上拉加载的效果
    js(jquery)解决input元素的blur事件和其他非表单元素的click事件冲突的方法
  • 原文地址:https://www.cnblogs.com/itboys/p/13026748.html
Copyright © 2020-2023  润新知