spark-client模式下,设置spark的日志级别

搭建spark on yarn 的环境支持两种模式
1)yarn-cluster:适用于生产环境;
2)yarn-client:适用于交互、调试,希望立即看到app的输出

由于自己遇到的是yarn-client 模式下的问题,记录一下
首先下说明一下,spark-client的Yarn-client模式下作业执行流程:
Yarn-client模式下作业执行流程

  1. 客户端生成作业信息提交给ResourceManager(RM)
  2. RM在本地NodeManager启动container并将Application Master(AM)分配给该NodeManager(NM)
  3. NM接收到RM的分配,启动Application Master并初始化作业,此时这个NM就称为Driver
  4. Application向RM申请资源,分配资源同时通知其他NodeManager启动相应的Executor
  5. Executor向本地启动的Application Master注册汇报并完成相应的任务
    Yarn-client
    在Yarn-client中,Application Master仅仅从Yarn中申请资源给Executor,之后client会跟container通信进行作业的调度,下图是Yarn-client模式
    spark-client模式下,设置spark的日志级别_第1张图片
    由此图可以看出,spark在client模式下启动后,application中的Driver(驱动程序)是运行在本地的,Application中的Executor
    是在yarn中的container中运行。
    接下来说的是spark的日志设置
    spark的conf目录中有个log.properties.template文件,修改为log.properties然后放在项目的路径下,
# Set everything to be logged to the console
log4j.rootCategory=WARN,console,DAILY  #默认是Info级别的,可以根据自己的情况进行设置,也可以自定义(DAILY )自己的输出文件及格式
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

# 自定义
log4j.appender.DAILY = org.apache.log4j.DailyRollingFileAppender
log4j.appender.DAILY.File=./logs/SPARK_LOG.log
log4j.appender.DAILY.DatePattern = '.'yyyy-MM-dd
log4j.appender.DAILY.Append = true
## 只输出WARN级别以上的日志
log4j.appender.DAILY.Threshold = WARN
log4j.appender.DAILY.layout=org.apache.log4j.PatternLayout
log4j.appender.DAILY.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{1}: %m%n

# Set the default spark-shell log level to WARN. When running the spark-shell, the
# log level for this class is used to overwrite the root logger's log level, so that
# the user can have different defaults for the shell and regular Spark apps.
log4j.logger.org.apache.spark.repl.Main=WARN //默认是Info级别,根据情况配置

# 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

配置完后,创建启动脚本,也可以不创建

#!/bin/bash
#工程地址
ProjectPath=
#基本参数3(必填) 业务ID--与数据表名匹配
ProjectID=应用程序名(Application)
#基本参数4(必填) Spark jar名称
SparkJar=${ProjectPath}/项目打包的jar,根据maven中配置,
#基本参数5(必填) Spark Class Name
SparkClass=类的全路径,和spark启动命令一样
SparkClass=com.xx.xxx..xxxx

#基本参数7(必填) 程序配置参数文件
ProjectPropFile=${ProjectPath}/配置文件(xxx.properties)

#基本参数8(必填)  executor配置参数文件
ExecutorPropFile=${ProjectPath}/log4j_executor.properties
#系统参数1(开启Debug日志时候需要)
KRB_DEBUG_OPTS="-Dlog4j.logger.org.apache.spark.deploy.yarn.Client=DEBUG \
-Dlog4j.logger.org.apache.hadoop.hbase.zookeeper.RecoverableZooKeeper=DEBUG \
-Dlog4j.logger.org.apache.hadoop.hbase.client.ConnectionManager$HConnectionImplementation=DEBUG \
-Dlog4j.logger.org.apache.hadoop.hbase.spark.HBaseContext=DEBUG -Dsun.security.krb5.debug=true \
-Djava.security.debug=gssloginconfig,configfile,configparser,logincontext"

export SPARK_KAFKA_VERSION=0.10
#删除日志文件
rm ${ProjectPath}/${ProjectID}.log
#Spark运行命令字符串
cmd1="nohup spark-submit --master yarn \    #master 的地址,提交任务到哪里执行,例如 spark://host:port,  yarn,  local
--deploy-mode client \   #在本地 (client) 启动 driver 或在 cluster 上启动,默认是 client
--class ${SparkClass} \ #类   应用程序的主类,仅针对 java 或 scala 应用
--jars ${ExteralJars} \  #jar包   用逗号分隔的本地 jar 包,设置后,这些 jar 将包含在 driver 和 executor 的 classpath 下
--executor-memory 4G \ #  每个 executor 的内存,默认是1G
--executor-cores 2 \ #每个 executor 的核数。在yarn或者standalone下使用
--num-executors 1 \ #启动的 executor 数量。默认为2。在 yarn 下使用
--driver-cores 1 \ # Driver 的核数,默认是1。在 yarn 或者 standalone 下使用
--files ${ProjectPropFile},${ExecutorPropFile} \   #导入外部配置文件,中间用逗号(,)分割,不能有空格
--conf \"spark.driver.extraJavaOptions=-Dlog4j.configuration=file:${ProjectPath}/log4j.properties\" \  #driver运行后加载的,日志级别
--conf spark.executor.extraJavaOptions=\"-Dlog4j.configuration=log4j_executor.properties\" "    #executor 运行后加载的,日志级别,这个设置后可以在spark UI页面中查看 !

spark-client模式下,设置spark的日志级别_第2张图片
spark-client模式下,设置spark的日志级别_第3张图片

你可能感兴趣的:(spark)