记录spark编译和打包成tar的整个流程。包括各个版本的编译过程,使用make-distribution脚本打包,搭建本地、standalone、yarn的spark环境。
- 2016-1 spark-1.6.0
- 2015-04 【Spark-1.3.0】单独附在最后,添加了spark-sql功能使用和spark-HA的配置
编译和打包
- spark-1.6.0
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
|
- spark-1.5
1 2 3 4 5 |
|
- spark-1.4.1
1 2 3 4 5 6 7 8 9 10 |
|
- spark-1.1.0
官网提供的hadoop版本没有2.5的。这里我自己下载源码再进行编译。先下载spark-1.1.0.tgz,解压然后执行命令编译:
1 2 3 4 |
|
注意事项:用64位的JDK!!加上maven参数,不然很可能出现OOM(甚至各种稀奇古怪的问题)。编译的时间也挺长的,可以先去吃个饭。或者取消一些功能的编译(如hive)。
编译完后,在assembly功能下会生成包括所有spark及其依赖的jar文件。
1 2 3 4 |
|
打包:
上面我们已经编译好了spark程序,这里对其进行打包集成到一个压缩包。使用程序自带的make-distribution.sh即可。
为了减少重新编译的巨长的等待时间,修改下脚本make-distribution.sh
的maven编译参数,去掉maven的clean阶段操作(最好直接注释掉mvn那行),修改最终结果如下:
1 2 |
|
然后执行命令:
1 2 3 4 5 |
|
最终会在目录行打包生成tgz的文件。
本地运行
把本机ip主机名写入到hosts,方便以后windows本机查看日志
1 2 3 4 |
|
- 运行helloworld:
1 2 3 4 5 6 7 |
|
- 交互式操作:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
说明下环境:我使用windows作为开发环境,使用虚拟机中的linux作为测试环境。同时通过ssh连接的隧道来实现windows无缝的访问虚拟机linux操作系统(可以通过浏览器socket5代理查看web页面)。
启动交互式访问后,就可以通过浏览器访问4040查看spark程序的状态。
任务已经启动,接下来就可以进行操作:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
|
执行了上面一些操作后,通过网页查看状态变化:
Spark-standalone集群
部署集群需要用到多个服务器,这里我使用docker来进行部署。
本来应该早早完成本文的实践,但是在搭建docker-hadoop集群时花费了很多的时间。关于搭建集群dnsmasq处理域名问题参见下一篇文章。 最终实现可以参考:docker-hadoop
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
通过网页可以查看集群的状态:
运行任务连接到master:
1 2 3 4 5 6 |
|
从上图可以看到,程序已经正确连接到spark集群,master为driver,任务节点为slaver1和slaver2。下面运行下程序,然后通过网页查看运行的状态。
1 2 3 |
|
系统安装好了,启动spark-standalone集群和hadoop-yarn一样。配置ssh、java,然后启动,配合网页8080/4040可以实时的了解任务的指标。
yarn集群
注意:如果你是按照前面的步骤来操作的,需要先把spark-standalone的集群停掉。端口8080和yarn web使用端口冲突,会导致yarn启动失败。
修改spark-env.sh,添加HADOOP_CONF_DIR参数。然后提交任务到yarn上执行就行了。
1 2 3 4 5 6 7 8 |
|
运行的结果输出在driver的slaver2节点,对应输出型来说不是很直观。spark-yarn提供了另一种方式,driver直接本地运行yarn-client。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
|
thrift连接yarn运行时时受容器内存最大值限制,需要修改yarn-site.xml。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
|
不能把executor-memory的内存设置为等于最大值,否则会报错:
1
|
|
总结
本文主要是搭建spark的环境搭建,本地运行、以及在docker中搭建spark集群、yarn集群三种方式。本地运行最简单方便,但是没有模拟到集群环境;spark提供了yarn框架上的实现,直接提交任务到yarn即可;spark集群相对比较简单和方便,接下来的远程调试主要通过spark伪分布式集群方式来进行。
参考
- Building Spark with Maven
- Quick Start
- Spark Standalone Mode
- Spark Configuration
- DNS
- [spark上安装mysql与hive](http://blog.csdn.net/hwssg/article/details/38424529]
后记 Spark-1.3.0
编译1.3.0(cygwin)
正式环境用的hadoop-2.2,不是开发环境,没有maven等工具。先本地编译后,再方式去。(由于是添加计算的工具,可以随便一点)。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
spark-1.3.0运行spark-sql
连接到hive-engine
依赖tez
hive的hive.execution.engine
的tez,添加tez的jar和hive-site到CLASSPATH。
包的导入以及配置:(如果使用meta-service的就不用这么麻烦)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
|
上面用的是hive-site.xml直接连接数据库的方式。也可以起hive-metaserver,然后spark通过连接meta即可:
1 2 3 4 5 6 7 8 9 10 |
|
- 运行:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
运行hivesever服务
1 2 3 4 5 6 7 8 |
|
在不依赖外部的jar时,spark的启动脚本是没有问题的,但是我们添加了很多依赖的jar这么写就有问题了,尽管thrift启动正常,但是shell总是打印错误:
1 2 3 4 |
|
比较隐晦,问题在sbin/spark-daemon.sh
,启动完后通过if [[ ! $(ps -p "$newpid" -o args=) =~ $command ]]; then
(其中=~
表示正则匹配,最终spark-class.sh
调用java会加上classpath),而上面的classpath会很长,导致上面的匹配失败!!
1 2 3 4 5 6 7 8 |
|
解决办法
先看实验:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
设置cp后会覆盖CLASSPATH。所以问题的解决方法:直接把cp的路径删掉(不添加),前面export的classpath路径。java程序会去主动获取改环境变量。
1 2 |
|
效果如下:
1 2 |
|
- [=~的作用]http://bbs.chinaunix.net/thread-1623121-1-1.html
- http://docs.oracle.com/javase/tutorial/essential/environment/paths.html
- https://docs.oracle.com/javase/8/docs/technotes/tools/windows/classpath.html
Spark-HA
仅需要配置,重启spark集群即可。
1 2 3 4 5 6 7 |
|
各个master要单独的启动:
1 2 |
|
通过查看http://bigdata8:8080/当前的状态为STANDBY。Workers列表为空。
1
|
|
停了bigdatamgr1后,刷新bigdata8:8080
页面等1分钟左右就变成ALIVE,然后其他所有的节点也连接到bigdata8了。
- http://www.cnblogs.com/byrhuangqiang/p/3937654.html
- http://spark.apache.org/docs/latest/spark-standalone.html#high-availability
–END