收集到的所有方法都有例子
简介
实际上,有很多方法可以做到这一点。
有些比其他的更难,但由你决定哪一个最适合你。我会尽量展示它们。
#1 以编程方式在您的应用中
似乎是最简单的,但您需要重新编译您的应用程序才能更改这些设置。就个人而言,我不喜欢它,但它工作正常。
示例:
import org.apache.log4j.{Level, Logger}
val rootLogger = Logger.getRootLogger()
rootLogger.setLevel(Level.ERROR)
Logger.getLogger("org.apache.spark").setLevel(Level.WARN)
Logger.getLogger("org.spark-project").setLevel(Level.WARN)
您可以使用log4j API 实现更多目标。
来源:[Log4J Configuration Docs,配置部分]
#2 在spark-submit 期间通过log4j.properties
这是一个非常棘手的问题,但并非不可能。还有我最喜欢的。
在应用启动期间,Log4J 总是从类路径中寻找并加载 log4j.properties 文件。
但是,当使用spark-submit Spark Cluster 的类路径优先于应用程序的类路径!这就是为什么将此文件放入您的 fat-jar 中不会覆盖集群设置的原因!
将-Dlog4j.configuration=<location of configuration file> 添加到
spark.driver.extraJavaOptions(驱动程序)或
spark.executor.extraJavaOptions(执行器)。
请注意,如果使用
文件,应明确提供file: 协议,和文件
需要在所有节点上本地存在。
要满足最后一个条件,您可以将文件上传到节点可用的位置(如hdfs),或者如果使用deploy-mode client,则使用驱动程序在本地访问它。否则:
使用 spark-submit 上传自定义 log4j.properties,将其添加到
--files 与应用程序一起上传的文件列表。
来源:Spark docs, Debugging
步骤:
例如log4j.properties:
# Blacklist all to warn level
log4j.rootCategory=WARN, console
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
# Whitelist our app to info :)
log4j.logger.com.github.atais=INFO
执行spark-submit,集群模式:
spark-submit \
--master yarn \
--deploy-mode cluster \
--conf "spark.driver.extraJavaOptions=-Dlog4j.configuration=file:log4j.properties" \
--conf "spark.executor.extraJavaOptions=-Dlog4j.configuration=file:log4j.properties" \
--files "/absolute/path/to/your/log4j.properties" \
--class com.github.atais.Main \
"SparkApp.jar"
请注意,如果使用client 模式,则必须使用--driver-java-options。 Spark docs, Runtime env
执行spark-submit,用于客户端模式:
spark-submit \
--master yarn \
--deploy-mode client \
--driver-java-options "-Dlog4j.configuration=file:/absolute/path/to/your/log4j.properties" \
--conf "spark.executor.extraJavaOptions=-Dlog4j.configuration=file:log4j.properties" \
--files "/absolute/path/to/your/log4j.properties" \
--class com.github.atais.Main \
"SparkApp.jar"
注意事项:
- 使用
--files 上传到spark-cluster 的文件将在根目录下可用,因此无需在file:log4j.properties 中添加任何路径。
-
--files 中列出的文件必须提供绝对路径!
-
配置 URI 中的
file: 前缀是必需的。
#3 编辑集群的conf/log4j.properties
这会更改全局日志记录配置文件。
更新$SPARK_CONF_DIR/log4j.properties 文件,它将是
与其他配置一起自动上传。
来源:Spark docs, Debugging
要找到您的SPARK_CONF_DIR,您可以使用spark-shell:
atais@cluster:~$ spark-shell
Welcome to
____ __
/ __/__ ___ _____/ /__
_\ \/ _ \/ _ `/ __/ '_/
/___/ .__/\_,_/_/ /_/\_\ version 2.1.1
/_/
scala> System.getenv("SPARK_CONF_DIR")
res0: String = /var/lib/spark/latest/conf
现在只需编辑 /var/lib/spark/latest/conf/log4j.properties(以方法 #2 中的示例为例),您的所有应用都会共享此配置。
#4 覆盖配置目录
如果您喜欢解决方案 #3,但想为每个应用程序自定义它,您实际上可以复制 conf 文件夹,编辑其内容并在 spark-submit 期间指定为根配置。
要指定默认“SPARK_HOME/conf”以外的其他配置目录,您可以设置SPARK_CONF_DIR。 Spark 将使用此目录中的配置文件(spark-defaults.conf、spark-env.sh、log4j.properties、等)。
来源:Spark docs, Configuration
步骤:
-
复制集群的conf 文件夹(更多信息,方法#3)
-
在该文件夹中编辑log4j.properties(方法#2 中的示例)
-
在执行spark-submit之前,将SPARK_CONF_DIR设置为该文件夹,
示例:
export SPARK_CONF_DIR=/absolute/path/to/custom/conf
spark-submit \
--master yarn \
--deploy-mode cluster \
--class com.github.atais.Main \
"SparkApp.jar"
结论
我不确定是否还有其他方法,但我希望这涵盖了从头到尾的主题。如果没有,请随时在 cmets 中联系我!
尽情享受吧!