在apachespark中rdd的分布式计算是如何工作的?

z3yyvxxp  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(265)

如果我有一个非常简单的spark程序,它可以:

val rdd2 = sc.textFile("hdfs:///text.txt")
println(rdd.count)

当我向使用Yarn簇的Yarn提交此spark程序时:
yarn resourcemanager将协商一个容器并启动spark applicationmaster。
然后applicationmaster将自己注册到resourcemanager并请求资源。
从resourcemanager获得资源规范后,applicationmaster将在nodemanager上启动容器。
我的问题是,因为hadoop中的数据分布在多台机器上(假设上面示例中的text.txt分为3个块:
是否在每台有text.txt块的机器上启动应用程序主机?
spark executor是一个已经安装在集群的每个节点上的软件,还是该executor被示例化到由节点上的applicationmaster启动的容器中?

r7knjye2

r7knjye21#

好问题,但对这个论坛来说可能太大了。
首先,你的假设通常是正确的,但时机不对。
yarn resourcemanager将协商一个容器并启动spark applicationmaster。
然后applicationmaster将自己注册到resourcemanager并请求资源。
一旦从resourcemanager获得了资源规范,applicationmaster将在nodemanager上启动容器。
如果你用的是 sc (the) SparkContext )那么这已经发生了。如果添加或删除执行器,resourcemanager可能还有其他工作,但是 SparkContext 仅在分配初始资源后存在。
是否在每台有text.txt块的机器上启动应用程序主机?
不,但是工人或执行者可以在任何有阻塞的机器上启动。或者,它们可以在一台机器上启动。但是,每个块都(可能)由一个辅助进程读取。在这种hdfs情况下,worker可以从集群上的任何地方读取数据。
spark executor是一个已经安装在集群的每个节点上的软件,还是该executor被示例化到由节点上的applicationmaster启动的容器中?
它可以安装在节点上,也可以在运行时提供给节点。Spark执行器只是一个jar。我看到它被放入hdfs本身,或者作为本地资源放在集群中的每台机器上。您可以将其放置在工作人员可以访问的任何位置。

相关问题