• 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过程解析

  • 相关阅读:
    golang匿名变量
    golang实现九九乘法表
    bootstrap输入框从数据库读取数据
    celery 使用multiprocessing 问题记录
    django 使用jquery ajax post数据问题
    centos 7 epel地址
    python 2.6升级到2.7
    python给多个发送邮件附件,参考于《python自动化运维》
    nginx+webpy 出现 upstream timed out
    webpy + nginx + fastcgi 构建python应用
  • 原文地址:https://www.cnblogs.com/163yun/p/9882530.html
Copyright © 2020-2023  润新知