上次更新日期:2021 年 3 月 11 日
我在 Amazon EMR 上的 Spark 作业失败了。我想使用 Amazon Athena 通过查询 Spark 日志排查失败问题。
解决方法当 Amazon EMR 应用程序在 Amazon EMR 上运行时,会生成日志文件。您可以为 EMR 日志文件创建基本表,然后使用 Athena 查询这些 EMR 日志。您可以通过查询 EMR 日志识别应用程序和集群的事件和趋势。
运行类似于以下内容的命令基于保存在 Amazon S3 日志位置的 EMR 日志文件创建基本表 myemrlogs:
CREATE EXTERNAL TABLE `myemrlogs`(
`data` string COMMENT 'from deserializer')
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '|'
LINES TERMINATED BY '\n'
STORED AS INPUTFORMAT
'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
's3://aws-logs-111122223333-us-west-2/elasticmapreduce/j-1ABCDEEXAMPLE/containers/application_1111222233334_5555/'
替换上述查询中的以下内容:
myemrlogs 替换为表格名称 111122223333 替换为 AWS 账号 j-1ABCDEEXAMPLE 替换为 clusterID us-west-2 替换为您的首选区域 application_1111222233334_5555 替换为应用程序 ID注:示例中提到的 S3 存储桶是 Amazon EMR 使用的默认存储桶。要验证您的日志存储桶路径,请打开 Amazon EMR 控制台,选择您的集群,然后选中 Summary(摘要)选项卡中的 Log URI(日志 URI)字段。
然后,运行类似于以下内容的命令,以检查 myemrlogs 中出现的 FAIL、ERROR、WARN、EXCEPTION、FATAL 或 CAUSE:
SELECT *,"$PATH" FROM myemrlogs WHERE regexp_like(data, 'FAIL|ERROR|WARN|EXCEPTION|FATAL|CAUSE') limit 100;
注:将 myemrlogs 替换为您从 EMR 日志文件中创建的表格的名称。
可以通过不同的方式查询 EMR 日志,以了解 Spark 应用程序在哪一步失败。如果应用程序在作业、阶段、任务或执行者级别发生故障,请使用以下几个查询日志的方法来进行问题排查。
运行类似以下内容的命令以获取应用程序的退出代码:
SELECT *,"$PATH" FROM myemrlogs WHERE regexp_like(data, 'exitCode');
运行类似以下内容的命令以检查 Spark 执行程序在哪台主机上运行:
SELECT *,"$PATH" FROM myemrlogs WHERE regexp_like(data, 'executor ID');
运行类似以下内容的命令以跟踪任务到阶段的映射:
SELECT *,"$PATH" FROM myemrlogs WHERE regexp_like(data, 'TID');
运行类似以下内容的命令以检查容器的堆内存详细信息:
SELECT *,"$PATH" FROM myemrlogs WHERE regexp_like(data, 'space');
运行类似以下内容的命令,在有向无环图 (DAG) 计划程序上跟踪每个作业/阶段的进度:
SELECT *,"$PATH" FROM myemrlogs WHERE regexp_like(data, 'DAGScheduler');
您还可以根据 Amazon EMR 日志创建分区表,然后使用 Athena 查询这些日志。有关更多信息,请参阅基于 Amazon EMR 日志创建和查询分区表。