2016-05-04 13:29:54
来 源
中存储网
Spark
官方版本的spark1.0.0-hadoop2(hadoop2,cdh5),部署在hadoop2.0.0-cdh4.7.0版本上一直不成功,决定重新编译spark1.0.0,

因直接下载官方版本的spark1.0.0-hadoop2(hadoop2,cdh5),部署在hadoop2.0.0-cdh4.7.0版本上一直不成功,google了一下,看到:http://apache-spark-user-list.1001560.n3.nabble.com/spark-1-0-0-on-yarn-td6636.html 这篇文件,决定重新编译spark1.0.0。

Spark1.0.0的源码编译和部署包生成,其本质只有两种:Maven和SBT,只不过针对不同场景而已:

  • Maven编译
  • SBT编译
  • IntelliJ IDEA编译(可以采用Maven或SBT插件编译),适用于开发人员
  • 部署包生成(内嵌Maven编译),适用于维护人员
编译的目的是生成指定环境下运行Spark本身或开发Spark Application的JAR包,本次编译的目的生成运行在hadoop2.0.0-cdh4.7.0上的Spark JAR包。缺省编译所支持的hadoop环境是hadoop1.0.4(可参见源码根目录下的pom.xml文件)。
 
1:获取Spark1.0.0 源码
官网下载地址
 
2:SBT编译
解压源码,将源代码复制到指定目录,然后进入该目录,运行:

SPARK_HADOOP_VERSION=2.0.0-cdh4.7.0 SPARK_YARN=true sbt/sbt assembly

3:Maven编译
事先安装好maven3.04或maven3.05,并设置要环境变量MAVEN_HOME,将$MAVEN_HOME/bin加入PATH变量。然后将源代码复制到指定目录,然后进入该目录,先设置Maven参数:

export MAVEN_OPTS=”-Xmx2g -XX:MaxPermSize=512M -XX:ReservedCodeCacheSize=512m”

再运行:

mvn -Pyarn-alpha -Dhadoop.version=2.0.0-cdh4.7.0 -Dprotobuf.version=2.5.0 -DskipTests clean package

4:IntelliJ IDEA编译(本人未试过)
IntelliJ IDEA是个优秀的scala开发IDE,所以顺便就提一下IntelliJ IDEA里的spark编译。
首先将源代码复制到指定目录,然后启动IDEA -> import project -> import project from external model -> Maven编译目录中的pom.xml -> 在选择profile时选择hadoop2.0.0-cdh4.7.0 -> 直到导入项目。

在maven projects视图选择Spark Project Parent POM(root),然后选中工具栏倒数第四个按钮(ship Tests mode)按下,这时Liftcycle中test是灰色的。

接着按倒数第一个按钮进入Maven设置,在runner项设置VM option:

-Xmx2g -XX:MaxPermSize=512M -XX:ReservedCodeCacheSize=512m

按OK 保存。

回到maven projects视图,点中Liftcycle中package,然后按第5个按钮(Run Maven Build按钮),开始编译。其编译结果和Maven编译是一样的。

 
5:生成spark部署包
编译完源代码后,虽然直接用编译后的目录再加以配置就可以运行spark,但是这时目录很庞大,又3G多吧,部署起来很不方便,所以需要生成部署包。
spark源码根目录下带有一个脚本文件make-distribution.sh可以生成部署包,其参数有:
  • –hadoop VERSION:打包时所用的Hadoop版本号,不加此参数时hadoop版本为1.0.4。
  • –with-yarn:是否支持Hadoop YARN,不加参数时为不支持yarn。
  • –with-hive:是否在Spark SQL 中支持hive,不加此参数时为不支持hive。
  • –skip-java-test:是否在编译的过程中略过java测试,不加此参数时为略过。
  • –with-tachyon:是否支持内存文件系统Tachyon,不加此参数时不支持tachyon。
  • –tgz:在根目录下生成 spark-$VERSION-bin.tgz,不加此参数时不生成tgz文件,只生成/dist目录。
  • –name NAME:和–tgz结合可以生成spark-$VERSION-bin-$NAME.tgz的部署包,不加此参数时NAME为hadoop的版本号。
如果要生成spark支持yarn、hadoop2.0.0-cdh4.7.0的部署包,只需要将源代码复制到指定目录,进入该目录后运行:

./make-distribution.sh –hadoop 2.0.0-cdh4.7.0 –with-yarn –tgz

 
如果要生成spark支持yarn、hive的部署包,只需要将源代码复制到指定目录,进入该目录后运行:

./make-distribution.sh –hadoop 2.0.0-cdh4.7.0 –with-yarn –with-hive –tgz

如果要生成spark支持yarn、hadoop2.0.0-cdh4.7.0、techyon的部署包,只需要将源代码复制到指定目录,进入该目录后运行:

./make-distribution.sh –hadoop 2.0.0-cdh4.7.0 –with-yarn –with-tachyon –tgz

生成在部署包位于根目录下,文件名类似于spark-1.0.0-bin-2.0.0-cdh4.7.0.tgz。

值得注意的是:make-distribution.sh已经带有Maven编译过程,所以不需要先编译再打包。
 
 
编译过程中可能会出现如下错误:

[ERROR] /home/hadoop2/spark-1.0.0/yarn/alpha/src/main/scala/org/apache/spark/deploy/yarn/YarnAllocationHandler.scala:36: object AMResponse is not a member of package org.apache.hadoop.yarn.api.records
[ERROR] import org.apache.hadoop.yarn.api.records.{AMResponse, ApplicationAttemp
tId}
[ERROR] ^
[ERROR] /home/hadoop2/spark-1.0.0/yarn/alpha/src/main/scala/org/apache/spark/deploy/yarn/YarnAllocationHandler.scala:110: value getAMResponse is not a member of
org.apache.hadoop.yarn.api.protocolrecords.AllocateResponse
[ERROR] val amResp = allocateExecutorResources(executorsToRequest).getAMResp
onse
[ERROR] ^
[ERROR] two errors found

解决方法:

修改spark-1.0.0/yarn/alpha/src/main/scala/org/apache/spark/deploy/yarn/YarnAllocationHandler.scala文件:

(1)

import org.apache.hadoop.yarn.api.records.{AMResponse, ApplicationAttemptId}

改为:
import org.apache.hadoop.yarn.api.records.ApplicationAttemptId

(2)
val amResp = allocateExecutorResources(executorsToRequest).getAMResponse

改为:
val amResp = allocateExecutorResources(executorsToRequest)

之后编译成功

声明: 此文观点不代表本站立场;转载须要保留原文链接;版权疑问请联系我们。