Bigdata-使用容器编排工具compose组建Spark集群

1.简介

Apache Spark 是专为大规模数据处理而设计的快速通用的计算引擎。Spark是UC Berkeley AMP lab (加州大学伯克利分校的AMP实验室)所开源的类Hadoop MapReduce的通用并行框架,Spark,拥有Hadoop MapReduce所具有的优点;但不同于MapReduce的是——Job中间输出结果可以保存在内存中,从而不再需要读写HDFS,因此Spark能更好地适用于数据挖掘与机器学习等需要迭代的MapReduce的算法。
通过使用Docker Compose,可以快速地在本地搭建一套Spark环境,方便大家开发Spark应用,或者扩展到生产环境。

2.准备工作

这里,我们采用比较热门的sequenceiq/docker-spark镜像,这个镜像已经安装了对Spark的完整依赖。由于镜像较大(超过2G),推荐先下载镜像到本地:
[root@adson haproxy_web]# docker pull sequenceiq/spark

(1)docker-compose.yml文件
首先新建一个spark_cluster目录,并在其中创建一个docker-compose.yml文件:
[root@adson ~]# mkdir spark_cluster
[root@adson ~]# cd spark_cluster
[root@adson spark_cluster]# vi docker-compose.yml
master:
image: sequenceiq/spark:1.6.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.6.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 节点上任务的具体执行情况。

3.启动集群

在spark_cluster目录下执行启动命令:
[root@adson spark_cluster]# docker-compose up
Creating spark_cluster_master_1 … done
Creating spark_cluster_worker_1 … done
Attaching to spark_cluster_master_1, spark_cluster_worker_1
master_1 | /
worker_1 | /
master_1 | Starting sshd: [ OK ]
worker_1 | Starting sshd: [ OK ]
worker_1 | Starting namenodes on [ad68418a5c5e]
master_1 | Starting namenodes on [master]
master_1 | master: starting namenode, logging to /usr/local/hadoop/logs/hadoop-root-namenode-master.out
worker_1 | ad68418a5c5e: starting namenode, logging to /usr/local/hadoop/logs/hadoop-root-namenode-ad68418a5c5e.out
master_1 | localhost: starting datanode, logging to /usr/local/hadoop/logs/hadoop-root-datanode-master.out

docker-compose服务启动后,我们还可以用scale命令来动态扩展Spark的worker节点数:
[root@adson ~]# cd spark_cluster/
[root@adson spark_cluster]# docker-compose scale worker=2
WARNING: The scale command is deprecated. Use the up command with the --scale flag instead.
Starting spark_cluster_worker_1 … done
Creating spark_cluster_worker_2 … done

4.测试

进入master节点:
[root@adson spark_cluster]# docker exec -it spark_cluster_master_1 /bin/bash
bash-4.1# spark-shell
18/07/08 08:16:20 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform… using builtin-java classes where applicable
18/07/08 08:16:21 INFO spark.SecurityManager: Changing view acls to: root
18/07/08 08:16:21 INFO spark.SecurityManager: Changing modify acls to: root
18/07/08 08:16:21 INFO spark.SecurityManager: SecurityManager: authentication disabled; ui acls disabled; users with view permissions: Set(root); users with modify permissions: Set(root)
18/07/08 08:16:22 INFO spark.HttpServer: Starting HTTP Server
18/07/08 08:16:22 INFO server.Server: jetty-8.y.z-SNAPSHOT
18/07/08 08:16:22 INFO server.AbstractConnector: Started SocketConnector@0.0.0.0:37595
18/07/08 08:16:22 INFO util.Utils: Successfully started service ‘HTTP class server’ on port 37595.
Welcome to
____ __
/ / ___ / /
\ / _ / _ `/ __/ '/
/
/ .__/_,// //_\ version 1.6.0
/
/

Using Scala version 2.10.5 (Java HotSpot™ 64-Bit Server VM, Java 1.7.0_51)
Type in expressions to have them evaluated.
输入scala命令测试Spark能否工作:
scala> sc.parallelize(1 to 1000).count()
18/07/08 08:19:28 INFO spark.SparkContext: Starting job: count at :28
18/07/08 08:19:28 INFO scheduler.DAGScheduler: Got job 0 (count at :28) with 1 output partitions
。。。。。。。。。。。。。。。。。。。。
18/07/08 08:19:29 INFO scheduler.TaskSchedulerImpl: Removed TaskSet 0.0, whose tasks have all completed, from pool
18/07/08 08:19:29 INFO scheduler.DAGScheduler: Job 0 finished: count at :28, took 1.015612 s
res0: Long = 1000

5.执行应用

spark推荐用spark-submit命令来提交执行的命令,基本语法为:
spark-submit \
–class your-class-name \
–master master_url \
your-jar-file
app_params

例如,我们可以使用 spark 自带样例中的计算 Pi 的应用。
在 master 节点上执行命令:
bash-4.1# /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.6.0-hadoop2.6.0.jar 1000

遇到提示/tmp/spark-events不存在:
解决方法:
bash-4.1# mkdir /tmp/spark-events
bash-4.1# rsync -a /tmp/spark-events 172.17.0.3:/tmp/spark-events/ #3和4是其他节点的ip
bash-4.1# rsync -a /tmp/spark-events 172.17.0.3:/tmp/spark-events/
bash-4.1# /usr/local/spark-1.6.0-bin-hadoop2.6/sbin/start-history-server.sh #启动服务

重新执行任务后访问4040端口,可以看到任务已被分配到两个work节点:
在这里插入图片描述

最后的参数1000表示要计算的迭代次数为1000次。

停止spark集群
sudo docker-compose down

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐