Spark Core核心编程之广播变量剖析 | AiTi修炼|重剑无锋,拈花微笑
Header
Header

Spark Core核心编程之广播变量剖析

    如果深入思考spark的分布式集群工作过程,就会发现有一些问题是分布式多节点需要考虑解决的。如一些变量在集群节点之间的拷贝。如我们在应用程序中编写代码,实际运行时候是将相关的代码分发个各节点进行运行,在spark中application应用程序向spark集群提交请求,申请相关运算资源;spark master节点分配好相关节点运算资源之后,在work节点启动相关的excutor以task线程来处理application中的计算任务。在一般情况下excutor中task进程中运行时所涉及的变量是独立的互不干扰的,这样就需要每一个task通过网络拷贝application中定义的相关变量(如下图绿色所示意的过程)。


     在这样的一个过程,我们会发现如果多个节点同时运行多个task就会产生同一个变量多次被拷贝到其他节点之间,即便在同一个work节点的不同task节点也拷贝了多份相同的变量数据,对内存资源有一定浪费,若是拷贝的变量本身就涉及很大的数据量,那将严重降低spark的运行速度,甚至导致oom的出现。
    针对这个问题spark运行用户通过广播变量的方式来解决,所谓的广播方式就是仅拷贝一份变量到work中供所有task引用,而并不是每个task都拷贝一份数据。(如上图红色线条部分所示)该解决方法仔细思考就会发现其实也很合理,并spark基于scala实现,在节点之间的数据交互本身就强调不可改变性,来达到更好的容错的,毕竟如果数据通信多节点之间可以随意修改的话,数据一致性就是一个麻烦问题,且需要损耗一定程度的系统处理能力才能满足。

rscala.com版权所有,本文Spark Core核心编程之广播变量剖析转载请注明出处:http://rscala.com/index.php/324.html

该文章归档分类于 scala实践, spark实践

One Response



Leave a Reply

电子邮件地址不会被公开。 必填项已用*标注

*

code