PySpark在YARN集群上分布式处理

时间:2015-01-30 05:06:28

标签: apache-spark yarn cloudera-cdh pyspark

我使用YARN作为资源管理器,在Cloudera CDH5.3集群上运行Spark。我正在用Python开发Spark应用程序(PySpark)。

我可以提交作业并且它们成功运行,但它们似乎永远不会在多台机器上运行(我提交的本地机器)。

我尝试了各种选项,比如将--deploy-mode设置为cluster,将master设置为yarn-client和yarn-cluster,但它似乎永远不会在多个服务器上运行。

我可以通过传递类似--master local [8]的内容来运行多个核心,但这显然不会在多个节点上分发处理。

我有一个非常简单的Python脚本处理来自HDFS的数据,如下所示:

import simplejson as json
from pyspark import SparkContext
sc = SparkContext("", "Joe Counter")

rrd = sc.textFile("hdfs:///tmp/twitter/json/data/")

data = rrd.map(lambda line: json.loads(line))

joes = data.filter(lambda tweet: "Joe" in tweet.get("text",""))

print joes.count()

我正在运行提交命令,如:

spark-submit atest.py --deploy-mode client --master yarn-client

如何确保作业在整个群集中并行运行?

4 个答案:

答案 0 :(得分:8)

你可以交换命令的参数吗? spark-submit --deploy-mode client --master yarn-client atest.py

如果您看到命令的帮助文本:

火花提交

Usage: spark-submit [options] <app jar | python file>

答案 1 :(得分:4)

我相信@MrChristine是正确的 - 您指定的选项标记将传递给您的python脚本,而不是spark-submit。此外,您还需要指定--executor-cores--num-executors,因为默认情况下它将在单个核心上运行并使用两个执行程序。

答案 2 :(得分:0)

python脚本不能在群集模式下运行,这是不正确的。我不确定以前的版本,但这是在Hortonworks集群的spark 2.2版本中执行。

命令: spark-submit --master yarn --num-executors 10 --executor-cores 1 --driver-memory 5g /pyspark-example.py

Python代码:

from pyspark import SparkConf, SparkContext
from pyspark.sql import SQLContext

conf = (SparkConf()
         .setMaster("yarn")
         .setAppName("retrieve data"))
sc = SparkContext(conf = conf)

sqlContext = SQLContext(sc)
parquetFile = sqlContext.read.parquet("/<hdfs-path>/*.parquet")

parquetFile.createOrReplaceTempView("temp")
df1 = sqlContext.sql("select * from temp limit 5")
df1.show()
df1.write.save('/<hdfs-path>/test.csv', format='csv', mode='append')
sc.stop()

输出:它很大,所以我不会粘贴。但它运行得很完美。

答案 3 :(得分:-2)

似乎PySpark不使用Spark / YARN在分布式模式下运行 - 您需要将独立Spark与Spark Master服务器一起使用。在这种情况下,我的PySpark脚本在整个集群中运行良好,每个核心/节点都有一个Python进程。

相关问题