首页 文章

PySpark在YARN集群上分布式处理

提问于
浏览
8

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

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

我尝试了各种选项,比如将--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 回答

  • 4

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

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

    spark-submit

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

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

  • -2

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

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

    Python Code :

    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()
    

    Output : 它很大,所以我不会粘贴 . 但它运行完美 .

  • 8

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

相关问题