部署信息:"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 个)?或者我必须指定一些东西吗?
注意事项:
- 我认为实际上并没有分发任何东西(或者至少没有分发到 16 个节点上),因为当我执行
new_corpus.count()
时,打印出来的是[Stage some_number :> (0+2)/2]
,而不是[Stage some_number:> (0+16)/16]
- 我不认为执行
corpus = sc.textFile("my_file_name",16)
是我的解决方案,因为我想应用的函数在行级别工作,因此应该是应用了 100,000 次(并行化的目标是加快这个过程,比如让每个从属使用100000/16
行)。它不应在原始文本文件的 16 个子集上应用 16 次。
最佳答案
您的观察并不完全正确。阶段不是“执行者”。在 Spark 中,我们有工作、任务和阶段。作业由主驱动程序启动,然后将任务分配给不同的工作节点,其中阶段是具有相同洗牌依赖关系的任务集合。在你的情况下,洗牌只发生一次。
要检查执行者是否真的是 16 岁,您必须查看资源管理器。通常它位于端口 4040,因为您使用的是 yarn 。
此外,如果您使用 rdd.map(),那么它应该根据您定义的分区而不是您在 sc.textFile("my_file_name", numPartitions) 中设置的执行器进行并行化。
这里再次概述: https://spark.apache.org/docs/1.6.0/cluster-overview.html
关于python - pyspark 在集群上,确保所有节点都被使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35059608/