spark2.4.3变化、编译过程以及异常处理

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. 版本说明

toolsversion
java1.8
scala2.11.x
maven3.6.1
spark2.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
      

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"
      
  • 最后编译成功后,还会执行一段脚本将中间过程产生的文件删除,以及编译成功的文件打包。spark各项编译是否成功,编译耗时需要向前看看日志。
    在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值