阅读这篇文章以后,你能够学到什么: 简单来讲就是,能够经过一个命令启动一个 Spark
集群,而后执行你的计算任务。 往复杂了说:linux
Docker
相关知识点:Docker
安装及常见指令;Dockerfile
构建镜像;Docker Compose
一键部署;Docker network
环境配置。Spark
相关知识点:Spark
集群安装及配置;Spark master
及 worker
启动与协做;Spark Job
提交及测试 等等。CentOS-7-x86_64-Minimal-1810.isogit
桥接模式github
进入虚拟机以后,查询 ip
地址,须要用到:ipconfig 指令,因此输入以下指令:web
yum install net-tolls -y
复制代码
而后即可以使用ifconfig
指令查询ip
地址:ssh root@192.168.199.240
docker
参照:官方文档shell
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
复制代码
官方介绍有三种方式进行安装,可是咱们这里选用最简单的方式,也是官方最为推荐的方式进行安装。apache
# 所需依赖包
sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
# 官方推荐稳定版本
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
复制代码
sudo yum install docker-ce docker-ce-cli containerd.io
复制代码
sudo systemctl start docker
复制代码
sudo docker run hello-world
复制代码
国内镜像有不少,如:阿里,中科院大学 等等,这里我选用的docker-cn
json
具体操做以下:vim
vim /etc/docker/daemon.json
复制代码
加入:centos
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
复制代码
而后重启Docker
就行了
sudo systemctl restart docker
复制代码
Spark
服务参见国外文章:towardsdatascience.com/a-journey-i…
这一节的大致步骤是:
Spark
安装包;Spark
运行起来。注:其中最主要有两个文件:
Dockerfile
——配置镜像的全部操做;docker-compose.yml
——一键启动集群。Open JDK
(基础镜像)这里是经过 Dockerfile
来本身建立镜像。
cd /root
mkdir docker
vim Dockerfile
复制代码
建立一个空白的Dockerfile
以后,填入如下配置:
FROM openjdk:8-alpine
复制代码
而后即可以进行编译了,最好是打上本身的标签(将 $MYNAME
替换成你的名字),以下所示:
docker build -t $MYNAME/spark:latest .
docker build -t vinci/spark:latest .
复制代码
上面所建的 openjdk
镜像里面是没有任何工具类的,可是咱们下载Spark
时须要用到wget
,以及tar
解压等工具,因此继续在Dockerfile
里面添加配置:(新增一行,注意添加 --update)
RUN apk --update add wget tar bash 复制代码
而后即可以从新编译镜像了(语句跟以前同样):
docker build -t vinci/spark:latest .
复制代码
Spark
咱们用最新的Spark 2.4.0
基于Scala 2.11
和Hadoop 2.7
,继续在Dockerfile
里新增命令:
# 原做者的连接 404了,我去apache官网上找了个如出一辙的
RUN wget https://archive.apache.org/dist/spark/spark-2.4.0/spark-2.4.0-bin-hadoop2.7.tgz
# 解压并删除多余压缩包
RUN tar -xzf spark-2.4.0-bin-hadoop2.7.tgz && \ mv spark-2.4.0-bin-hadoop2.7 /spark && \ rm spark-2.4.0-bin-hadoop2.7.tgz 复制代码
再次从新编译:docker build -t vinci/spark:latest .
下载耗时较长,请耐心等待
Spark
下载完成以后,即可以run
一个容器进行测试:
这里须要注意的是:Spark Master
和 Worker
须要进行通讯,因此须要指明端口映射:-p 7077:7077 -p 8080:8080
,其中8080
端口是WEB-UI
的端口:
docker run --rm -it --name spark-master --hostname spark-master \
-p 7077:7077 -p 8080:8080 $MYNAME/spark:latest /bin/sh
# 这是一个运行完以后就会删除的容器
docker run --rm -it --name spark-master --hostname spark-master \
-p 7077:7077 -p 8080:8080 vinci/spark:latest /bin/sh
复制代码
这样就进入到了容器里面,而后咱们新建一个窗口,用
SSH
链接到虚拟里面,输入docker container ls
,能够查看到当前正在运行的容器的状态,以下图所示:
在Spark-master
容器中(就是上面进入的容器),输入如下指令启动Spark
:
/spark/bin/spark-class org.apache.spark.deploy.master.Master --ip `hostname` --port 7077 --webui-port 8080
复制代码
而后能够去浏览器确认Spark
是否成功启动:
Spark
集群以上测试成功以后,退出容器,容器便自动删除了(由于启动容器的时候加了rm
选项)。
找到/etc/sysctl.conf
新增一条:net.ipv4.ip_forward=1
重启网络:systemctl restart network
验证配置:sysctl net.ipv4.ip_forward
建立网络很是简单,能够经过运行如下命令来完成:
docker network create spark_network
复制代码
Spark-Master
删除以前创建的Spark-Master
容器(默认已经删除了),而后启动指定网络的Spark-Master
,只须要加上--network
选项,以下所示:
docker run --rm -it --name spark-master --hostname spark-master \
-p 7077:7077 -p 8080:8080 --network spark_network \
$MYNAME/spark:latest /bin/sh
docker run --rm -it --name spark-master --hostname spark-master \
-p 7077:7077 -p 8080:8080 --network spark_network \
vinci/spark:latest /bin/sh
复制代码
进入到容器内部,输入如下指令启动:
/spark/bin/spark-class org.apache.spark.deploy.master.Master --ip `hostname` --port 7077 --webui-port 8080
复制代码
Spark-Worker
从新创建一个SSH
对话,链接到虚拟机,输入如下指令启动Spark-Worker
:
docker run --rm -it --name spark-worker1 --hostname spark-worker1 \
--network spark_network \
$MYNAME/spark:latest /bin/sh
docker run --rm -it --name spark-worker1 --hostname spark-worker1 \
--network spark_network \
vinci/spark:latest /bin/sh
复制代码
进入到worker
容器中以后,启动Spark-Worker
:
/spark/bin/spark-class org.apache.spark.deploy.worker.Worker \
--webui-port 8080 spark://spark-master:7077
复制代码
注:此时回看
Spark-Master
容器,会发现多了一行日志:
INFO Master:54 - Registering worker 172.18.0.3:36486 with 2 cores, 1024.0 MB RAM
复制代码
至此,Spark 集群已经安装成功了
Spark
集群实践通常是一主两从
集群架构,因此咱们还能够新建一个Spark-Work2
容器,指令跟以前类似:
docker run --rm -it --name spark-worker2 --hostname spark-worker2 \
--network spark_network \
vinci/spark:latest /bin/sh
复制代码
进入spark-worker2
容器以后,继续启动Spark-Worker
服务:
/spark/bin/spark-class org.apache.spark.deploy.worker.Worker \
--webui-port 8080 spark://spark-master:7077
复制代码
而后宿主机,浏览器输入:虚拟机IP:8080
,验证Spark
服务:
再次启动一个容器进入到spark-network
中:
docker run --rm -it --network spark_network \
$MYNAME/spark:latest /bin/sh
docker run --rm -it --network spark_network \
vinci/spark:latest /bin/sh
复制代码
运行官方提供的样例:
/spark/bin/spark-submit --master spark://spark-master:7077 --class \
org.apache.spark.examples.SparkPi \
/spark/examples/jars/spark-examples_2.11-2.4.0.jar 1000
复制代码
运行以后会看到哗啦啦的日志输出,咱们也能够经过Web-UI
来进行监控。
经过Docker Compose
能够极大简化咱们的安装部署流程。
这一节将对以前的知识点进行汇总,因此嫌麻烦的能够不看前面,直接看这里。
sudo curl -L "https://github.com/docker/compose/releases/download/1.23.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version
复制代码
为容器添加Spark
的环境变量,这样就不须要输入前面一大串绝对路径了。
cd /root/docker/spark
vim bashrc
复制代码
添加环境变量
SPARK_HOME=/spark
PATH=$PATH:$SPARK_HOME/bin
复制代码
启动脚本也就是以前咱们进入容器输入的启动spark-master
或者spark-worker
的命令。
注意脚本的第一行必须是:#!/bin/bash
mkdir -p /root/docker/spark/scripts
cd /root/docker/spark/scripts
vim start-master.sh
vim start-worker.sh
vim start-all.sh
复制代码
#!/bin/bash
source /root/.bashrc
export SPARK_MASTER_HOST=`hostname`
mkdir -p $SPARK_MASTER_LOG
export SPARK_HOME=/spark
ln -sf /dev/stdout $SPARK_MASTER_LOG/spark-master.out
spark-class org.apache.spark.deploy.master.Master \
--ip $SPARK_MASTER_HOST \
--port $SPARK_MASTER_PORT \
--webui-port $SPARK_MASTER_WEBUI_PORT >> $SPARK_MASTER_LOG/spark-master.out
复制代码
#!/bin/bash
source /root/.bashrc
mkdir -p $SPARK_WORKER_LOG
export SPARK_HOME=/spark
ln -sf /dev/stdout $SPARK_WORKER_LOG/spark-worker.out
spark-class org.apache.spark.deploy.worker.Worker \
--webui-port $SPARK_WORKER_WEBUI_PORT \
$SPARK_MASTER >> $SPARK_WORKER_LOG/spark-worker.out
复制代码
这个start-shell.sh
脚本的做用是,在运行容器时,默认就进入spark-shell
:
#!/bin/bash
source /root/.bashrc
export SPARK_MASTER_HOST=`hostname`
mkdir -p $SPARK_MASTER_LOG
export SPARK_HOME=/spark
ln -sf /dev/stdout $SPARK_MASTER_LOG/spark-master.out
spark-class org.apache.spark.deploy.master.Master \
--ip $SPARK_MASTER_HOST \
--port $SPARK_MASTER_PORT \
--webui-port $SPARK_MASTER_WEBUI_PORT >> $SPARK_MASTER_LOG/spark-master.out
复制代码
脚本建立完成以后赋予可执行权限:
chmod +x start-master.sh start-worker.sh start-shell.sh
有了这些脚本以后即可以构建本身所须要的Spark
镜像了。
cd /root/docker/spark
vim Dockerfile
复制代码
内容以下:
FROM openjdk:8-alpine
ENV SPARK_MASTER_PORT 7077
ENV SPARK_MASTER_WEBUI_PORT 8080
ENV SPARK_MASTER_LOG /spark/logs
ENV SPARK_WORKER_LOG /spark/logs
ENV SPARK_VERSION 2.4.0
# 工具类
RUN apk --update --no-cache add \ wget tar bash # Spark 压缩包下载
RUN wget https://archive.apache.org/dist/spark/spark-${SPARK_VERSION}/spark-${SPARK_VERSION}-bin-hadoop2.7.tgz
# 解压并删除多余压缩包
RUN tar -xzf spark-${SPARK_VERSION}-bin-hadoop2.7.tgz && \ mv spark-${SPARK_VERSION}-bin-hadoop2.7 /spark && \ rm spark-${SPARK_VERSION}-bin-hadoop2.7.tgz
# 复制环境变量
COPY bashrc /root/.bashrc # 复制启动脚本(包括启动Master和Worker)到容器根目录
COPY scripts/* /
# 暴露端口
EXPOSE 8080 7077 6066
# 默认启动 Spark-shell 暂不开启
# ENTRYPOINT ["/start-shell.sh"]
复制代码
而后编译镜像
docker build -t vinci/spark:latest .
复制代码
编译完成以后进入容器检查一下
docker run --rm -it --network spark_network \
vinci/spark:latest /bin/sh
复制代码
docker-compose.yml
建立一个新文件:docker-compose.yml
,输入如下配置:
version: "3.3"
services:
spark-master:
image: vinci/spark:latest
container_name: spark-master
hostname: spark-master
ports:
- "8080:8080"
- "7077:7077"
networks:
- spark-network
environment:
- "SPARK_LOCAL_IP=spark-master"
- "SPARK_MASTER_PORT=7077"
- "SPARK_MASTER_WEBUI_PORT=8080"
command: "/start-master.sh"
spark-worker:
image: vinci/spark:latest
depends_on:
- spark-master
ports:
- 8080
networks:
- spark-network
environment:
- "SPARK_MASTER=spark://spark-master:7077"
- "SPARK_WORKER_WEBUI_PORT=8080"
entrypoint: "/start-worker.sh"
volumes:
- "./:/local"
networks:
spark-network:
driver: bridge
ipam:
driver: default
复制代码
接下来要作的事情就很简单了,直接运行如下命令就行:
docker-compose up --scale spark-worker=3
复制代码
其中--scale
做用是:Sets the number of containers to run for a service.

运行成功以后能够新建一个SSH
链接到虚拟机CentOS
上,输入docker container ls
查看当前正在运行的容器:
须要注意的是,这里经过docker-compose
启动spark
集群的方式,net-work
的名字叫作:spark_spark-network
启动测试容器:
docker run --rm -it --network spark_spark-network vinci/spark:latest /bin/sh
复制代码
运行官方示例:
/spark/bin/spark-submit --master spark://spark-master:7077 --class \
org.apache.spark.examples.SparkPi \
/spark/examples/jars/spark-examples_2.11-2.4.0.jar 1000
复制代码
输出:Pi is roughly 3.1414315514143154
至此,本章教程结束。