2017-09-25 90 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模塊中引用的每個文件夾中。

    相關問題