无法让 pyspark 作业在 hadoop 集群的所有节点上运行

Posted

技术标签:

【中文标题】无法让 pyspark 作业在 hadoop 集群的所有节点上运行【英文标题】:Can't get pyspark job to run on all nodes of hadoop cluster 【发布时间】:2015-12-16 10:57:25 【问题描述】:

总结:我的 python-spark 作业无法在我的 hadoop 集群的所有节点上运行。 我已经为 hadoop 'spark-1.5.2-bin-hadoop2.6' 安装了 spark。启动 java spark 作业时,负载得到 分布在所有节点上,当启动 python spark 作业时,只有一个节点承担负载。

设置

hdfs 和 yarn 配置为 4 个节点:nk01 (namenode)、nk02、nk03、nk04,在 xen 虚拟服务器上运行 版本:jdk1.8.0_66、hadoop-2.7.1、spark-1.5.2-bin-hadoop2.6 hadoop 安装了所有 4 个节点 spark 仅安装在 nk01 上

我将一堆 Gutenberg 文件(谢谢,Johannes!)复制到 hdfs 上,并尝试使用 java 和 python 对文件子集(以“e”开头的文件)进行字数统计:

Python

使用自制 python 脚本进行字数统计:

/opt/spark/bin/spark-submit wordcount.py --master yarn-cluster \
    --num-executors 4 --executor-cores 1

Python 代码分配了 4 个部分:

tt=sc.textFile('/user/me/gutenberg/text/e*.txt',4)

在 60 秒内加载 4 个节点:

Java

使用 spark 分布中的 JavaWordCount

/opt/spark/bin/spark-submit --class JavaWordCount --master yarn-cluster \
    --num-executors 4 jwc.jar '/user/me/gutenberg/text/e*.txt'

结论:java版本将负载分布在集群中,python版本只运行在1个节点上。

问题:如何让 python 版本也将负载分配到所有节点?

【问题讨论】:

【参考方案1】:

正如 Shawn Guo 所建议的那样,python 程序名称确实位于错误的位置。它应该以这种方式运行:

/opt/spark/bin/spark-submit --master yarn-cluster --num-executors 4 
       --executor-cores 1 wordcount.py

这会给节点带来这种负载:

【讨论】:

【参考方案2】:

火花提交

./bin/spark-submit \
  --class <main-class>
  --master <master-url> \
  --deploy-mode <deploy-mode> \
  --conf <key>=<value> \
  ... # other options
  <application-jar> \
  [application-arguments]

这里有一些与 scala/java 提交参数位置不同的地方。

对于 Python 应用程序,只需传递一个 .py 文件来代替 application-jar 而不是 JAR,并使用 --py-files 将 Python .zip、.egg 或 .py 文件添加到搜索路径。

您应该改用以下命令: /opt/spark/bin/spark-submit --master yarn-cluster wordcount.py --num-executors 4 --executor-cores 1

【讨论】:

以上是关于无法让 pyspark 作业在 hadoop 集群的所有节点上运行的主要内容,如果未能解决你的问题,请参考以下文章

我如何让 pandas 使用 spark 集群

如何将pyspark数据帧写入不同的hadoop集群

京东万台规模Hadoop集群 | 分布式资源管理与作业调度

在 YARN 集群上部署 pyspark 作业时出现 FileNotFoundException

如何访问安装在 hdfs 头节点集群内的 pyspark

如何提交依赖于 google dataproc 集群的 pyspark 作业