spark2.4.3发布于2019.05.07
发布日志
- spark2.4.3版本是一个维护性版本,在稳定性上做了修正。该版本是基于2.4分支的maintenance分支进行的开发,官方强烈推荐2.4用户升级到该版本。
- spark2.4.3将scala的默认版本从scala2.12换成了2.11,scala2.11也是之前2.x版本使用的默认scala版本,不过只有2.4.2的使用了scala2.12。这意味着,2.4.3预编译的二进制文件是用scala2.11编译的。spark仍然是在maven center中使用scala2.11和scala2.12交叉发布。源码可以使用scala2.12进行编译。
changelog
- [SPARK-27494]: It fixes a correctness bug in Kafka source v2, when
processing NULL in the key value.
[SPARK-27494]
- Affects Version:2.4.1
- Fix Version:2.4.3
- Bug:Kafka source v2无法支持null key或者null value。在处理到null key的时候,之后的相同partition里的key都会变成null;处理null value的时候,会抛出空指针异常
- Workaround:设置sql conf,将"spark.sql.streaming.disabledV2MicroBatchReaders"改成 "org.apache.spark.sql.kafka010.KafkaSourceProvider"来使用v1的source
Compile Spark2.4.3
Precompile
1. 版本说明
tools | version |
---|---|
java | 1.8 |
scala | 2.11.x |
maven | 3.6.1 |
spark | 2.4.3 |
2. 环境变量修改
- vim /etc/profile
# 添加maven环境变量
export MAVEN_HOME=/usr/local/apache-maven-3.6.1
# 添加java环境变量,我有1.7和1.8版本在切换,要使用的版本改为active
export JAVA_HOME=/usr/local/jdk.active
# 添加scala环境变量
export SCALA_HOME=/usr/local/scala-2.11.8
# 修改path
export PATH=$MAVEN_HOME/bin:$JAVA_HOME/bin:$SCALA_HOME/bin:$PATH
3. 修改mvn的镜像
- vim $MAVEN_HOME/conf/settings.xml
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
<!--一般添加上面的就可以了,我多添加了下面这个-->
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://central.maven.org/maven2</url>
<mirrorOf>central</mirrorOf>
</mirror>
...
<!--这里我将本地repos放在$MAVEN_HOME下-->
<localRepository>/usr/local/apache-maven-3.6.1/repo</localRepository>
DoCompile
最关键的是参照http://spark.apache.org/docs/latest/building-spark.html进行选项配置
1. 如果需要编译CDH的spark,需要添加相应的repository
vim /usr/local/spark-2.4.3/pom.xml
<!-- This should be at top, it makes maven try the central repo first and then others and hence faster dep resolution-->
<repository>
<id>central</id>
<name>Maven Repository</name>
<url>https://repo.maven.apache.org/maven2</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
<!--注意上面的注释,上面的repository需要放在<repositories></repositories>中的第一个,所以将cloudera的repos放在后面-->
<repository>
<id>cloudera</id>
<url>https://repository.cloudera.com/artifactory/cloudera-repos/</url>
</repository>
2. 为了加快编译速度,需要修改启动编译脚本
vim spark-2.4.3/dev/make-distribution.sh
"""添加以下部分"""
VERSION=2.4.3
SCALA_VERSION=2.11
SPARK_HADOOP_VERSION=2.6.0-cdh5.7.0
SPARK_HIVE=1
"""注释掉以下部分,该部分为了获取版本号将会占用大量时间"""
#VERSION=$("$MVN" help:evaluate -Dexpression=project.version $@ 2>/dev/null\
# | grep -v "INFO"\
# | grep -v "WARNING"\
# | tail -n 1)
#SCALA_VERSION=$("$MVN" help:evaluate -Dexpression=scala.binary.version $@ 2>/dev/null\
# | grep -v "INFO"\
# | grep -v "WARNING"\
# | tail -n 1)
#SPARK_HADOOP_VERSION=$("$MVN" help:evaluate -Dexpression=hadoop.version $@ 2>/dev/null\
# | grep -v "INFO"\
# | grep -v "WARNING"\
# | tail -n 1)
#SPARK_HIVE=$("$MVN" help:evaluate -Dexpression=project.activeProfiles -pl sql/hive $@ 2>/dev/null\
# | grep -v "INFO"\
# | grep -v "WARNING"\
# | fgrep --count "<id>hive</id>";\
# # Reset exit status to 0, otherwise the script stops here if the last grep finds nothing\
# # because we use "set -o pipefail"
# echo -n)
4. 给MAVEN设置更多内存(参照官网)
# 可以写在/etc/profile里,也可以直接命令行执行,区别在于后者只针对当前session
# 如果是虚拟机,分配给虚拟机的内存相应调大
export MAVEN_OPTS="-Xmx2g -XX:ReservedCodeCacheSize=512m"
4. 执行编译脚本
"""
位于spark-2.4.3目录下执行
这里与官网给的配置项有所不同,
删除了一些我自己不需要的功能,
同时也指定了hadoop的版本以及cdh的版本
"""
./dev/make-distribution.sh --name 2.6.0-cdh5.7.0 --tgz -Phadoop-2.6 -Phive -Phive-thriftserver -Pyarn -Pkubernetes -Dhadoop.version=2.6.0-cdh5.7.0
Troubleshoot Issues
1. Remote host closed connection during handshake: SSL peer shut down incorrectly
- Workaround: 这是网络连接不稳定造成的,解决方法很简单,再编一次。。
2. scala-maven-plugin:3.2.2:compile failed
- [ERROR] Failed to execute goal net.alchim31.maven:scala-maven-plugin:3.2.2:compile (scala-compile-first) on project spark-core_2.11: Execution scala-compile-first of goal net.alchim31.maven:scala-maven-plugin:3.2.2:compile failed.: CompileFailed -> [Help 1]
- Workaround: 这个问题实际上是导致spark编译失败的最主要问题,不仅spark-core会出错,spark-streaming,spark SQL等等都会在这个地方出现错误。一般需要修改以下几个东西
- a. 根据scala-maven-plugin后面跟着的版本号,添加相应依赖
<!--spark-2.4.3/pom.xml--> <dependency> <groupId>net.alchim31.maven</groupId> <artifactId>scala-maven-plugin</artifactId> <version>3.2.2</version> </dependency>
- b. 关闭ZincServer的加速编译功能
<!--spark-2.4.3/pom.xml--> <useZincServer>false</useZincServer>
- c. 杀死所有后端java进程以及hadoop进程以及zincserver进程
p.s. 杀死之前请慎重考虑是否会影响到业务正常运行,或是使用干净的编译机进行编译jps | awk '{print $1}' | xargs kill -9 ps aux | grep -i hadoop | awk '{print $2}' | xargs kill -9 ps aux | grep -i zinc | awk '{print $2}' | xargs kill -9
- a. 根据scala-maven-plugin后面跟着的版本号,添加相应依赖
3. "${MVN_BIN}" -DzincPort=${ZINC_PORT} "$@" killed
-
Workaround: 这个问题有可能在关闭ZincServer加速后还会出现,需要两步处理
- a. 确保zinc的端口没有占用
# 清理掉对应进程 netstat -nltp | grep 3030
- b. 将spark自带的maven替换成我们自己准备好的maven
vim spark-2.4.3/dev/make-distribution.sh# 将 # MVN="$SPARK_HOME/bin/mvn" # 改为 MVN="${MAVEN_HOME}/bin/mvn"
- a. 确保zinc的端口没有占用
-
最后编译成功后,还会执行一段脚本将中间过程产生的文件删除,以及编译成功的文件打包。spark各项编译是否成功,编译耗时需要向前看看日志。