当前位置: > > > Docker - 使用容器安装部署Spark集群教程(附:使用样例)

Docker - 使用容器安装部署Spark集群教程(附:使用样例)

    Spark 是一种基于内存的快速、通用、可扩展的大数据分析计算引擎。使用 Docker 技术可以帮助我们快速地搭建一个 Spark 集群环境,方便我们日常开发和学习。下面我以 CentOS 系统为例(其他系统步骤也是一样的),演示如何通过 Docker 部署 Spark 集群。

1,下载镜像

(1)首先我们访问 docker hub 仓库选择合适的镜像,这里我选择的是 bitnami/spark 镜像(点击访问
提示BitNami 是一个开源项目,现已被 VMware 公司收购,其宗旨是简化在个人终端、Kubernetes 和云服务器等环境上的开源软件的部署。其已为 Docker Hub 社区提供了数百个容器镜像方案,其中的 RedisMongoDB 等热门镜像更是超过了十亿次下载。其中 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,启动容器

(1)首先执行如下命令启动容器:
docker-compose up -d

(2)接着执行 docker ps 命令可以看到启动了两个容器,也就是一主一从的集群(一个 master、一个 worker):

(3)使用浏览器通过 http://服务器IP:8080 地址可以访问 Spark Web UI 页面,查看整个集群的状态、资源、任务等信息。

4,调整 worker 的数量

(1)默认情况下集群里面只有一个 worker,我们可以执行如下命令启动多个 worker,这里我设置为三个:
注意:执行如下命令前不用需要先将原先启动的容器停止,直接执行系统会自动增、减容器的。
docker-compose up -d --scale spark-worker=3

(2)执行 docker ps 命令可以看到启动了 4 个容器,也就是一主三从的集群(1个 master、3个 worker):

(3)访问 Spark Web UI 页面,可以看到信息如下:

附:功能测试与使用

1,使用 Spark Shell 进行交互

(1)首先执行如下命令进入到 master 容器内部(注意容器 ID 根据实际情况进行修改):
docker exec -it 2b26cd719759 bash

(2)接着执行如下命令启动 Spark 交互式命令行:
spark-shell

(3)在启动交互式 Shell 时,Spark 驱动器程序(Driver Program)会创建一个名为 scSparkContext 对象,我们可以通过该对象来创建 RDD

(4)这里我们执行如下命令通过 List 创建一个 RDD,并对里面元素进行聚合:
sc.makeRDD(List(1,2,3,4)).reduce(_+_)

(5)执行结果如下:

2,使用 spark-submit 提交应用

    我们的最终目的是创建一个独立的 JavaScalaPython 应用,将其提交到 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.mdmain 函数需要传入的参数,本样例该参数表示需要读取的文件地址
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)执行完毕后控制台会输出各个单词数量统计:

(4)访问 Spark Web UI 页面,可以看到提交的应用共被分为三个 Executor(分布在三个 worker 节点上),每个 Executor 分别执行一部分作业内容:


(5)当然我们也可以不进入容器,直接在容器外面执行容器内容的 spark-submit 命令来提交应用,具体如下:
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
评论0