24.7 Compose应用案例二:大数据Spark集群
1.简介
Spark是Berkeley开发的分布式计算的框架,相对于Hadoop来说,Spark可以缓存中间结果到内存从而提高某些需要迭代的计算场景的效率,目前受到广泛关注。
熟悉Hadoop的读者会比较轻松,Spark很多设计理念和用法都跟Hadoop保持一致和相似,并且在使用上完全兼容HDFS。但是Spark的安装并不容易,依赖包括Java、Scala、HDFS等。
通过使用Docker Compose,可以快速地在本地搭建一套Spark环境,方便大家开发Spark应用,或者扩展到生产环境。
2.准备工作
这里,我们采用比较热门的sequenceiq/docker-spark镜像,这个镜像已经安装了对Spark的完整依赖。由于镜像比较大(超过2GB),推荐先下载镜像到本地:
- $ docker pull sequenceiq/spark:1.4.0
(1)docker-compose.yml文件
首先新建一个spark_cluster目录,并在其中创建一个docker-compose.yml文件。文件内容如下:
- master:
- image: sequenceiq/spark:1.4.0
- hostname: master
- ports:
- - "4040:4040"
- - "8042:8042"
- - "7077:7077"
- - "8088:8088"
- - "8080:8080"
- restart: always
- #mem_limit: 1024m
- command: bash /usr/local/spark/sbin/start-master.sh && ping localhost > /dev/null
- worker:
- image: sequenceiq/spark:1.4.0
- links:
- - master:master
- expose:
- - "8081"
- restart: always
- command: bash /usr/local/spark/sbin/start-slave.sh spark://master:7077 &&
- ping localhost >/dev/null
docker-compose.yml中定义了两种类型的服务:master和slave。master类型的服务容器将负责管理操作,worker则负责具体处理。
(2)master服务
master服务映射了好几组端口到本地,端口的功能如下:
·4040:Spark运行任务时候提供Web界面观察任务的具体执行状况,包括执行到哪个阶段、在哪个executor上执行;
·8042:Hadoop的节点管理界面;
·7077:Spark主节点的监听端口,用户可以提交应用到这个端口,worker节点也可以通过这个端口连接到主节点构成集群;
·8080:Spark的监控界面,可以看到所有worker、应用的整体信息;
·8088:Hadoop集群的整体监控界面。
(3)worker服务
类似于master节点,启动后,执行/usr/local/spark/sbin/start-slave.sh spark://master:7077命令来配置自己为worker节点,然后通过ping来避免容器退出。
注意,启动脚本后面需要提供spark://master:7077参数来指定master节点地址。
8081端口提供的Web界面,可以看到该worker节点上任务的具体执行情况,如图24-3所示。

图24-3 查看任务的执行情况
3.启动集群
在spark_cluster目录下执行启动命令:
- $ docker-compose up
docker-compose服务运行起来后,我们还可以用scale命令来动态扩展Spark的worker节点数,例如:
- $ docker-compose scale worker=2
- Creating and starting 2... done
4.执行应用
Spark推荐用spark-submit命令来提交执行的命令,基本语法为:
- spark-submit \
- --class your-class-name \
- --master master_url \
- your-jar-file
- app_params
例如,我们可以使用Spark自带样例中计算Pi的应用。
在master节点上执行如下命令:
- /usr/local/spark/bin/spark-submit --master spark://master:7077 --conf "spark.
- eventLog.enabled=true" --class org.apache.spark.examples.SparkPi /usr/local/
- spark/lib/spark-examples-1.4.0-hadoop2.6.0.jar 1000
最后的参数1000表示要计算的迭代次数为1000次。
任务运行中,可以用浏览器访问4040端口,看到任务被分配到了两个worker节点上执行,如图24-4所示。

图24-4 执行应用
