maven 对spark 源码进行编译(基于Centos 7 )


maven 对spark 源码进行编译( 基于Centos 7


1 、写在前面的话

    有些小伙伴可能会问:Spark官网不是已经提供了Spark针对不同版本的安装包了吗,我们为什么还需要对Spark源码进行编译呢?针对这个问题我们到Spark官网: spark.apache.org来看下,如下图所示:


    Spark官网的确是提供了一些Hadoop版本的Spark安装包,但是提供的这些是否能够满足我们的要求呢?答案肯定是否定的,根据本人近几年做Spark的开发经验,列出如下几点:
        (1)在生产环境中Hadoop的选型,很大部分都是CDH或者HDP系列的,那么官方提供的这几个Hadoop系列是否能够生产的需求?
        (2)在开发过程中,我们经常会遇到需要对Spark的源码进行修改,那么修改后的代码如何集成到Spark安装包中去呢?
    针对如上列出的两点的个人觉得比较好的最佳实践:根据生产上运行的Hadoop版本编译出Spark的安装包,修改Spark源码之后,重新编译Spark
    所以:个人觉得如果想更好的学习和使用Spark,那么第一步就是要会根据Spark源码编译出安装包。

2 、前置准备

    根据Spark官方文档编译模块的介绍( http://spark.apache.org/docs/2.1.0/building-spark.html)的介绍:
The Maven-based build is the build of reference for Apache Spark. Building Spark using Maven requires Maven 3.3.9 or newer and Java 7+. Note that support for Java 7 is deprecated as of Spark 2.0.0 and may be removed in Spark 2.2.0.”
我们得知:
   (1)Java需要7+版本,而且在Spark2.0.0之后Java 7已经被标识成deprecated了,但是不影响使用,但是在Spark2.2.0版本之后Java 7的支持将会被移除;
   (2)Maven需要3.3.9+版本。
 
3、 Spark-2.1.0源码下载

        (1)下载地址:http://spark.apache.org/downloads.html



    (2)下载完成后解压即可,解压后的目录结构如下图所示



   注意1: mvn编译命令:
                 注意:如果使用cdh 编译,那么需要在pom.xml 中配置红色文字引用:

< repositories >
  <repository>
     <id>central</id>
      <!-- This should be at top, it makes maven try the central repo first and then others and hence faster dep resolution -->
      <name>Maven Repository</name>
      <url> https://repo1.maven.org/maven2 </url>
      <releases>
        <enabled>true</enabled>
      </releases>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
    </repository>
     <repository>
          <id>cloudera</id>
          <url>https:// repository. cloudera.com/artifactory/cloudera-repos/ </url>
     </repository>
</ repositories >
  注意2: maven环境内存要符合条件。如果用maven进行编译需要先设置 maven内存(如果用 make-distribution.sh ,则在这个脚本中进行修改 ):
            export MAVEN_OPTS="-Xmx2g -XX:ReservedCodeCacheSize=512m"  

   注意3:如果scala 版本为2.10 ,需要进行 ./dev/ change-scala-version.sh 2.10
  我的版本为2.11.8,我执行了这个命令   ./dev/change-scala-version.sh 2.11   

  注意4:
                

4、Spark源码编译

    我们可以使用Spark源码目录中的dev下的make-distribution.sh脚本,官方提供的编译命令如下:
         ./dev/make-distribution.sh --name custom-spark --tgz -Psparkr -Phadoop-2.4 -Phive -Phive-thriftserver -Pmesos -Pyarn
    参数说明:
        --name:指定编译完成后Spark安装包的名字
        --tgz:以tgz的方式进行压缩
        -Psparkr:编译出来的Spark支持R语言
        -Phadoop-2.4:以hadoop-2.4的profile进行编译,具体的profile可以看出源码根目录中的pom.xml中查看
        -Phive和-Phive-thriftserver:编译出来的Spark支持对Hive的操作
        -Pmesos:编译出来的Spark支持运行在Mesos上
        -Pyarn:编译出来的Spark支持运行在YARN上

        那么我们可以根据具体的条件来编译Spark,比如我们使用的Hadoop版本是2.6.0-cdh5.7.0,并且我们需要将Spark运行在YARN上、支持对Hive的操作,那么我们的Spark源码编译脚本就是:
              ./dev/make-distribution.sh --name 2.6.0-cdh5.7.0 --tgz -Pyarn -Phadoop-2.6 -Phive -Phive-thriftserver -Dhadoop.version=2.6.0-cdh5.7.0    -U

    编译成功后,在Spark源码的根目录中就spark-2.1.0-bin-2.6.0-cdh5.7.0.tgz包,那么我们就可以使用编译出来的这个安装包来进行Spark的安装了。
有小伙伴可能会问,为什么编译出来的安装包的名称是spark-2.1.0-bin-2.6.0-cdh5.7.0.tgz呢?我们可以带着这个疑惑,查看make-distribution.sh的源码,在该脚本的最后部分,有如下代码:

   if [ "$MAKE_TGZ" == "true" ]; then
        TARDIR_NAME=spark-$VERSION-bin-$NAME
        TARDIR="$SPARK_HOME/$TARDIR_NAME"
        rm -rf "$TARDIR"
        cp -r "$DISTDIR" "$TARDIR"
        tar czf "spark-$VERSION-bin-$NAME.tgz" -C "$SPARK_HOME" "$TARDIR_NAME"
        rm -rf "$TARDIR"fi

    该VERSION就是我们Spark的版本即2.1.0,NAME就是我们在编译时指定的2.6.0-cdh5.7.0,所以根据该脚本最终输出的Spark安装包的全称为: spark-2.1.0-bin-2.6.0-cdh5.7.0.tgz。通过该代码的查看希望大家能明白一个问题:源码面前,了无秘密。
    注意:在编译过程中会出现下载某个依赖包的时间太久,这是由于网络问题,可以执行ctrl+c停止编译命令,然后重新运行编译命令,在编译过程中多试几次即可。有条件的小伙伴,建议开着VPN然后再进行编译,整个编译过程会顺畅很多。


错误纠正:
(1)错误1:

[INFO] Reactor Summary:
[INFO]
[INFO] Spark Project Parent POM 2.1.0 ..................... SUCCESS [ 48.209 s]
[INFO] Spark Project Tags ................................. SUCCESS [01:06 min]
[INFO] Spark Project Sketch ............................... SUCCESS [01:00 min]
[INFO] Spark Project Networking ........................... SUCCESS [02:14 min]
[INFO] Spark Project Shuffle Streaming Service ............ SKIPPED
[INFO] Spark Project Unsafe ............................... SUCCESS [01:47 min]
[INFO] Spark Project Launcher ............................. SUCCESS [02:16 min]
[INFO] Spark Project Core ................................. SKIPPED
[INFO] Spark Project ML Local Library .................... . FAILURE [01:31 min]
[INFO] Spark Project GraphX ............................... SKIPPED
[INFO] Spark Project Streaming ............................ SKIPPED
[INFO] Spark Project Catalyst ............................. SKIPPED
[INFO] Spark Project SQL .................................. SKIPPED
[INFO] Spark Project ML Library ........................... SKIPPED
[INFO] Spark Project Tools ................................ SUCCESS [ 36.592 s]
[INFO] Spark Project Hive ................................. SKIPPED
[INFO] Spark Project REPL ................................. SKIPPED
[INFO] Spark Project YARN Shuffle Service ................. SKIPPED
[INFO] Spark Project YARN ................................. SKIPPED
[INFO] Spark Project Hive Thrift Server ................... SKIPPED
[INFO] Spark Project Assembly ............................. SKIPPED
[INFO] Spark Project External Flume Sink .................. SKIPPED
[INFO] Spark Project External Flume ....................... SKIPPED
[INFO] Spark Project External Flume Assembly .............. SKIPPED
[INFO] Spark Integration for Kafka 0.8 .................... SKIPPED
[INFO] Spark Project Examples ............................. SKIPPED
[INFO] Spark Project External Kafka Assembly .............. SKIPPED
[INFO] Spark Integration for Kafka 0.10 ................... SKIPPED
[INFO] Spark Integration for Kafka 0.10 Assembly .......... SKIPPED
[INFO] Kafka 0.10 Source for Structured Streaming ......... SKIPPED
[INFO] Spark Project Java 8 Tests 2.1.0 ................... SKIPPED
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 11:29 min
[INFO] Finished at: 2018-05-04T00:42:48+08:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal net.alchim31.maven:scala-maven-plugin:3.2.2:testCompile (scala-test-compile-first) on project spark-mllib-local_2.11: Execution scala-test-compile-first of goal net.alchim31.maven:scala-maven-plugin:3.2.2:testCompile failed.: CompileFailed -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR]
[ERROR] After correcting the problems, you can resume the build with the command
[ERROR]     mvn <goals> -rf :spark-mllib-local_2.11

原因:可能网络不好
解决方案:
方案1: 删除本地 Maven 仓库,然后多次重新编译
方案2:   mvn <goals> -rf :spark-sql_2.10      从失败的地方(比如 spark-sql_2.10 )开始编译。推荐
如按照提示在maven 命令后加 -rf :spark-tags_2.11
./dev/make-distribution.sh --name 2.6.0-cdh5.7.0 --tgz -Pyarn -Phadoop-2.6 -Phive -Phive-thriftserver -Dhadoop.version=2.6.0-cdh5.7.0 -rf :spark-mllib-local_2.11  -U
(2)错误2

Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000b6c7d000, 98807808, 0) failed; error='Cannot allocate memory' (errno=12)
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 98807808 bytes for committing reserved memory.
# An error report file with more information is saved as:
# /www/instl/spark/spark-2.1.0/hs_err_pid15199.log
原因:内存不够
解决方案:加大内存。4G+



  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

野狼e族

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值