Spark日志排查指南
Spark日志排查指南
本文基于Spark2.1.0版本整理,采用Yarn作为集群管理器
Spark 程序的日志根据 spark 程序所在的阶段需要去不同的地方查看
- 程序运行过程中,可以通过程序本身的Web UI查看运行时日志。(PS: Spark的Web UI信息是任务运行过程中记录在内存中的详细记录,任务执行完毕后无法再通过原来的URL查看)
- 程序运行结束后,若开启了Yarn 和 Spark的日志聚合功能,日志会被聚合上传到对应的HDFS目录,可以通过Spark History Server提供的Web UI页面查看,否则只能[在对应的NodeManager下查看Container日志]。(PS:日志文件聚合以及History Server解析日志需要时间,所以在Spark任务结束后无法立即在History Server的UI页面看到)
- 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命令下载聚合后的日志文件
- 如果知道日志具体存储的HDFS目录(通常为${yarn.nodemanager.remote-app-log-dir}/${user}/${yarn.nodemanager.remote-app-log-dir-suffix}/application_${appid},可以通过hdfs -dfs get 命令直接获取日志文件
- 通过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上不会显示此标签
配置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共享目录
附录
- Spark2.1.0 Web UI官方应用文档——Monitoring and Instrumentation
- spark深入:配置文件与日志
- Spark 查看某个正在执行的或已结束的任务中executor与driver日志