python - pyspark 在集群上,确保所有节点都被使用

标签 python hadoop apache-spark cluster-computing pyspark

部署信息:"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/

相关文章:

python - 如何让 GridSearchCV 在我的管道中使用自定义转换器?

Hadoop-mkdir : - Could not create the Java Virtual Machine

windows - 在 Windows 10 中首次运行 Hadoop 时数据节点执行错误

java - 如何使用 Spark 创建大文件的较小子集

scala - spark : merge two dataframes, 如果 ID 在两个数据帧中重复,df1 中的行将覆盖 df2 中的行

python浮点到整数列表不匹配

python - 学习 Go 或提高我的 Python/Ruby 知识

python - KivyMD:工具栏在 Android 上不起作用。应用程序崩溃

hadoop - 在 mapReduce 中分组数据

apache-spark - 为Spark数据框中的每个组创建索引