为毛要用源码重新编译CDH的Spark?
上篇文章说过,CDH官方发布的Spark版本中并不包含一些特殊的组件,比如SparkR和Thriftserver。要想让Spark支持这些功能,就必须重新编译CDH版本的Spark。
在本地搭建Spark的编译环境太过繁琐,并且由于官方文档的说明,部分RedHat系统中编译的Spark版本甚至会有错误,所以我们直接使用一个现成的集成了编译环境的虚拟机来进行。
环境
如果你在国内,翻墙的网络是必须的,我们需要确保下载安装所需要的组件顺利。
在你的本地机器上,需要以下工具:
您可以根据上面的链接一个一个安装所需要的组件
开始啦
从github的repo中科隆我之前所说的集成编译环境的虚拟机vagrant-sparkbuilder
$ git clone https://github.com/teamclairvoyant/vagrant-sparkbuilder.git
$ cd vagrant-sparkbuilder
启动这个vagrant虚拟机实例,这个实例中包含了Centos 7.0,同时会安装Puppet代理,通过Puppet来部署编译所需的基本环境(Orcale Java和Cloudera Spark)
$ vagrant up
这个步骤须要一些时间,请耐心等待。
启动成功后就可以登录进虚拟机了
$ vagrant ssh
进入虚拟机以后,我们可以切换到Spark的目录
$ cd spark
刚才的过程中,系统已经自动克隆了Cloudera Spark的repo,我们只需要切换到需要的版本的branch或者tag就可以开始编译了。
$ git checkout cdh5-1.6.0_5.7.1
$ git pull # 确保代码是最新的
由于我需要SparkR
的组件支持,所以在编译之前,还需要安装以下R
的环境
$ sudo yum -y -e1 -d1 install epel-release
$ sudo yum -y -e1 -d1 install R
安装好以后,就可以开始编译了,编译根据配置,大概须要10~20分钟。
这个命令会编译出包含SparkR和Thriftserver的Cloudera Spark。
$ patch -p0 </vagrant/undelete.patch # 修改make-distribution.sh,让编译的结果包含SparkR等组件
$ ./make-distribution.sh -DskipTests \
-Dhadoop.version=2.6.0-cdh5.7.1 \
-Phadoop-2.6 \
-Pyarn \
-Psparkr \
-Phive \
-Pflume-provided \
-Phadoop-provided \
-Phbase-provided \
-Phive-provided \
-Pparquet-provided \
-Phive-thriftserver
编译成功以后,就可以把编译好的数据同步回我们的机器了。
$ rsync -a dist/ /vagrant/dist-cdh5.7.1-nodeps
如果你需要再编译其他的CDH版本,那么记得抛弃掉我们之前对make-distribution.sh
的修改
$ git checkout -- make-distribution.sh
一切结束后,使用exit
退出ssh
,然后关闭vagrant虚拟机
$ vagrant halt
$ vagrant destroy # 摧毁,如果需要的话
可能的问题
如果在编译过程中出现内存不足的错误Cannot allocate memory
,则须要修改Vagrantfile
,将配置文件中的v.memory
和v.cpus
提高,并且重新启动vagrant up
。