我們在 如何在 local 端跑 spark cluster 中的 Spark application 是用 Standalone 模式 來跑的,Standalone 模式是 Spark 內建的集群模式,能讓我們快速的搭建可以啟動 Spark 集群起來,其實除了這個以外,Spark 還有支持:
- Apache Mesos – 一個通用的叢集管理器,也可以運行 Hadoop MapReduce 和服務應用程式(已棄用)。
- Hadoop YARN – Hadoop 3 的資源管理者。
- Kubernetes – 一套能完成自動化部署、擴充和管理的 open-source 容器化工具。
所以接下來 2 篇文章,我們就來看看如何把 Spark application run 在 local 端用 docker 建置的 Hadoop + Yarn cluster 上,第 1 篇先把所有步驟列出來,下一篇在來好好說明為什麼要做這些事。
啟動 Hadoop Cluster
1. clone git 然後 cd 到 cluster/hadoop 底下
git clone https://github.com/tshine73/docker-spark-cluster.git
cd docker-spark-cluster/cluster/hadoop
2. build image
第一次 build 會有點久請耐心等待。
docker build -t hadoop-cluster:3.4.1 .
若不幸 Hadoop 或 Spark 下載連結失效導致建立 image 失敗,可直接使用我在 Docker hub 上的 image 來使用。
docker push shinest/hadoop-cluster:3.4.1
3. 用 docker compose 啟動 Hadoop cluster
docker compose -p data up -d
驗證一下
好啦!一切順利的話應該會看到你的 hadoop cluster 成功 run 起來了,總共有 3 台,1 台 master (為 hadoop 的 namenode
) 還有 2 台 worker (為 hadoop 的 datanode
),

首先我們可以連到 hadoop UI 來看一下我們的 hadoop 有沒有正常啟動,有的話你會看到類似下面這張圖,

在來我們可以嘗試往 hadoop 丟資料,然後看能否在另一台節點下載的資料,首先先使用以下指令連進去 master conatiner,
docker exec -it data-hadoop-master-1 /bin/bash
然後放個資料來到 hadoop 裡,
hdfs dfs -put /opt/workspace/apps/main.py /main.py
接下來開另一個 CLI 連到任一 worker container 中並執行 get 指令看是否能取到檔案。
docker exec -it data-hadoop-worker-a-1 /bin/bash
hdfs dfs -ls /
hdfs dfs -get /main.py .
ls -alh

在 YARN 上跑個 spark applicatoin 吧
接下來我們可以在不改 code 的情況下,把 第一個 SPARK APPLICATION 中的 spark application 執行在 Hadoop 的 YARN 上面,但執行前你需要參考 第一個 SPARK APPLICATION 文章中的 data
段落,把資料準備好,然後在把資料都放在 Hadoop 裡,
首先一樣先連到 master container ,
docker exec -it data-hadoop-master-1 /bin/bash
然後執行下面指令,
hdfs dfs -mkdir -p /opt/workspace
hdfs dfs -put /opt/workspace/* /opt/workspace
確認一下有沒有放好,
hdfs dfs -ls /opt/workspace
hdfs dfs -ls /opt/workspace/data/input/

然後執行 spark 程式,
spark-submit --master yarn \
--deploy-mode client \
--driver-memory 512M \
--executor-memory 512M \
/opt/workspace/apps/main.py
執行過程中我們可以到 YARN UI 上看執行狀況,

完成後,看一下 hadoop 的 output 資料夾下有沒有結果。
hdfs dfs -ls /opt/workspace/data/output/movie_rating_count/

最後可用以下指令 shutdown Hadoop cluster。
docker compose -p data down
應該成功了吧
有的話我們就成功在 local 端用 docker 啟動 hadoop 集群起來啦!也能把 第一個 Spark Application 中的 spark 程式 run 在這個集群的 YARN 上!
下篇文就來說明一下相關程式的細節。