鱼喃

听!布鲁布鲁,大鱼又在那叨叨了

基于Docker Swarm搭建Spark集群

什么是Spark

Apache Spark是一个围绕速度、易用性和复杂分析构建的大数据处理框架。最初在2009年由加州大学伯克利分校的AMPLab开发,并于2010年成为Apache的开源项目之一。
与Hadoop和Storm等其他大数据和MapReduce技术相比,Spark有如下优势。
首先,Spark为我们提供了一个全面、统一的框架用于管理各种有着不同性质(文本数据、图表数据等)的数据集和数据源(批量数据或实时的流数据)的大数据处理的需求。
Spark可以将Hadoop集群中的应用在内存中的运行速度提升100倍,甚至能够将应用在磁盘上的运行速度提升10倍。
Spark让开发者可以快速的用Java、Scala或Python编写程序。它本身自带了一个超过80个高阶操作符集合。而且还可以用它在shell中以交互式地查询数据。
除了Map和Reduce操作之外,它还支持SQL查询,流数据,机器学习和图表数据处理。开发者可以在一个数据管道用例中单独使用某一能力或者将这些能力结合在一起使用。
(http://www.infoq.com/cn/articles/apache-spark-introduction)

说明

基于 sequenceiq/spark 做了一点修改,增加对集群的支持,并且简化搭建集群的流程。适合初学者快速搭建spark集群,减少搭建过程过产生的挫败感。。。

搭建过程

以创建一个具有1个mster节点,2个slave节点的spark集群为例

创建集群

spark-master

1
2
3
4
5
6
7
docker service create \
--name spark-master \
--hostname spark-master \
--network swarm-net \
--replicas 1 \
--endpoint-mode dnsrr \
newnius/spark

spark-slave1

1
2
3
4
5
6
7
docker service create \
--name spark-slave1 \
--hostname spark-slave1 \
--network swarm-net \
--replicas 1 \
--endpoint-mode dnsrr \
newnius/spark

spark-slave2

1
2
3
4
5
6
7
docker service create \
--name spark-slave2 \
--hostname spark-slave2 \
--network swarm-net \
--replicas 1 \
--endpoint-mode dnsrr \
newnius/spark

初始化HDFS

因为集群是第一次创建,需要进行HDFS的初始化工作

spark-master节点,停止集群

1
2
3
sbin/stop-yarn.sh
sbin/stop-dfs.sh
../spark/sbin/stop-all.sh

所有节点,删除原有HDFS的数据

1
rm -rf /tmp

spark-master节点执行namenode的格式化工作

1
bin/hadoop namenode -format

spark-master节点启动集群

1
2
3
sbin/start-dfs.sh
sbin/start-yarn.sh
../spark/sbin/start-all.sh

由于docker 容器在重启之后数据会丢失,建议把相关目录映射到host文件系统进行持久化。

测试

打开浏览器,输入 spark-master:8080。 不出意外,就可以看到集群中的slave节点。
这里没有映射端口,是通过代理的方式进行访问web的,见无需端口映射,实现外部网络访问Docker集群内部服务

修改配置

默认的配置是1个master节点、2个slave节点,并且名称必须指定为spark-master,spark-slave1,spark-slave2,如果需要自定义名称或者是调整集群节点个数,需要修改配置文件。

需要修改的配置分散在三个文件夹,而且文件数很多,大部分不用修改。所以创建了另外三个文件夹,分别对应,在启动容器之前通过启动脚本替换原有的配置。放置新配置文件的文件夹和他对应的原始文件夹如下:

覆盖原始配置的文件夹 被替换的文件夹
/mnt/config/hadoop/ /usr/local/hadoop/etc/hadoop/
/mnt/config/spark/ /usr/local/spark/conf/
/mnt/config/spark-yarn-remote-client/ /usr/local/spark/yarn-remote-client/

注意:默认这三个文件夹里是有配置文件的,自己映射的时候可以提前烤到host文件系统,对应修改

启动脚本(spark-master)

1
2
3
4
5
6
7
8
9
10
11
12
docker service create \
--name spark-master \
--hostname spark-master \
--network swarm-net \
--replicas 1 \
--mount type=bind,source=/mnt/data/spark/hdfs/master,target=/tmp/hadoop-root \
--mount type=bind,source=/mnt/data/spark/logs/master,target=/usr/local/hadoop/logs \
--mount type=bind,source=/mnt/data/spark/config/hadoop,target=/mnt/config/hadoop \
--mount type=bind,source=/mnt/data/spark/config/spark,target=/mnt/config/spark \
--mount type=bind,source=/mnt/data/spark/config/spark-yarn-remote-client,target=/mnt/config/spark-yarn-remote-client \
--endpoint-mode dnsrr \
newnius/spark

Dockerfile和默认的配置文件见:newnius/Dockerfiles