一、内存问题
1、旧集群
spark 1.6.1
jdk 1.7 或 1.8
jvm 堆内存分配,直接分配的为driver申请的内存(最大、最小堆内存相等)
2、新集群
spark 2.4.1
jdk 1.8
jvm 堆内存分配,刚开始分比较小的内存,当内存不够时,增加内存(主要是老年代内存),新生代内存也有增长,但是比较小(280M-556M),
问题分析:
查看spark 源码:org.apache.spark.launcher.Main发现如下问题:
Spark 2.4 分配的jvm 堆的大小时,未分配
Spark 2.3 分配的jvm 堆的大小时,只分配cmd.add("-Xmx" + memory);未分配最小堆内存
Spark 1.6 分配的jvm 堆的大小时,cmd.add("-Xmx" + memory);cmd.add("-Xms" + memory);
问题解决:2.3
1、添加配置:--conf spark.driver.extraJavaOptions="-Xms55G” \
2、修改spark-class的cmd构建出的最小堆内存:CMD=("${CMD[@]}" "-Xms55G"
while IFS= read -d '' -r ARG; do
# echo "*****$ARG*****"
# CMD+=("$ARG")
if [ "$ARG" = "-cp" ]; then
CMD=("${CMD[@]}" "-Xms55G")
echo ${CMD[@]}
fi
CMD+=("$ARG")
done < <(build_command "$@")
问题解决:2.4
--conf spark.driver.extraJavaOptions="-Xms32G” \
--conf spark.driver.extraJavaOptions="-Xmx128G” \
二、日志级别设置
1、spark 1.6.1-日志级别设置
Logger.getLogger("org").setLevel(Level.WARN)
2、spark 2.4.1-日志级别设置
a、步骤1的设置,只在driver端生效,executor端无效,默认日志级别为INFO
b、设置executor端日志级别为WARN
1)从 $SPARK_HOME/conf copy log4j.properties.template 到指定目录,并修改名称为 log4j.properties,这里的指定目录为当前应用程序jar包所在目录下的conf文件夹
2)添加如下配置信息
--conf spark.executor.extraJavaOptions="-Dlog4j.configuration=log4j.properties" \
--files conf/metrics.properties,conf/log4j.properties \
第二种方式:
1、屏蔽系统日志
/请注意是apache.log4j不是org.slf4j
import org.apache.log4j.{Level, Logger}
// 屏蔽不必要的日志 ,在终端上显示需要的日志
Logger.getLogger("org.apache.spark").setLevel(Level.OFF)
Logger.getLogger("org.eclipse.jetty.server").setLevel(Level.OFF)
Logger.getLogger("org.apache.kafka.clients.consumer").setLevel(Level.OFF)
2、屏蔽 sparkContext 的日志
sparkContext.setLogLevel("WARN")