部署信息:"pyspark --master yarn-client --num-executors 16 --driver-memory 16g --executor-memory 2g "
我将100,000行文本文件(hdfs dfs
格式)转换为corpus = sc.textFile("my_file_name")
的RDD对象。当我执行corpus.count()
时,我会得到100000
。我意识到所有这些步骤都是在主节点上执行的。
现在,我的问题是当我执行像new_corpus=corpus.map(some_function)
这样的操作时,pyspark会在所有可用的从属中自动分配作业(在我的情况下为16)?或者我必须指定一些东西?
注意:
new_corpus.count()
时,打印出来的是[Stage some_number:> (0+2)/2]
,而不是[Stage some_number:> (0+16)/16]
< / LI>
corpus = sc.textFile("my_file_name",16)
是我的解决方案,因为我想要应用的功能在行级工作,因此应该应用100,000次(并行化的目标是加快这个过程就像每个奴隶都有100000/16
行一样。它不应该在原始文本文件的16个子集上应用16次。答案 0 :(得分:2)
您的观察结果并不正确。阶段不是“执行者”。在Spark中,我们有工作,任务和阶段。作业由主驱动程序启动,然后将任务分配给不同的工作节点,其中stage是具有相同shuffling依赖性的任务集合。在你的情况下,洗牌只发生一次。
要检查执行程序是否真的是16,您必须查看资源管理器。通常它在端口4040,因为你使用纱线。
此外,如果您使用rdd.map(),那么它应该根据您定义的分区并行化,而不是您在sc.textFile(“my_file_name”,numPartitions)中设置的执行程序。
以下是概述: https://spark.apache.org/docs/1.6.0/cluster-overview.html
答案 1 :(得分:1)
首先,我看到了yarn-client
,一阵寒意从我的脊椎上流下来。
您是否有理由希望提交作业的节点运行驱动程序?为什么不让Yarn做它的事呢?
但关于你的问题:
我意识到所有这些步骤都是在主节点上执行的。
不,他们不是。您在所连接的节点上运行驱动程序的事实可能会误导您(请参阅我的脊椎寒冷;))。
你告诉纱线为你启动16个遗嘱执行人,Yarn会这样做。 在这样做时,它会尽力将您的机架和数据位置考虑在内。这些将并行运行。
Yarn是一名资源管理员,它管理资源,因此您不必这样做。您必须使用Spark指定的所有执行器数量以及内存纱线必须分配给执行程序和驱动程序。