2017-03-06 95 views
9

我正在AWS EMR上運行一個非常簡單的Spark作業,並且似乎無法從我的腳本獲取任何日誌輸出。AWS EMR Spark Python日誌記錄

我已經與印刷試圖標準錯誤:

from pyspark import SparkContext 
import sys 

if __name__ == '__main__': 
    sc = SparkContext(appName="HelloWorld") 
    print('Hello, world!', file=sys.stderr) 
    sc.stop() 

並採用火花記錄器,如圖here

from pyspark import SparkContext 

if __name__ == '__main__': 
    sc = SparkContext(appName="HelloWorld") 

    log4jLogger = sc._jvm.org.apache.log4j 
    logger = log4jLogger.LogManager.getLogger(__name__) 
    logger.error('Hello, world!') 

    sc.stop() 

EMR給我的作業後兩個日誌文件運行:controllerstderr 。這兩個日誌都不包含"Hello, world!"字符串。這是我的理解stdout火花重定向到stderrstderr日誌顯示作業已被接受,運行併成功完成。

所以我的問題是,我在哪裏可以查看我的腳本的日誌輸出?或者我應該在腳本中更改哪些內容才能正確記錄?

編輯:我用這個命令提交步驟:

aws emr add-steps --region us-west-2 --cluster-id x-XXXXXXXXXXXXX --steps Type=spark,Name=HelloWorld,Args=[--deploy-mode,cluster,--master,yarn,--conf,spark.yarn.submit.waitAppCompletion=true,s3a://path/to/simplejob.py],ActionOnFailure=CONTINUE 
+0

您將工作提交給EMR的參數是? – user3154952

+1

我發現特定步驟的日誌記錄幾乎不會出現在控制檯或EMR控制檯旁邊的步驟中的stderr日誌中。通常我在作業的容器日誌中找到我想要的東西(通常是標準輸出)。他們通常在's3:// mybucket/logs/emr/spark/j-XXXXXX/containers/application_XXXXXXXXX/container_XXXXXXX/...' –

+0

@GregReda我在那裏找到了日誌。謝謝!如果您將它作爲答案發布,我會接受它。 – jarbaugh

回答

4

我發現,電子病歷的記錄爲特定的步驟幾乎從來沒有在得到拉一起在步驟控制器或標準錯誤日誌捲起AWS控制檯。

通常我找到我想要的作業的容器日誌(通常它在stdout中)。

這些通常在像s3://mybucket/logs/emr/spark/j-XXXXXX/containers/application‌​_XXXXXXXXX/container‌​_XXXXXXX/...這樣的路徑。您可能需要在containers內的各個application_...container_...目錄內四處徘徊。

最後一個容器目錄應該有一個stdout.logstderr.log

0

要捕獲腳本的輸出,你可以嘗試像下面還有

/usr/bin/spark-submit --master yarn --num-executors 300 myjob.py param1 > s3://databucket/log.out 2>&1 & 

這將腳本輸出寫入在S3位置的日誌文件。