如何使用 Amazon Athena 排查 Amazon EMR Spark 作业失败的问题?

2 分钟阅读
0

我在 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 作业中的阶段故障?

AWS 官方
AWS 官方已更新 3 年前