AWS EMR Spark Python日志记录

jar*_*ugh 15 python emr apache-spark

我在AWS EMR上运行一个非常简单的Spark作业,似乎无法从我的脚本中获取任何日志输出.

我试过打印到stderr:

from pyspark import SparkContext
import sys

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

并采用火花记录器如图所示在这里:

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()
Run Code Online (Sandbox Code Playgroud)

作业运行后EMR给我两个日志文件:controllerstderr.两个日志都不包含"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
Run Code Online (Sandbox Code Playgroud)

Gre*_*eda 11

我发现EMR针对特定步骤的日志记录几乎从未在控制台或stderr日志中出现,这些日志与AWS控制台中的步骤一起被拉出.

通常我会在作业的容器日志中找到我想要的东西(通常是在stdout中).

这些通常是在一条路上s3://mybucket/logs/emr/spark/j-XXXXXX/containers/application??_XXXXXXXXX/container??_XXXXXXX/....您可能需要内部各闲逛application_...container_...内目录containers.

最后一个容器目录应该有一个stdout.logstderr.log.