zoukankan      html  css  js  c++  java
  • spark日志配置及问题排查方式。

    此文已由作者岳猛授权网易云社区发布。


    欢迎访问网易云社区,了解更多网易技术产品运营经验。


    任何时候日志都是定位问题的关键,spark也不会例外,合适的配置和获取spark的driver,am,及executor日志将会提升问题定位的效率,这里初步整理了spark的一些配置,更好的日志配置还需要根据实际的情况。

    1)dirver日志的配置,可以通过spark.driver.extraJavaOptions设置加载log4j.properties文件的路径,如:

    spark.driver.extraJavaOptions        -Dlog4j.configuration=file:/home/hadoop/ym/spark-1.6.1-bin-hadoop2.6/conf/log4j.properties 

    具体log4j.properties参考:

    # Set everything to be logged to the console
    log4j.rootCategory=INFO, console,rolling
    log4j.appender.console=org.apache.log4j.ConsoleAppender
    log4j.appender.console.target=System.err
    log4j.appender.console.layout=org.apache.log4j.PatternLayout
    log4j.appender.console.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{1}: %m%n
    # Settings to quiet third party logs that are too verbose
    log4j.logger.org.spark-project.jetty=WARN
    log4j.logger.org.spark-project.jetty.util.component.AbstractLifeCycle=ERROR
    log4j.logger.org.apache.spark.repl.SparkIMain$exprTyper=INFO
    log4j.logger.org.apache.spark.repl.SparkILoop$SparkILoopInterpreter=INFO
    log4j.logger.org.apache.parquet=ERROR
    log4j.logger.parquet=ERROR
    # SPARK-9183: Settings to avoid annoying messages when looking up nonexistent UDFs in SparkSQL with Hive support
    log4j.logger.org.apache.hadoop.hive.metastore.RetryingHMSHandler=FATAL
    log4j.logger.org.apache.hadoop.hive.ql.exec.FunctionRegistry=ERROR
    log4j.appender.rolling=org.apache.log4j.RollingFileAppender
    log4j.appender.rolling.layout=org.apache.log4j.PatternLayout
    log4j.appender.rolling.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} - [%p] - [%l] %m%n
    log4j.appender.rolling.Append=true
    log4j.appender.rolling.Encoding=UTF-8
    log4j.appender.rolling.MaxBackupIndex=5
    log4j.appender.rolling.MaxFileSize=200MB
    log4j.appender.rolling.file=/home/hadoop/ym/logs/${spark.app.name}.driver.log
    log4j.logger.org.apache.spark=INFO
    log4j.logger.org.eclipse.jetty=WARN

    这样的配置可以使Application的日志以AppName.driver.log的形式存放于你指定的目录。

    2)executor的日志,可以通过spark.executor.extraJavaOptions设置加载log4j.properties文件的路径,如:

    spark.executor.extraJavaOptions     -Dlog4j.configuration=file:/home/hadoop/ym/spark-1.6.1-bin-hadoop2.6/conf/log4j-executor.properties

    具体log4j.properties参考:

    # Set everything to be logged to the console
    log4j.rootCategory=INFO,rolling
    log4j.appender.console=org.apache.log4j.ConsoleAppender
    log4j.appender.console.target=System.err
    log4j.appender.console.layout=org.apache.log4j.PatternLayout
    log4j.appender.console.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{1}: %m%n
    # Settings to quiet third party logs that are too verbose
    log4j.logger.org.spark-project.jetty=WARN
    log4j.logger.org.spark-project.jetty.util.component.AbstractLifeCycle=ERROR
    log4j.logger.org.apache.spark.repl.SparkIMain$exprTyper=INFO
    log4j.logger.org.apache.spark.repl.SparkILoop$SparkILoopInterpreter=INFO
    log4j.logger.org.apache.parquet=ERROR
    log4j.logger.parquet=ERROR
    # SPARK-9183: Settings to avoid annoying messages when looking up nonexistent UDFs in SparkSQL with Hive support
    log4j.logger.org.apache.hadoop.hive.metastore.RetryingHMSHandler=FATAL
    log4j.logger.org.apache.hadoop.hive.ql.exec.FunctionRegistry=ERROR
    log4j.appender.rolling=org.apache.log4j.RollingFileAppender
    log4j.appender.rolling.layout=org.apache.log4j.PatternLayout
    log4j.appender.rolling.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} - [%p] - [%l] %m%n
    log4j.appender.rolling.Append=true
    log4j.appender.rolling.Encoding=UTF-8
    log4j.appender.rolling.MaxBackupIndex=5
    log4j.appender.rolling.MaxFileSize=2MB
    log4j.appender.rolling.file=${spark.yarn.app.container.log.dir}/stdout
    log4j.logger.org.apache.spark=DEBUG
    log4j.logger.org.eclipse.jetty=WARN
    其中executor日志分为运行时日志以及结束日志,两种日志分别存放于不同的位置,运行时候的日志文件存放于yarn.nodemanager.log−dirs/{ApplicationID},如:
    <property>
       <name>yarn.nodemanager.log-dirs</name>
       <value>file:/mnt/ddb/2/hadoop/nm</value>
    </property>

    那么运行时候的executor日志存放于:

    root@xxx:/mnt/ddb/2/hadoop/nm/application_1471515078641_0007# ls

    container_1471515078641_0007_01_000001  container_1471515078641_0007_01_000002  container_1471515078641_0007_01_000003

    其中container_1471515078641_0007_01_000001为RM为application_1471515078641_0007分配的第一个container,即AM所在的container,第一个container都是运来启动AM的,containerID形式为,container_APPID_01_000001,你在RM日志文件里面根据container_APPID搜索即可看到为该APPID分配的container的分布情况及生命周期。

    运行结束以后日志会聚合到HDFS上面去,具体路径为/tmp/logs/${user}/logs,如:

    drwxrwx---   - root supergroup          0 2016-08-18 18:29 /tmp/logs/root/logs/application_1471515078641_0002

    drwxrwx---   - root supergroup          0 2016-08-18 19:10 /tmp/logs/root/logs/application_1471515078641_0003

    drwxrwx---   - root supergroup          0 2016-08-18 19:17 /tmp/logs/root/logs/application_1471515078641_0004

    3)am的日志配置,可以通过spark.yarn.am.extraJavaOptions设置加载log4j.properties文件的路径,如:

    spark.yarn.am.extraJavaOptions     -Dlog4j.configuration=file:/home/hadoop/ym/spark-1.6.1-bin-hadoop2.6/conf/log4j-executor.properties

    因为am和executor都是运行在container里面,具体log4j.properties可以参考executor的,这里不再多说。

    补充一些:

    下面重点说下,遇见spark问题该怎么去排查日志,都排查哪些日志,spark的运行流程可以参考http://ks.netease.com/blog?id=5174,这这边每个过程都代表着不同的日志文件。

    一,SC初始化的过程中出现问题的排查方式

    1)driver提交到RM的时候,如果提交不上去,首先排查driver日志,其次根据APPID排查RM日志看下APP生命周期

    2)RM启动AM的过程出现问题,首先排查RM日志看为APP分配的第一个container下发到哪个NM上面去了,到对应的NM上面去根据containerID查看其生命周期哪里出现问题了

    3)AM启动了,向RM申请container的过程出现了问题,首先查看am的日志,即第一个container的日志,排查下都申请了哪些container,这些container都下发了哪些节点,然后到对应节点的NM日志上根据containerID查看其生命周期情况

    4)executor启动了,无法注册到driver,这时候就要去查看对应的executor的日志

    二,SC.action以后的问题排查

    1)首先在driver日志里面去查看都有哪些job,哪些job failed了,然后找到failed的job,查看该job都有哪些stage,然后排查下那个stage失败了,然后去查看该stage都有哪些task,哪个task失败了,找到失败的task下发的executor,然后去这个executor日志上,根据task id排查这个task的生命周期。

    2)如果是executorLost的,除了要看这个executor的日志外,还要看这个container所在的nm日志,看下根据containerID看下器生命周期

    3)如果是写HDFS上出现问题了,首先排查nm日志,根据nm日志去排查出现问题的datanode日志。

    中间有些由于自己理解的不事很好,可能存在问题,请见谅。

    最后说一点,排查问题是学习的最好方式,排查完之后能深入了的明白原理,问题处理的越多,学习也就越快,每个人都是从一头雾水走过来。


    免费体验云安全(易盾)内容安全、验证码等服务


    更多网易技术、产品、运营经验分享请点击




    相关文章:
    【推荐】 如何玩转基于风险的测试
    【推荐】 InnoDB recovery过程解析

  • 相关阅读:
    94. Binary Tree Inorder Traversal
    101. Symmetric Tree
    38. Count and Say
    28. Implement strStr()
    实训团队心得(1)
    探索性测试入门
    LC.278. First Bad Version
    Search in Unknown Sized Sorted Array
    LC.88. Merge Sorted Array
    LC.283.Move Zeroes
  • 原文地址:https://www.cnblogs.com/163yun/p/9882530.html
Copyright © 2011-2022 走看看