Spark日志排查指南

Spark日志排查指南

本文基于Spark2.1.0版本整理,采用Yarn作为集群管理器

Spark 程序的日志根据 spark 程序所在的阶段需要去不同的地方查看

  1. 程序运行过程中,可以通过程序本身的Web UI查看运行时日志。(PS: Spark的Web UI信息是任务运行过程中记录在内存中的详细记录,任务执行完毕后无法再通过原来的URL查看)
  2. 程序运行结束后,若开启了Yarn 和 Spark的日志聚合功能,日志会被聚合上传到对应的HDFS目录,可以通过Spark History Server提供的Web UI页面查看,否则只能[在对应的NodeManager下查看Container日志]。(PS:日志文件聚合以及History Server解析日志需要时间,所以在Spark任务结束后无法立即在History Server的UI页面看到)
  3. History Server 内存中保留的任务个数(参数spark.history.retainedApplications控制)是有限制的,会从内存中滚动剔除超时的任务,这些任务无法再通过History Server提供的UI页面查看,此时可以去对应的HDFS存储目录获取原始的日志文件自行分析,具体操作见下面小节——[开启Yarn日志聚合功能后,可以通过HDFS或Yarn命令下载聚合后的日志文件]

1. 在对应的NodeManager下查看Container日志

目录:${yarn.nodemanager.log-dirs}/application_${appid}

2. 开启Yarn日志聚合功能后,可以通过HDFS或Yarn命令下载聚合后的日志文件

  1. 如果知道日志具体存储的HDFS目录(通常为${yarn.nodemanager.remote-app-log-dir}/${user}/${yarn.nodemanager.remote-app-log-dir-suffix}/application_${appid},可以通过hdfs -dfs get 命令直接获取日志文件
  2. 通过yarn log -applicationId application_${appid} 命令获取,也可以加上 -containerId 参数获取单个Container日志文件
yarn logs -applicationId  application_1537448956025_2409589 > application_1537448956025_2409589

Spark Web UI

官方文档——Web UI

Spark Web UI 提供了一种可视化的的方式在 Spark 和 JVM 级别来监视运行中的应用程序以及 Spark 工作负载的性能指标。每个运行的 SparkContext 都将启动一个 Web UI(Driver节点),默认情况下在端口 4040,它将列出应用程序的有用信息。如果你运行多个应用程序,他们将各自启动一个 Web UI,并累加端口号(4041,4042,...),集群管理器还会从它自己的用户界面链接到每个应用程序的 Web UI。

  • Jobs:对应Spark作业。
  • Stages:对应各个阶段(及其相关任务)。
  • Storage:包含当前在Spark应用程序中缓存的信息和数据。
  • Environment:包含有关Spark应用程序的配置等相关信息。
  • Executors:提供应用程序的每个执行器的详细信息。
  • SQL:对应我们提交的结构化API查询(包括SQL和DataFrame)。 若用户提交的不是Spark-SQL程序,则Web UI上不会显示此标签

Spark-UI查看运行中任务进展.png

配置Yarn日志聚合功能

默认情况下,各个Container日志存储于其所处的NodeManager上,开启Yarn日志聚合功能后,系统会在任务运行完成(不论成功与否)后将该任务所有的Container日志上传到HDFS上,减轻NodeManager负载,同时提供一个中央化的日志存储和分析机制。需要注意的一点是,Yarn仅提供原始的日志文件,用户可通过“yarn logs”命令获取相关日志文件,如何对日志进行解析甚至可视化要靠各个计算引擎,例如MapReduce和Spark都有各自的HistoryServer,

参数 说明 默认值
yarn.log-aggregation-enable 是否启用日志聚集功能,若不开启,则后面的参数无效 false
yarn.log-aggregation.retain-seconds 聚合后的日志在HDFS上保留时长,单位:秒 -1
yarn.log-aggregation.retain-check-interval-seconds 多长时间检查一次日志,并将满足条件(存储时长超过${yarn.log-aggregation.retain-seconds})的日志删除。若为0或负值,则为${yarn.log-aggregation.retain-seconds}的1/10 -1
yarn.nodemanager.remote-app-log-dir HDFS上用于存储聚合日志的根目录 /tmp/logs
yarn.nodemanager.remote-app-log-dir-suffix HDFS上用于存储聚合日志的子目录,任务日志最终存储的目录为${yarn.nodemanager.remote-app-log-dir}/${user}/${yarn.nodemanager.remote-app-log-dir-suffix} logs

其他相关参数

参数 说明 默认值
yarn.nodemanager.log-dirs 任务在NodeManager上的日志存储目录 ${yarn.log.dir}/userlogs
yarn.nodemanager.log.retain-seconds 日志文件保存在本地的时间,单位:秒。当${yarn.log-aggregation-enable}值为false时有效,若开启了日志聚合,则本地日志文件会在上传到HDFS后清除 10800
yarn.resourcemanager.max-completed-applications RM内存中保存的已完成任务个数上限,即Yarn的Web UI页面渲染的application个数上限(实际应用值为max(yarn.resourcemanager.max-completed-applications, yarn.resourcemanager.state-store.max-completed-applications))。一般建议保留2-3天的数据且不超过1w,数量太多会给RM带来太大的内存压力,最直观的表现是Web UI列表页面刷新缓慢 10000
yarn.resourcemanager.state-store.max-completed-applications stateStore中保存的已完成任务个数上限。Yarn默认使用zookeeper作为stateStore存储介质,因此此参数的值设置不能超过zk配置的节点数上限——ZooKeeper节点数据量限制引起的Hadoop YARN ResourceManager崩溃原因分析(二) $

配置Spark日志聚合功能/History Server

Spark History Server功能依赖于Yarn的日志聚合功能,它会去Yarn日志聚合功能所配置的HDFS目录读取任务的所有Container日志信息,包括Driver和Executor日志。除此之外,为了在Spark任务结束后能重构Web UI信息,需要记录任务运行中的Event日志信息。

应用端

参数 说明 默认值
spark.eventLog.enabled 是否记录Spark任务的Event信息,用于应用程序在完成后重构webUI,若为false则后续参数无效 false
spark.eventLog.dir 保存Event相关信息的路径,可以是hdfs://开头的HDFS路径,也可以是file://开头的本地路径,都需要提前创建。不加文件系统前缀的话默认为HDFS目录 file:///tmp/spark-events
spark.eventLog.compress 是否压缩记录Spark事件,前提spark.eventLog.enabled为true,默认使用的是snappy false
spark.yarn.preserve.staging.files 是否在作业结束时保留阶段性文件(Spark jar、app jar以及任何分布式缓存文件)而不是删除它们 false
spark.yarn.historyServer.address Spark history server的地址。 这个地址会在Spark应用程序完成后提交给YARN RM作为应用程序History的入口,然后RM将信息从RM UI写到history server UI上。
注意:hostname:port,前面不加http://,末尾也不要加反斜杠

HistoryServer

参数 说明 默认值
spark.history.ui.port History Server的默认访问端口 18080
spark.history.fs.logDirectory Event信息的存放路径,供History Server读取 file:/tmp/spark-events
spark.history.updateInterval 日志文件解析刷新时间间隔,单位:秒。每次刷新会检查日志文件的更新情况,更新任务状态(incomplete -> complete)、根据应用程序数量限制清除超限的任务信息 10
spark.history.retainedApplications 在History Server UI内存渲染中保留的最大应用程序数量,如果超过这个值,旧的应用程序信息将被从内存中清除。被清除的应用程序信息仍然可以从文件系统中重新加载 50
spark.history.ui.maxApplications History Server UI列表页中保留的最大应用程序数量,如果超过这个值,旧的应用程序信息将被从UI列表页清除。被清除的应用程序信息仍然可以通过详情页的URL直接访问,前提是文件系统中对应的日志文件未过期 Int.MaxValue
spark.history.fs.cleaner.enabled History Server是否从文件系统中清除过期的Event日志文件,若为false,则后续参数无效 false
spark.history.fs.cleaner.interval 清除过期Event日志文件的频率,定时清理保留时长超过${spark.history.fs.cleaner.maxAge}的文件 1d
spark.history.fs.cleaner.maxAge Event日志文件保留时间 7d

其他相关参数

参数 说明 默认值
spark.history.fs.numReplayThreads 重构Spark任务Web UI信息的线程数 可用core数的25%

其他问题

spark.eventLog.dir和spark.history.fs.logDirectory的区别

spark.eventLog.dir是Spark应用程序记录Spark Event日志的基本目录,spark.eventLog.enabled为true时,Spark会在此目录下为每个应用程序创建一个子目录,并在此目录中记录该应用程序的Event信息。支持多种文件系统,如file://前缀表示的本地文件系统,hdfs://前缀表示的HDFS系统等

spark.eventLog.dir是记录Spark事件的基本目录,如果spark.eventLog.enabled为true。 在此基本目录中,Spark为每个应用程序创建一个子目录,并在此目录中记录特定于应用程序的事件。 用户可能希望将其设置为统一位置,如HDFS目录,以便历史记录服务器可以读取历史记录文件。

spark.history.fs.logDirectory是存储Spark应用程序Event日志文件供Spark History Server访问的基本目录, 支持多种文件系统,如file://前缀表示的本地文件系统,hdfs://前缀表示的HDFS系统等

简单的说,spark.eventLog.dir用于应用端写Event信息,spark.history.fs.logDirectory用于Spark History Server读Event信息。通常建议给两者配置可供应用端和History Server端访问到的同一HDFS共享目录

附录

posted @ 2020-11-16 11:21  行道风语  阅读(1761)  评论(0编辑  收藏  举报