2017-09-25 110 views
1

加载配置,我想一次初始化配置,然后在我的PySpark项目的许多模块使用它。什么是最好的做法PySpark从外部文件

我看到2种方法来做到这一点。

  1. 负荷它在进入点和作为参数传递给每个功能

main.py:

with open(sys.argv[1]) as f: 
    config = json.load(f) 
df = load_df(config) 
df = parse(df, config) 
df = validate(df, config, strict=True) 
dump(df, config) 

但似乎unbeauty通过一个外部参数给每个功能。

  • 负载在config.py配置,并且每个模块
  • config.py

    import sys 
    import json 
    with open(sys.argv[1]) as f: 
        config = json.load(f) 
    

    main.py

    from config import config 
    df = load_df() 
    df = parse(df) 
    df = validate(df, strict=True) 
    dump(df) 
    
    在导入该对象

    和每个模块中添加行

    from config import config 
    

    看起来更美观,因为配置不是严格意义上的功能论证。这是他们执行的一般情况。

    不幸的是,PySpark泡菜config.py并试图执行它在服务器上,但没有通过sys.argv中给他们! 所以,我看到错误时运行

    File "/PycharmProjects/spark_test/config.py", line 6, in <module> 
        CONFIG_PATH = sys.argv[1] 
    IndexError: list index out of range 
    

    什么是与一般的配置,从文件加载到工作,在PySpark最好的做法是什么?

    回答

    1

    你的程序在主开始执行并通过调用它们的一些功能通过主要大宗其各项工作中执行人。执行者是不同的进程,通常运行在不同的物理机器上。

    因此任何主将要在执行器引用需要是标准库函数(这是该执行器具有访问权限),或者可以被发送在pickelable对象。

    您通常不希望加载和解析执行程序上的任何外部资源,因为您总是必须复制它们并确保正确加载它们......将pickelable对象作为函数的参数传递(例如,对于UDF)效果会更好,因为代码中只有一个地方需要加载它。

    我建议建立一个config.py文件,并将其作为参数添加到您的​​命令:

    spark-submit --py-files /path/to/config.py main_program.py 
    

    然后您可以创建火花背景是这样的:

    spark_context = SparkContext(pyFiles=['/path/to/config.py']) 
    

    ,并简单地使用import config哪里你需要。

    你甚至可以包括整个Python包在打包为一个压缩文件,而不是只是一个单一的文件config.py一棵树,但之后一定要包括__init__.py需要为Python模块中引用的每个文件夹中。

    相关问题