我跑在AWS EMR一个非常简单的Spark的工作,似乎无法从我的脚本中的任何日志输出。
我试着打印到标准错误:
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给我的作业运行后两个日志文件:controller
和stderr
。无论日志包含"Hello, world!"
字符串。这是我的理解stdout
被重定向的火花stderr
。该stderr
日志显示作业被接受,运行和顺利完成。
所以我的问题是,我在哪里可以查看我的脚本日志的输出?或者我应该在我的脚本改变什么才能正确登录?
编辑:我用这个命令提交下列步骤:
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
我发现,电子病历的记录为特定的步骤几乎从来没有在得到拉一起在AWS控制台步,控制器或标准错误日志卷起。
通常我找到我想要在作业的集装箱日志(通常它在标准输出)。
这些通常是在像s3://mybucket/logs/emr/spark/j-XXXXXX/containers/application_XXXXXXXXX/container_XXXXXXX/...
的路径。您可能需要application_...
内的各种container_...
和containers
目录内闲逛。
这最后一个容器目录下应该有一个stdout.log
和stderr.log
。
为了捕捉脚本的输出,你可以尝试类似下面还有
/usr/bin/spark-submit --master yarn --num-executors 300 myjob.py param1 > s3://databucket/log.out 2>&1 &
这会写脚本输出到日志文件在S3位置。
对于什么是值得的。让j-XXX
是EMR集群的ID和假设它被配置为使用logs_bucket
对S3持续日志。如果你想找到你的代码发出的日志,做到以下几点:
stderr
和搜索application_
。请记你找到完整的名字,它应该像application_15489xx175355_0yy5
。s3://logs_bucket/j-XXX/containers
并找到该文件夹application_15489xx175355_0yy5
。application_15489xx175355_0yy5_ww_vvvv
至少一个文件夹。在这些文件夹,你会发现一个名为stderr.gz
包含您的代码发出的日志文件。