无法让 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 集群的所有节点上运行的主要内容,如果未能解决你的问题,请参考以下文章