spark编译教程—maven
本文为原创,转载请标明本文地址。
Spark的源码编译和部署包生成,其本质只有两种:Maven和SBT(simple builder tools),
maven 是官方推荐的spark编译的方式,但是SBT 越来越的到人们的热捧,因为它能提供更快的交互编译。
教程从以下几个方面介绍maven编译:
编译环境准备
几种常见的编译方式
编译问题总结
常见编译参数配置
附录
一、编译环境准备
首先查看maven, jdk,scala是否安装
maven的安装网址可以参考:
http://my.oschina.net/pengqiang/blog/275306?p={{currentPage+1}}
jdk的安装教程可以参考:
http://www.cnblogs.com/plinx/archive/2013/06/01/3113106.html
教主的jdk-1.7出了问题,在网上各种修复无果,随后安装了Ubuntu自带的openjdk,倒腾了一天,最后得知必须用sun公司的jdk才可以,教主所用的jdk版本是:
1. 在官方下载spark 源码(http://spark.apache.org/downloads.html)
这里选择的版本是1.3.1
2.把项目解压
sudo tar zxvf spark-1.3.1 -C /usr/local/byr/spark
二、几种编译方式
1.用build/mvn 来编译
build/mvn -Pyarn -Phadoop-2.4 -Dhadoop.version=2.4.0 -DskipTests clean package
(-Pyarn 提供yarn支持 ,—Phadoop-2.4 提供hadoop支持,并且指定hadoop的版本)
因为第一次maven需要下载很多依赖包,所以需要比较久的时间,以后的编译就不需要那么久。
原理:用build目录下自带的mvn来部署安装,它可以自动提供部署工程所需要的资源,并把资源下载到build目录下,如果用户提供合适的参数来部署的话,就选择用户的,如果没有提供,那么mvn也可以给他配置默认的参数和资源。(这个是maven的特点,详情见附录一)打开mvn脚本,你会发下有以下几个重要函数:install_app(),install_mvn(),install_zinc()等函数,它就是调用这些函数来下载相应的资源。
编译完成后,你会发现在assembly/build下面多了一个target文件,这个就是编译的结果
2.用make-distributed 脚本来编译
编译完源代码后,虽然直接用编译后的目录再加以配置就可以运行spark,但是这时目录很庞大,部署起来很不方便,所以需要生成部署包。生成在部署包位于根目录下,文件名类似于spark-1.0.0-bin-2.2.0.tgz。
值得注意的是:make-distribution.sh已经带有Maven编译过程,所以不需要先编译再打包,所以,它可以作为一种单独的编译方式。
./make-distribution.sh –name custom-spark –tgz -Phadoop-2.7 -Pyarn
在这里解释下该命令:
–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 :和–tgz结合可以生成spark-$VERSION-bin-$NAME.tgz的部署包,不加此参数时NAME为hadoop的版本号。
tips:
解压部署包后或者直接在编译过的目录,通过配置conf下的文件,就可以使用spark了。
Spark有下列几种部署方式:
Standalone
YARN
Mesos
Amazon EC2
一般会选择standalone 和 YARN
其实说部署,还不如说运行方式,Spark只是利用不同的资源管理器来申请计算资源。其中Standalone方式是使用Spark本身提供的资源管理器,可以直接运行;而在YARN运行,需要提供运行Spark Application的jar包(或者直接在NM节点上部署Spark):maven编译的jar包为:./assembly/target/scala-2.10/spark-assembly-1.0.0-hadoop2.2.0.jar
SBT编译的jar包为:./assembly/target/scala-2.10/spark-assembly-1.0.0-hadoop2.2.0.jar
三、编译遇到问题总结:
1.
这个就返回检查jdk的路径,注意jdk啦,maven啦,scala啦要用sun公司、oracle的,最好不要用Ubuntu自带的(自带的亲测出现很多问题)。
2.
官方解决方案是: 在编译前设置一下内存的参数(因为要占用更大内存)
export MAVEN_OPTS=”-Xmx2g -XX:MaxPermSize=512M -XX:ReservedCodeCacheSize=512m”
3. 网络问题,编译的时候经常会发生卡死的现象,对于maven编译,只需要安ctrl+z结束进程重新编译就可以了网络问题。
n.问题解决终结版:
如果你出现了某一个问题,已经改正,但是反复编译不过,那就说明是你该下一个原始版的源码,重新编译啦。这个问题教主遇到啦,纠结了两天,最后在高人指点下,换了初始版源码,才发现spark,你竟然逗我!!!!
四、maven编译常用配置参数
1)内存使用量
export MAVEN_OPTS=”-Xmx2g -XX:MaxPermSize=512M -XX:ReservedCodeCacheSize=512m”
2)如果想从HDFS中读取数据,那么需要指明相应的hdfs 的版本,可以通过hadoop。version这个参数来配置。那么如果你不想制定的话,系统会默认把HDFS的版本设置为:2.2.0。
对于 Apache Hadoop versions 1.x, Cloudera CDH MRv1, and other Hadoop versions without YARN 等版本用命令:
$ mvn -Dhadoop.version=1.2.1 -DskipTests clean package
$ mvn -Dhadoop.version=2.0.0-mr1-cdh4.2.0 -DskipTests clean package
对于 Apache Hadoop 2.x, 0.23.x, Cloudera CDH MRv2, and other Hadoop versions with YARN 等版本需要开启 “ yarn-alpha ” or “ yarn ” 属性配置,并且要指定 “ hadoop.version ”, “ yarn.version ” 的属性值:
$ mvn -Pyarn-alpha -Dhadoop.version=2.0.5-alpha -Dyarn.version=2.0.5-alpha -DskipTests clean package
$ mvn -Pyarn-alpha -Dhadoop.version=2.0.0-cdh4.2.0 -Dyarn.version=2.0.0-chd4.2.0 -DskipTests clean package
$ mvn -Pyarn -Dhadoop.version=2.2.0 -Dyarn.version=2.2.0 -DskipTests clean package
3) 增加hive 和 jdbc 支持,那么需要在语句中加入 -Phive -Phive-thriftserver
mvn -Pyarn -Phadoop-2.4 -Dhadoop.version=2.4.0 -Phive -Phive-thriftserver -DskipTests clean package
4)如果想生成一个用scala2.1.2编译的spark 部署包,那么要在加入以下配置参数:
dev/change-version-to-2.11.sh
mvn -Pyarn -Phadoop-2.4 -Dscala-2.11 -DskipTests clean package
五、附录
附录一:maven简介
maven是Apache生产的一款软件,它基于面向项目对象模型project object model (POM)的一款项目管理和综合的工具。所有的项目配置信息都被定义在一个叫做POM.xml的文件中,通过该文件,Maven可以管理项目的整个声明周期,包括编译,构建,测试,发布,报告等等。目前Apache下绝大多数项目都已经采用Maven进行管理。而Maven本身还支持多种插件,可以方便更灵活的控制项目。Maven使用标准的目录结构和默认构建生命周期。
在多个开发团队环境时,Maven可以设置按标准在非常短的时间里完成配置工作。由于大部分项目的设置都很简单,并且可重复使用,Maven让开发人员的工作更轻松,同时创建报表,检查,构建和测试自动化设置。
Maven使用约定优于配置,这意味着开发者不需要创建构建过程。开发人员不必为每一个配置详细信息。Maven提供一个合理的默认项目。创建一个Maven 项目时,Maven使用默认的项目结构。开发者只需要把相应的文件以及在pom.xml 定义相关配置。
作为一个例子,下表列出了项目的源代码文件,资源文件和配置的默认值。假设 basedir表示项目位置:Item默认项目的Java源代码 {basedir}/src/main/java
项目的资源,比如说property文件 basedir/src/main/resources项目的测试资源 {basedir}/src/test
发布的部署包 ${basedir}/target
为了建设项目,Maven提供了开发人员生命周期的目标和项目的依赖(依赖于Maven插件能力,并在其默认约定)。在大部分的项目管理都建立相关的任务和维护Maven插件。
开发人员可以构建任何给定的Maven项目,而不需要了解插件。