Docker - 使用容器安装部署Spark集群教程(附:使用样例)
Spark 是一种基于内存的快速、通用、可扩展的大数据分析计算引擎。使用 Docker 技术可以帮助我们快速地搭建一个 Spark 集群环境,方便我们日常开发和学习。下面我以 CentOS 系统为例(其他系统步骤也是一样的),演示如何通过 Docker 部署 Spark 集群。
(2)接着执行如下命令下载的镜像,这里我指定下载 3.4 版本的镜像:
(2)该文件的内容如下:
(1)首先执行如下命令启动容器:
(2)接着执行 docker ps 命令可以看到启动了两个容器,也就是一主一从的集群(一个 master、一个 worker):
(3)使用浏览器通过 http://服务器IP:8080 地址可以访问 Spark Web UI 页面,查看整个集群的状态、资源、任务等信息。
(2)执行 docker ps 命令可以看到启动了 4 个容器,也就是一主三从的集群(1个 master、3个 worker):
(3)访问 Spark Web UI 页面,可以看到信息如下:
(2)接着执行如下命令启动 Spark 交互式命令行:
(3)在启动交互式 Shell 时,Spark 驱动器程序(Driver Program)会创建一个名为 sc 的 SparkContext 对象,我们可以通过该对象来创建 RDD。
(4)这里我们执行如下命令通过 List 创建一个 RDD,并对里面元素进行聚合:
(5)执行结果如下:
(3)执行完毕后控制台会输出各个单词数量统计:
(4)访问 Spark Web UI 页面,可以看到提交的应用共被分为三个 Executor(分布在三个 worker 节点上),每个 Executor 分别执行一部分作业内容:
(5)当然我们也可以不进入容器,直接在容器外面执行容器内容的 spark-submit 命令来提交应用,具体如下:
1,下载镜像
提示:BitNami 是一个开源项目,现已被 VMware 公司收购,其宗旨是简化在个人终端、Kubernetes 和云服务器等环境上的开源软件的部署。其已为 Docker Hub 社区提供了数百个容器镜像方案,其中的 Redis、MongoDB 等热门镜像更是超过了十亿次下载。其中 bitnami/spark 镜像也已超过百万次下载,这是一个成熟的 Spark Docker 方案。
(2)接着执行如下命令下载的镜像,这里我指定下载 3.4 版本的镜像:
docker pull bitnami/spark:3.4
2,编写 Docker Compose 文件
(1)由于是要搭建一个多节点的集群,如果通过 docker 命令手动一个个启动容器效率太低,因此我们采用 Docker Compose 来启动容器。首先创建一个 docker-compose.yml 文件:vi docker-compose.yml
(2)该文件的内容如下:
version: '2' services: spark: image: docker.io/bitnami/spark:3.4 environment: - SPARK_MODE=master - SPARK_RPC_AUTHENTICATION_ENABLED=no - SPARK_RPC_ENCRYPTION_ENABLED=no - SPARK_LOCAL_STORAGE_ENCRYPTION_ENABLED=no - SPARK_SSL_ENABLED=no - SPARK_USER=spark ports: - '8080:8080' - '7077:7077' spark-worker: image: docker.io/bitnami/spark:3.4 environment: - SPARK_MODE=worker - SPARK_MASTER_URL=spark://spark:7077 - SPARK_WORKER_MEMORY=1G - SPARK_WORKER_CORES=1 - SPARK_RPC_AUTHENTICATION_ENABLED=no - SPARK_RPC_ENCRYPTION_ENABLED=no - SPARK_LOCAL_STORAGE_ENCRYPTION_ENABLED=no - SPARK_SSL_ENABLED=no - SPARK_USER=spark
3,启动容器
docker-compose up -d
(2)接着执行 docker ps 命令可以看到启动了两个容器,也就是一主一从的集群(一个 master、一个 worker):
4,调整 worker 的数量
(1)默认情况下集群里面只有一个 worker,我们可以执行如下命令启动多个 worker,这里我设置为三个:
注意:执行如下命令前不用需要先将原先启动的容器停止,直接执行系统会自动增、减容器的。
docker-compose up -d --scale spark-worker=3
(2)执行 docker ps 命令可以看到启动了 4 个容器,也就是一主三从的集群(1个 master、3个 worker):
附:功能测试与使用
1,使用 Spark Shell 进行交互
(1)首先执行如下命令进入到 master 容器内部(注意容器 ID 根据实际情况进行修改):
docker exec -it 2b26cd719759 bash
(2)接着执行如下命令启动 Spark 交互式命令行:
spark-shell
(3)在启动交互式 Shell 时,Spark 驱动器程序(Driver Program)会创建一个名为 sc 的 SparkContext 对象,我们可以通过该对象来创建 RDD。
(4)这里我们执行如下命令通过 List 创建一个 RDD,并对里面元素进行聚合:
sc.makeRDD(List(1,2,3,4)).reduce(_+_)
(5)执行结果如下:
2,使用 spark-submit 提交应用
我们的最终目的是创建一个独立的 Java、Scala 或 Python 应用,将其提交到 Spark 集群上运行。Spark 为各种集群管理器提供了统一的工具来提交作业,这个工具就是 spark-submit。
(1)Spark 容器内已经包含一些示例 Jar 包,位于 $SPARK_HOME/examples 目录下。我们可以直接用来测试 spark-submit 功能:
(2)这里执行如下命令提交 spark-examples_2.12-3.4.1.jar 这个应用,并且提交时还需额外指定程序入口类,即 main 函数所在类。这里我使用统计词频的入口类 org.apache.spark.examples.JavaWordCount。
参数说明:
- --master spark://2b26cd719759:7077:指定 Spark Master 服务地址。
- --deploy-mode 参数决定了驱动器程序的运行位置。默认情况下,即客户端模式(client)下,spark-submit 会在本地(运行该命令的机器上)启动驱动器程序。如果指定为集群模式(cluster),驱动器程序将会运行在随机选取的一个工作节点上,此时即使 ctrl-c 中断 spark-submit 命令,也不会影响应用继续运行。因此,集群模式适用于需要长时间作业的应用。
- /opt/bitnami/spark/README.md:main 函数需要传入的参数,本样例该参数表示需要读取的文件地址
spark-submit --master spark://2b26cd719759:7077 \ --name "JavaWordCount" \ --class org.apache.spark.examples.JavaWordCount \ /opt/bitnami/spark/examples/jars/spark-examples_2.12-3.4.1.jar /opt/bitnami/spark/README.md
(3)执行完毕后控制台会输出各个单词数量统计:
docker exec a8feae08c74d spark-submit --master spark://2b26cd719759:7077 \ --name "JavaWordCount" \ --class org.apache.spark.examples.JavaWordCount \ /opt/bitnami/spark/examples/jars/spark-examples_2.12-3.4.1.jar /opt/bitnami/spark/README.md