spark-submit with python入口点

时间:2017-10-23 18:11:17

标签: python apache-spark entry-point spark-submit

我有一个脚本wordcount.py
我使用setuptools来创建一个名为wordcount的入口点,所以现在我可以从系统的任何地方调用该命令。
我试图通过spark-submit(命令:spark-submit wordcount)执行它但它失败并出现以下错误:

Error: Cannot load main class from JAR file:/usr/local/bin/wordcount Run with --help for usage help or --verbose for debug output

但是当我提供python脚本的路径时,完全相同的命令工作正常(命令:spark-submit /home/ubuntu/wordcount.py

wordcount.py的内容

import sys
from operator import add

from pyspark.sql import SparkSession

def main(args=None):
    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()

if __name__ == "__main__":
    main()

你知道是否有办法绕过这个?
非常感谢。

2 个答案:

答案 0 :(得分:0)

当你运行spark-submit wordcount时,它会将wordcount视为将要执行的类的jar文件。
此外,它会尝试在路径/usr/local/bin中找到jar,因为您尚未指定类路径 请提供wordcount文件的内容。如果可能,请尝试使用wordcount执行spark-submit的路径。

查看此链接以获取更多信息。在spark-submit命令:https://spark.apache.org/docs/latest/submitting-applications.html

答案 1 :(得分:0)

我发现,如果您将入口点重命名为具有后缀.py,则spark-submit会将其作为python应用程序接受:

entry_points={
    'console_scripts': [
        'wordcount.py = mymodule.wordcount:main',
    ],
}

然后按预期方式接受提交:

spark-submit ./bin/wordcount.py