spark编译

背景

  通常来讲,spark的使用离不开hadoop生态,在spark的官网中已经有针对hadoop通用版本(比如2.6、2.7)的预编译版本。但是在实际生产环境中使用的hadoop一般是cdh或hdp,与spark预编译版本可能会有兼容性的问题,所以要编译针对特定hadoop版本的spark。

版本

  • hadoop:2.6.0-cdh5.4.7
  • spark:2.3.1

maven 编译

前提条件

1.maven版本在3.3.9以上并且jdk在1.8以上
2.设置MAVEN_OPTS,以便在编译时可以用更多的内存空间

  export MAVEN_OPTS="-Xmx2g -XX:ReservedCodeCacheSize=512m"

了解pom文件

在编译之前我们首先了解一下spark源码中的pom文件,首先在<properties/>中提供了编译spark时各组件的默认版本:
《spark编译》

如图所示,编译spark时默认的hadoop版本是2.6.5,编译时可以通过-D的方式指定组件版本。

其次,在<profiles/>中提供了编译时的可选项:
《spark编译》 比如编译的spark要支持yarn,可以在编译时用-Pyarn来指定。

编译

mvn -Pyarn -Phive -Phadoop-2.6 -Dhadoop.version=2.6.0-cdh5.4.7  -Phive-thriftserver -DskipTests clean package

上述命令编译的spark支持yarn、hive、hadoop2.6,同时指定了hadoop的版本。

编译可运行的spark包

在spark的源码的dev目录下提供了一个名叫make-distribution.sh的脚本来编译一个可运行的spark包,具体用法如下:

./dev/make-distribution.sh --name 2.6.0-cdh5.4.7 --tgz -Phadoop-2.6 -Phive -Phive-thriftserver -Pyarn -Dhadoop.version=2.6.0-cdh5.4.7

该脚本实际用的是上面介绍的mvn编译,具体用法可以通过执行./dev/make-distribution.sh –help来查看。

在执行该脚本时要指定–name,它是编译后包名的一部分:
《spark编译》

编译时遇到的问题

问题一:

[ERROR] Failed to execute goal on project spark-launcher_2.11: Could not resolve dependencies for project org.apache.spark:spark-launcher_2.11:jar:2.3.1: Could not find artifact org.apache.hadoop:hadoop-client:jar:2.6.0-cdh5.4.7 in central (https://repo.maven.apache.org/maven2) -> [Help 1]

解决:这是由于编译时找不到hadoop对应的maven库,只要在spark的pom文件中加入cdh的maven仓库即可

<repositories>
    <repository>
      <id>cloudera</id>
      <url>https://repository.cloudera.com/artifactory/cloudera-repos/</url>
    </repository>
</repositories>
    原文作者:风起云端
    原文地址: https://www.jianshu.com/p/d9e7d8b97e6d
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞