我在 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 日志创建和查询分区表。
相关信息
如何排查 Amazon EMR 上 Spark 作业中的阶段故障?