2016-07-03 17 views
1

pysparkのアプリケーションでロギングステートメントを含むクロージャー機能が含まれているため、pysparkのローカル/ hdfsファイルにメッセージを記録する方法がわかりません。 私は以下のように何かをしようとしたが動作しません:pysparkアプリケーションからローカルまたはhdfsファイルへのログ

import json 
from pyspark import SparkContext 
import logging 

def parse_json(text_line): 
    try: 
     return(json.loads(text_line)) 
    except ValueError: 
     # here I need to log a warning message to a local file or even to default spark logs 
     logger.warn("invalid json structure" + text_line) 
     return({}) 

if __name__ == "__main__": 
    my_data = ['{"id": "111", "name": "aaa"}', 
       '{"wrong json", "name": "bbb"}', 
       '{"id": "333", "name": "ccc"}'] 
    sc = SparkContext() 
    logger = logging.getLogger('py4j') 
    lines = sc.parallelize(my_data) 
    my_data_json = lines.map(parse_json).filter(lambda x: x) 
    print(my_data_json.collect()) 

任意の助けてください!

+2

「動作しません」と定義できますか?エラーが発生するか、「何も起こりませんか? – Creos

+0

エラーは表示されませんが、ドライバまたはエグゼキュータのログファイルにログメッセージが見つかりません。 –

答えて

1

log4jアペンダをlog4j設定で構成し、pysparkアプリケーション内で使用できます。私はHDFSにログを保存しようとはしませんでしたが、この方法は間違いなくコンソールにログオンし、ファイルにローカルでログオンするのに役立ちます。

あなたのソリューションに対処するための小さなブログ記事を書いています。

https://shantanualshi.wordpress.com/2016/07/04/logging-in-pyspark-scripts/

それが動作するかどうか、私に教えてください!

+0

ポストのための@ Shantanu Alshiありがとう。実際に私はあなたの指示を適用し、私は画面上の警告を得たが、私はログファイルのどこにもそれを見つけることができませんでした。 spark/logs// tmp/logfile.outには何もありません –

+0

ちょっと@ K.Ali、コンソールに加えて、あなたのrootloggerプロパティにもFILEを追加してください。 - log4j.rootLogger = WARN、console、FILE –

+0

Thanks @ Shantanu Alshiと遅れて反応して申し訳ありません。今私はlogfile.outにマッサージをもらっていますが、同じファイルにすべてのスパークログも取得しています。スパークログなしでアプリケーションログを分離できると思いますか? –