作者回复: 感谢老弟,问题提得很好~ 先说说选主,这个其实比较简单,Standalone部署模式下,Master与Worker角色,这个是我们通过配置文件,事先配置好的,所以说,哪台是Master,哪台是Worker,这个配置文件里面都有。在Standalone部署下,先启动Master,然后启动Worker,由于配置中有Master的连接地址,所以Worker启动的时候,会自动去连接Master,然后双方建立心跳机制,随后集群进入ready状态。 接下来说Master、Worker与Driver、Executors的关系。首先,这4个“家伙”,都是JVM进程。不过呢,他们的定位和角色,是完全不一样的。Master、Worker用来做资源的调度与分配,你可以这样理解,这两个家伙,只负责维护集群中可用硬件资源的状态。换句话说,Worker记录着每个计算节点可用CPU cores、可用内存,等等。而Master从Worker收集并汇总所有集群中节点的可用计算资源。 Driver和Executors的角色,那就纯是Spark应用级别的进程了。这个咱们课程有介绍,就不赘述了。Driver、Executors的计算资源,全部来自于Master的调度。一般来说,Driver会占用Master所在节点的资源;而Executors一般占用Worker所在节点的计算资源。一旦Driver、Executors从Master、Worker那里申请到资源之后,Driver、Executors就不再“鸟”Master和Worker了,因为资源已经到手了,后续就是任务调度的范畴。任务调度课程中也有详细的介绍,老弟可以关注下~ 大概其就是这么些关系,不知道对老弟是否有所帮助~
作者回复: 满分!满分!💯,Perfect! 太赞了,目前最棒的答案! collect和take的分析,尤其到位,尤其是take的部分!我跟编辑打个招呼,把你的答案置顶~
作者回复: 是在Executors端执行的,但是,每个Executors只读取文件的一部分~ 可以结合后面会讲的调度系统,来理解这一点~
作者回复: 好问题~ 1. 满分💯,我理解,collect更多的是社区为开发者提供的一种能力或者说功能,就是Spark有能力把全量结果收集到Driver,但是坦白说,这种需求在工业级应用中并不多。但是Spark必须提供这种能力或者选项,以备开发者不时之需。换句话说,collect是鸡肋,食之无味,但是不能没有。 2. 我理解这是两个问题。先说Top5,再说take5,两个有着天壤之别。top5,其实就是全量数据之上的计算,先分组,再聚合,最后排序,这个不是从哪个Executors提取的,而是最后做归并排序(Global sort)的时候,按照大小个提取出来的,具体是哪个Executors,要看它是不是提供了top5的words。 再说take5,这个就有意思了。top5,暗含着的意思,就是数据一定需要排序,否则哪里有“top”的概念呢。但是take不一样,take,是“随便”拿5个。在咱们的word count示例中,假设没有sortByKey,直接用take(5),那么Spark在运行时的表现,会完全不一样。具体来说,因为是“随便”取5个,所以Spark会偷懒,不会去run全量数据,而是试探性地,去run几个小的job,这些job,只用部分数据,只要最终能取到5个值,“随便取5个”的目的就达到了,这其实是Spark对于first、take这类算子的一种优化~
作者回复: 感谢老弟认可~ 这边更新进度是每周一三五哈~
作者回复: 其实这里需要理解Shuffle的过程哈~ 老弟可以关注后面Shuffle的部分。 1)dag解析,拆分stages,分发tasks,这些全部由driver来做,如你所言,Executors只负责计算, 2)在一个stage内部,各个Executors确实仅仅是做好自己的分内事,大家专注地执行自己的任务 3)但是,在shuffle阶段,所有Executors,都需要跨节点,去访问其他所有Executors的shuffle中间文件,这部分我们在shuffle会讲。而shuffle中间文件,是存储在spark.local.dir这个配置项所配置的本地目录的。也就是每个Executors都知道,去各个节点的这个目录下面去找。至于说,每个Executors怎么知道该获取数据的哪部分,这就还要说回shuffle中间文件,它包含data和index两部分,index会标记,每个reduce task去获取哪部分数据。 总的来说,老弟的问题,实际上是关于shuffle的,可以特别去关注那一part哈
作者回复: 感谢老弟提供的建议~ 和《入门篇》配套,还有一个《调优篇》:Spark性能调优实战,那门课里面更针对性能优化一些,里面的案例也更丰富,不知道是不是老弟想要的内容~
作者回复: 好问题,sortByKey其实是先shuffle,然后再merge sort,也就是: 1)Executors局部sort 2)用merge sort挑选出前5个 先shuffle,其实就保证了key一样的records,被shuffle到同一节点,这样全局再做sort的时候,就不会出现你说的局部与全局不一致的情况
作者回复: Exception in thread "main" org.apache.spark.SparkException: Master must either be yarn or start with spark, mesos, k8s, or local。 从报错来看,Master没有设置好,老弟看下Master的spark-defaults.conf文件,可以把文件内容贴出来,一起看看,或者你加我微信也行,“方块K”或者“rJunior”。环境的配置确实比较麻烦,哪一步稍有不对,可能就跑不起来,加微信一起看看吧。 确认下,无密码SSH没问题是吧?不同节点jps一下,看看Master和Worker是不是成功启动了,再有,用spark-shell --master spark://node0:7077,试一下Master是不是ready的,先看看spark-shell能不能起来
作者回复: 感谢老弟的认可~ 嗯嗯,后面继续加油~