代码之家  ›  专栏  ›  技术社区  ›  AngiSen

PySpark submit命令带--files参数错误

  •  1
  • AngiSen  · 技术社区  · 6 年前

    spark-submit 
    --deploy-mode cluster 
    --master yarn 
    --files ETLConfig.json 
    PySpark_ETL_Job_v0.2.py
    

    ETLConfig.json 具有传递给PySpark脚本的参数。我在主块中引用这个config json文件,如下所示:

    configFilePath = os.path.join(SparkFiles.getRootDirectory(), 'ETLConfig.json')
    with open(configFilePath, 'r') as configFile:
        configDict = json.load(configFile)
    

    但是,该命令抛出以下错误。

    No such file or directory: u'/tmp/spark-7dbe9acd-8b02-403a-987d-3accfc881a98/userFiles-4df4-5460-bd9c-4946-b289-6433-drgs/ETLConfig.json'
    

    我能知道我的剧本有什么问题吗?我也试过了 SparkFiles.get() 但它也不起作用。

    2 回复  |  直到 6 年前
        1
  •  2
  •   Ryan Widmaier    6 年前

    --files 将转储文件。对于客户机模式,这将是不同的,但对于集群模式,它应该可以正常工作。例如,这适用于我:

    driver.py

    from pyspark import SparkContext, SparkFiles
    import os
    
    with SparkContext() as sc:
        print "PWD: " + os.getcwd()
        print "SparkFiles: " + SparkFiles.getRootDirectory()
        data = open('data.json')
        print "Success!"
    

    spark-submit --deploy-mode cluster --master yarn --files data.json driver.py
    

    已更新(比较路径):

    我更新了我的代码来打印PWD(有效)和 SparkFiles.getRootDirectory

    这就是我们所说的:

    PWD: /var/lib/hadoop-yarn/cache/yarn/nm-local-dir/usercache/rwidmaier/appcache/application_1539970334177_0004/container_1539970334177_0004_01_000001
    SparkFiles: /var/lib/hadoop-yarn/cache/yarn/nm-local-dir/usercache/rwidmaier/appcache/application_1539970334177_0004/spark-e869ac40-66b4-427e-a928-deef73b34e40/userFiles-a1d8e17f-b8a5-4999-8
    

    显然,它的工作方式是 只有兄弟会才能保证 SparkFiles.get(..) 执行者上的文件夹,而不是驱动程序上的文件夹。但是,为了将它们发送给执行者,Spark首先将它们下载到驱动程序上的PWD,这样您就可以从那里访问它。

    它实际上只在帮助文本中提到执行者,而不是驱动程序。

      --files FILES               Comma-separated list of files to be placed in the working
                                  directory of each executor. File paths of these files
                                  in executors can be accessed via SparkFiles.get(fileName).
    

    供参考, here 是将文件下载到驱动程序的位置。

        2
  •  4
  •   user10533328    6 年前

    你用 cluster --files 路径不是指用于提交的计算机上的本地路径,而是指用于生成驱动程序的辅助进程上的本地路径,该驱动程序是集群中的任意节点。

    • HTTP/HTPPS URL。