项目背景
在本地开发spark但是没有集群环境又想测试集群
模拟一个master节点两个worker节点的部署方式
1、文件目录结构
task 文件夹
存放一些py文件
run.py
需要向spark提交的python文件
docker-compose.yaml
容器编排配置文件
2、docker-compose.yaml文件
version: '3'
services:
master:
image: bitnami/spark
hostname: master
container_name: master
environment:
- SPARK_MODE=master
- SPARK_RPC_AUTHENTICATION_ENABLED=no
- SPARK_RPC_ENCRYPTION_ENABLED=no
- SPARK_LOCAL_STORAGE_ENCRYPTION_ENABLED=no
- SPARK_SSL_ENABLED=no
volumes:
- task_data:/opt/share
ports:
- '8080:8080'
- '4040:4040'
- '8088:8088'
- '8042:8042'
- '9870:9870'
- '19888:19888'
- '7077:7077'
spark-worker-1:
image: bitnami/spark
hostname: worker1
container_name: worker1
environment:
- SPARK_MODE=worker
- SPARK_MASTER_URL=spark://master: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
volumes:
- task_data:/opt/share
ports:
- '8081:8080'
spark-worker-2:
image: bitnami/spark
hostname: worker2
container_name: worker2
environment:
- SPARK_MODE=worker
- SPARK_MASTER_URL=spark://master: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
volumes:
- task_data:/opt/share
ports:
- '8082:8081'
## 本地装pyspark实在是太麻烦了,直接用容器跑spark任务,下面这个容器就是专门跑任务的
## 集群起来以后,单独启动这个容器就可以在容器里跑任务了
## 这样容器之间通信也会很方便
spark-task:
image: bitnami/spark
working_dir: /opt/share
hostname: task
container_name: task
command: >
bash -c "spark-submit --master spark://master:7077 run.py"
volumes:
- ./:/opt/share
volumes:
task_data:
3、启动"集群"
docker-compose up
4、启动任务容器
docker-compose up spark-task
run.py文件
from pyspark import SparkConf, SparkContext
conf = SparkConf().setAppName('My App')
sc = SparkContext(conf=conf)
count = sc.range(1, 1000 * 1000 * 100).filter(lambda x: x > 100).count()
print('count: ', count)
提交任务到spark集群
使用 spark-submit 命令提交 Python 脚本,指定 --master 参数提交到集群上。如果未指定该参数,则默认以本地模式运行。
spark-submit --master spark://master:7077 run.py
当指定为 spark://host:port 时,应用提交到 Spark 自带的独立集群管理器(Standalone)上运行,默认端口 7077;如果使用 Apache Mesos 集群管理器,需指定为 mesos://host:port,默认端口 5050;使用 Hadoop YARN 则需指定为 yarn。
应用运行时,SparkContext 实例会启动应用的 Web UI,默认端口 4040。你可以在此网址查看应用的作业(Job)、组成作业的所有步骤(Stage)、持久化的 RDD 以及执行器状态等信息,这对于应用性能评估有巨大帮助。运行结束后,SparkContext 实例消亡,同时会关闭此 Web UI。