前段时间看到了外国朋友写的一篇文章,觉得还不错,于是就把他翻译一下,供大家参考和学习。
如果没看过第一篇文章,建议先去看一下上一篇文章哈,这里是接着上一篇文章来写的哈~
访问 Spark 应用程序日志的最简单方法是配置 Log4j 控制台 appender,等待应用程序终止并使用 yarn logs -applicationId [applicationId]
命令。 不幸的是,终止长时间运行的 Spark Streaming 作业来访问日志是不可行的。
我建议安装和配置 Elastic,Logstash 和 Kibana(ELK栈)。 ELK 的安装和配置不在此博客文章范围内,但请记住记录以下上下文字段:
具有 Logstash 特定 appender 和布局定义的 Log4j 配置应传递给 spark-submit命令:
spark-submit --master yarn --deploy-mode cluster \
--conf spark.yarn.maxAppAttempts=4 \
--conf spark.yarn.am.attemptFailuresValidityInterval=1h \
--conf spark.yarn.max.executor.failures={8 * num_executors} \
--conf spark.yarn.executor.failuresValidityInterval=1h \
--conf spark.task.maxFailures=8 \
--queue realtime_queue \
--conf spark.speculation=true \
--principal user/hostname@domain \
--keytab /path/to/foo.keytab \
--conf spark.hadoop.fs.hdfs.impl.disable.cache=true \
--conf spark.driver.extraJavaOptions=-Dlog4j.configuration=file:log4j.properties \
--conf spark.executor.extraJavaOptions=-Dlog4j.configuration=file:log4j.properties \
--files /path/to/log4j.properties
最后,Spark Job 的 Kibana 仪表板可能如下所示:
长时间运行的作业 7*24 小时运行,因此了解历史指标非常重要。 Spark UI 只对有限数量的 batch 保持统计信息,并且在重新启动后,所有 metrics 都消失了。 所以需要外部工具。 我建议安装 Graphite 来收集度量标准,Grafana 则用于构建仪表板。
首先,需要配置 Spark 以将 metrics 报告到 Graphite,准备如下metrics.properties
文件:
*.sink.graphite.class=org.apache.spark.metrics.sink.GraphiteSink
*.sink.graphite.host=[hostname]
*.sink.graphite.port=[port]
*.sink.graphite.prefix=some_meaningful_name
driver.source.jvm.class=org.apache.spark.metrics.source.JvmSource
executor.source.jvm.class=org.apache.spark.metrics.source.JvmSource
然后配置 spark-submit 命令:
spark-submit --master yarn --deploy-mode cluster \
--conf spark.yarn.maxAppAttempts=4 \
--conf spark.yarn.am.attemptFailuresValidityInterval=1h \
--conf spark.yarn.max.executor.failures={8 * num_executors} \
--conf spark.yarn.executor.failuresValidityInterval=1h \
--conf spark.task.maxFailures=8 \
--queue realtime_queue \
--conf spark.speculation=true \
--principal user/hostname@domain \
--keytab /path/to/foo.keytab \
--conf spark.hadoop.fs.hdfs.impl.disable.cache=true \
--conf spark.driver.extraJavaOptions=-Dlog4j.configuration=file:log4j.properties \
--conf spark.executor.extraJavaOptions=-Dlog4j.configuration=file:log4j.properties \
--files /path/to/log4j.properties:/path/to/metrics.properties
Spark 会从 Driver 和 executors 生成大量指标。 如果我选择最重要的一个,那将是最后收到的 batch 的信息。 当StreamingMetrics.streaming.lastReceivedBatch_records == 0
时,这可能意味着 Spark Streaming 作业已停止或失败。
下面列出了其他重要的 metrics:
driver.StreamingMetrics.streaming.lastCompletedBatch_totalDelay
number of executors * number of cores
时,YARN 分配的资源未充分利用。executor.threadpool.activeTasks
driver.BlockManager.memory.memUsed_MB
spark.memory.fraction
的Spark参数以避免性能下降。driver.BlockManager.disk.diskSpaceUsed_MB
driver.jvm.heap.used
driver.jvm.non-heap.used
driver.jvm.pools.G1-Old-Gen.used
driver.jvm.pools.G1-Eden-Space.used
driver.jvm.pools.G1-Survivor-Space.used
driver.jvm.G1-Old-Generation.time
driver.jvm.G1-Young-Generation.time
[0-9]*.jvm.heap.used
[0-9]*.jvm.non-heap.used
[0-9]*.jvm.pools.G1-Old-Gen.used
[0-9]*.jvm.pools.G1-Survivor-Space.used
[0-9]*.jvm.pools.G1-Eden-Space.used
[0-9]*.jvm.G1-Old-Generation.time
[0-9]*.jvm.G1-Young-Generation.time
注:本文翻译自:http://mkuthan.github.io/blog/2016/09/30/spark-streaming-on-yarn/