参考我之前的hadoop:
1、创建挂载的目录:
mkdir -p /home/spark/data
mkdir -p /home/spark/jars
mkdir -p /home/spark/logs
mkdir -p /home/spark/conf
2、拉取spark3.5.1镜像
docker pull bitnami/spark:3.5.1
3、创建了自定义网络
如果你创建hadoop的时候已经创建就不需要重复创建了
docker network create hadoop-spark-network
4、启动docker
注意你自己hadoop配置文件挂载的路径,修改 Spark Worker 容器 里面的配置/home/user/hadoop/conf
启动 Spark Master 容器
docker run -d \
--name spark-master \
--hostname spark-master \
--network hadoop-spark-network \
-p 7077:7077 \
-p 6060:8080 \
-v /home/spark/data:/opt/spark/data \
-v /home/spark/jars:/opt/spark/jars \
-v /home/spark/logs:/opt/spark/logs \
-e SPARK_MODE=master \
bitnami/spark:3.5.1
将Spark Master Web UI 的 8080
端口映射到主机的 6060
端口
启动 Spark Worker 容器
将配置从 Hadoop 容器复制到宿主机:
docker cp hadoop:/usr/local/hadoop/etc/hadoop /home/spark/hadoop-conf
启动:
docker run -it --rm \
--name spark-worker \
--hostname spark-worker \
--network hadoop-spark-network \
-p 4040:4040 \
-v /home/spark/data:/opt/spark/data \
-v /home/spark/jars:/opt/spark/jars \
-v /home/spark/logs:/opt/spark/logs \
-v /home/spark/hadoop-conf:/opt/hadoop/etc/hadoop \
-e SPARK_MODE=worker \
-e SPARK_MASTER_HOST=spark-master \
-e HADOOP_CONF_DIR=/opt/hadoop/etc/hadoop \
bitnami/spark:3.5.1
测试:
http://<your-host-ip>:6060
发现没问题,ctrl+c结束,重新启动worker容器
docker run -d \
--name spark-worker \
--hostname spark-worker \
--network hadoop-spark-network \
-p 4040:4040 \
-v /home/spark/data:/opt/spark/data \
-v /home/spark/jars:/opt/spark/jars \
-v /home/spark/logs:/opt/spark/logs \
-v /home/spark/hadoop-conf:/opt/hadoop/etc/hadoop \
-e SPARK_MODE=worker \
-e SPARK_MASTER_HOST=spark-master \
-e HADOOP_CONF_DIR=/opt/hadoop/etc/hadoop \
bitnami/spark:3.5.1
5、把hadoop加入共同网络
docker ps --format "table {{.Names}}\t{{.Networks}}"
docker network connect hadoop-spark-network hadoop
6、hadoop下创建测试文件
docker exec -it hadoop /bin/bash
mkdir -p /opt/spark-test
cd /opt
ls
赋予权限:
chown -R hadoop:hadoop /opt/spark-test
切换到 hadoop
用户并创建文件:
su - hadoop
cd /opt/spark-test
echo "Hello Spark" > test.txt
echo "This is a test file for Spark on HDFS" >> test.txt
上传文件至 HDFS:
如果之前不存在那个文件夹:
hadoop fs -put /opt/spark-test/test.txt /spark-test/
如果存在执行上面就会有提示:
然后执行下面指令即可:
hadoop fs -rm /spark-test/test.txt
hadoop fs -put /opt/spark-test/test.txt /spark-test/
验证:
hadoop fs -ls /spark-test
7、测试 Spark Shell 和 HDFS 访问
进入 Worker 容器测试 Spark Shell 和 HDFS 访问
docker exec -it spark-worker /bin/bash
spark-shell --master spark://spark-master:7077
测试 Spark Shell 中的 HDFS 访问
val text = sc.textFile("hdfs://hadoop:9000/spark-test/test.txt")
text.count()
这个可能是没有可用的资源,也可能是别的原因,可以参考第七点
这边随便建一个文件来测试,不测在hadoop的:
成功输出。
7、结束任务
可能会遇到你不正常结束命令行,会导致你的资源都在上一次的任务中,在你下一次导致即使重新开始spark任务结果发现一直在等待,你看那个spark网站就会看到新任务没有被分配任何资源,核数是0,因为你之前的任务还占用着资源,所以使用完建议关闭一下。
// 停止 SparkContext
sc.stop()
// 停止 SparkSession
spark.stop()