通过Yarn集群与客户端提交时的Spark输出

时间:2017-04-07 17:26:38

标签: apache-spark pyspark yarn

我是Spark的新手,只是在我的集群上运行它(运行社区版MapR的9节点集群上的Spark 2.0.1)。我通过

提交wordcount示例
./bin/spark-submit --master yarn --jars ~/hadoopPERMA/jars/hadoop-lzo-0.4.21-SNAPSHOT.jar examples/src/main/python/wordcount.py ./README.md

并获得以下输出

17/04/07 13:21:34 WARN Client: Neither spark.yarn.jars nor spark.yarn.archive is set, falling back to uploading libraries under SPARK_HOME.
: 68
help: 1
when: 1
Hadoop: 3
...

看起来一切正常。当我添加--deploy-mode cluster时,我得到以下输出:

17/04/07 13:23:52 WARN Client: Neither spark.yarn.jars nor spark.yarn.archive is set, falling back to uploading libraries under SPARK_HOME.

所以没有错误但我没有看到wordcount结果。我错过了什么?我在历史服务器中看到了该作业,并表示已成功完成。此外,我在DFS中检查了我的用户目录,但除了这个空目录外没有写入新文件:/user/myuser/.sparkStaging

代码(Spark附带的wordcount.py示例):

from __future__ import print_function
import sys
from operator import add
from pyspark.sql import SparkSession


if __name__ == "__main__":
    if len(sys.argv) != 2:
        print("Usage: wordcount <file>", file=sys.stderr)
        exit(-1)

    spark = SparkSession\
        .builder\
        .appName("PythonWordCount")\
        .getOrCreate()

    lines = spark.read.text(sys.argv[1]).rdd.map(lambda r: r[0])
    counts = lines.flatMap(lambda x: x.split(' ')) \
              .map(lambda x: (x, 1)) \
              .reduceByKey(add)
    output = counts.collect()
    for (word, count) in output:
        print("%s: %i" % (word, count))

    spark.stop()

1 个答案:

答案 0 :(得分:3)

输出不打印的原因是:

当您在spark-client模式下运行时,您启动该作业的节点是DRIVER,当您收集结果时,它将在该节点上收集并打印出来。

在纱线群集模式下,您的驱动程序是其他节点,而不是您通过其启动作业的节点。因此,当您调用.collect函数时,结果将收集在该函数上并打印在该节点上。您可以在驱动程序的sys-out中找到打印结果。 更好的方法是在HDFS中的某处写入输出。

spark.yarn.jars警告的原因是:

为了运行spark作业,如果这些二进制文件不可用,则需要在集群的所有节点上提供一些二进制文件,然后作为作业准备的一部分,Spark将创建一个包含$ SPARK_HOME / jars下所有jar的zip文件并将其上传到分布式缓存。

解决这个问题:

默认情况下,YARN上的Spark将使用本地安装的Spark jar,但Spark jar也可以位于HDFS上的世界可读(chmod 777)位置。这允许YARN将其缓存在节点上,这样每次应用程序运行时都不需要分发它。例如,要指向HDFS上的jar,请将spark.yarn.jars设置为hdfs:/// some / path。

放置你的罐子之后运行你的代码,如:

./bin/spark-submit --master yarn --jars ~/hadoopPERMA/jars/hadoop-lzo-0.4.21-SNAPSHOT.jar examples/src/main/python/wordcount.py ./README.md --conf spark.yarn.jars="hdfs:///some/path"

来源:http://spark.apache.org/docs/latest/running-on-yarn.html