编译打包spark-1.6.0-cdh5.11.0-src详细过程及问题记录

简介
        要深入学习spark,阅读源码,修改源码,学会自己编译打包spark是必须迈过的一道坎。折腾了两天,先后编译打包了spark-1.6.0-cdh5.11.0-src,spark-1.6.0-cdh5.13.0-src版本,现在记录过程,及遇到的问题如下。

环境准备
         1.我编译的平台是CentOS7,并且能正常联网(如果你能越过那道高高的山岗,那么编译速度就大大的快了)。
            2.系统安装的Java环境是JDK7和Scala2.10.4。官网有说明,Java环境应该是7或者更高(推荐使用8,7也快过时了)。尽量不要使用Scala2.11,如果要使用则要做另外一个步骤,详见文末的官方编译参考文档。
            3.采用的是maven方式编译,因此准备maven软件:apache-maven-3.5.0。官网有说明,maven版本应该是3.3.3或者更高
        

软件下载
           2.源码下载:http://archive.cloudera.com/cdh5/cdh/5/  ,下载spark-1.6.0-cdh5.11.0-src.tar.gz
           3.Scala下载:http://www.scala-lang.org/download/2.10.4.html

编译步骤
        1.安装maven,Scala。安装方式都类型,上传解压,修改环境变量。
                  
            2.jdk,Scala,maven等环境准备好后,上传源码解压。然后查看解压后的目录,发现有一个make-distribution.sh脚本,接下来要修改一下脚本:
vim make-distribution.sh
找到下面的片段,将其全部注释如下:
#VERSION=$("$MVN" help:evaluate -Dexpression=project.version [email protected] 2>/dev/null | grep -v "INFO" | tail -n 1)
#SCALA_VERSION=$("$MVN" help:evaluate -Dexpression=scala.binary.version [email protected] 2>/dev/null\
#    | grep -v "INFO"\
#    | tail -n 1)
#SPARK_HADOOP_VERSION=$("$MVN" help:evaluate -Dexpression=hadoop.version [email protected] 2>/dev/null\
#    | grep -v "INFO"\
#    | tail -n 1)
#SPARK_HIVE=$("$MVN" help:evaluate -Dexpression=project.activeProfiles -pl sql/hive [email protected] 2>/dev/null\
#    | grep -v "INFO"\
#    | 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)
        然后添加如下内容
VERSION=1.6.0
SPARK_HADOOP_VERSION=2.6.0-cdh5.11.0
SPARK_HIVE=1
SCALA_VERSION=2.10.4
 其中,VERSION代表spark版本,SPARK_HADOOP_VERSION代表Hadoop版本,SPARK_HIVE如果为1则代表需要支持hive,为0则不需要。SCALA_VERSION为Scala版本。这里的各种版本根据自己的需要自行对应。
这里修改脚本的目的,是为了避免进行版本检查,由自己指定版本,可以加快编译时间。
        
              3.修改完成后保存脚本。然后执行下面命令,避免内存溢出。
export MAVEN_OPTS="-Xmx2g -XX:MaxPermSize=512M -XX:ReservedCodeCacheSize=512m"
               
               4.然后执行如下编译命令
./make-distribution.sh --tgz -Pyarn -Phadoop-2.6.0-cdh5.11.0 -Dhadoop.version=2.6.0-cdh5.11.0 -Phive-1.1.0 -Phive-thriftserver
               然后就会自动下载许多的东东,如果一切顺利,最后在当前目录下,会生成一个spark-1.6.0-bin-2.6.0-cdh5.11.0.tgz文件。当然这是一切顺利,可是第一次编译基本不可能顺利,下面是其中一些问题的摘录。

遇到的问题及解决
          1.下载文件或者依赖包时卡住。这是由于网络问题,可以ctrl+c停止编译,然后再执行以下编译命令,出现卡住不动就这样,多试几次,我重试了大概4,5次。轻功好的同学,翻山越岭,编译就顺畅多了。
               
              2。Hive-thriftserver编译失败。报错大致如下:
[error]/opt/spark-1.6.0-cdh5.11.0/sql/hive-thriftserver/src/main/scala/org/apache/spark/sql/hive/thriftserver/SparkExecuteStatementOperation.scala:42: class SparkExecuteStatementOperation needs to be abstract, since method cancel in class Operation of type (x$1: org.apache.hive.service.cli.OperationState)Unit is not defined
[error] private[hive] class SparkExecuteStatementOperation(
[error]                     ^
[error] /opt/spark-1.6.0-cdh5.11.0/sql/hive-thriftserver/src/main/scala/org/apache/spark/sql/hive/thriftserver/SparkExecuteStatementOperation.scala:252: method cancel overrides nothing.
[error] Note: the super classes of class SparkExecuteStatementOperation contain the following, non final members named cancel:
[error] def cancel(x$1: org.apache.hive.service.cli.OperationState): Unit
[error]   override def cancel(): Unit = {
[error]                ^
[error] /opt/spark-1.6.0-cdh5.11.0/sql/hive-thriftserver/src/main/scala/org/apache/spark/sql/hive/thriftserver/server/SparkSQLOperationManager.scala:42: method newExecuteStatementOperation overrides nothing.
[error] Note: the super classes of class SparkSQLOperationManager contain the following, non final members named newExecuteStatementOperation:
[error] def newExecuteStatementOperation(x$1: org.apache.hive.service.cli.session.HiveSession,x$2: String,x$3: java.util.Map[String,String],x$4: Boolean,x$5: Long): org.apache.hive.service.cli.operation.ExecuteStatementOperation
[error]   override def newExecuteStatementOperation(
[error]                ^
[error] three errors found
[error] Compile failed at Nov 1, 2017 3:45:20 PM [3.198s]
                    这个问题,cloudera官方社区给出的解释是不支持,下面是回复截图
编译打包spark-1.6.0-cdh5.11.0-src详细过程及问题记录
                        解决办法是不编译他,修改一下编译命令,把-Phive-thriftserver参数删掉,如下:
./make-distribution.sh --tgz -Pyarn -Phadoop-2.6.0-cdh5.11.0 -Dhadoop.version=2.6.0-cdh5.11.0 -Phive-1.1.0
                
                3.在编译Spark Project External Kafka时可能会遇到找不到包com.google.common,如下:
[ERROR] bad symbolic reference. A signature in Utils.class refers to term util
in package com.google.common which is not available.
It may be completely missing from the current classpath, or the version on
the classpath might be incompatible with the version used when compiling Utils.class.
                解决办法是在spark-parent的pom.xml中加入依赖
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>18.0</version>
</dependency>
               
                4.Unable to find configuration file at location scalastyle-config.xml,解决办法:将根目录下的scalastyle-config.xml拷贝到examples目录下去,这是因为pom.xml中定义的是scalastyle-maven-plugin插件从maven运行的当前目录查找该文件

参考链接:
                http://www.imooc.com/article/18419
                http://hainiubl.com/topics/18