Post

🚀 Setup Spark Cluster

Hướng dẫn cài đặt và cấu hình Spark Standalone Cluster với 1 Master + 2 Worker node.

🚀 Setup Spark Cluster

🚀 Setup Spark Standalone Cluster (2 nodes)

Spark có thể chạy trên nhiều cluster manager khác nhau như Standalone, YARN, Mesos, Kubernetes.

Trong bài viết này, mình sẽ dựng Spark Standalone Cluster 2 node ( với 1 node vừa đóng vai trò Master, vừa đóng vai trò Worker, và 1 node chỉ đóng vai trò Worker). Đây là setup cơ bản để học tập, thử nghiệm nhé.

📌 Môi trường

  • Master + Worker: 100.83.165.19, ở đây máy này đóng cả 2 vai trò Master và Worker nhé. (Spark ở /home/hien/spark, RAM 16GB, 8 cores)
  • Worker: 100.112.156.29 (Spark ở /home/noname/dev/spark, RAM 8GB, 4 cores)
  • Cả 2 máy đều có Java (openjdk-11-jdk hoặc openjdk-21-jdk) và PySpark.
  • Đã setup SSH key không mật khẩu từ Master → Worker.

1. Cài Spark Binary

Trên mỗi máy tải và giải nén Spark (hoặc copy từ master):

1
2
3
wget -c https://archive.apache.org/dist/spark/spark-3.5.0/spark-3.5.0-bin-hadoop3.tgz
tar -xvzf spark-3.5.0-bin-hadoop3.tgz
mv spark-3.5.0-bin-hadoop3 ~/spark

2. Thiết lập biến môi trường

Thêm vào ~/.bashrc:

Master (100.83.165.19)

1
2
3
4
export SPARK_HOME=/home/hien/spark
export PATH=$SPARK_HOME/bin:$PATH
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64

Worker (100.112.156.29)

1
2
3
4
export SPARK_HOME=/home/noname/dev/spark
export PATH=$SPARK_HOME/bin:$PATH
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64


3. Cấu hình Spark Master

File: $SPARK_HOME/conf/spark-env.sh (Master)

1
2
3
export SPARK_MASTER_HOST=100.83.165.19
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64

File: $SPARK_HOME/conf/spark-env.sh (Worker)

1
2
3
export SPARK_LOCAL_IP=100.112.156.29
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64


4. Start / Stop Cluster Scripts

start-cluster.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/bin/bash
MASTER=100.83.165.19
SPARK_HOME_MASTER=/home/hien/spark
SPARK_HOME_WORKER=/home/noname/dev/spark

echo ">>> Starting Spark Master ..."
$SPARK_HOME_MASTER/sbin/start-master.sh

echo ">>> Starting Worker on Master ..."
$SPARK_HOME_MASTER/sbin/start-worker.sh spark://$MASTER:7077

echo ">>> Starting Worker on Worker node ..."
ssh noname@100.112.156.29 "$SPARK_HOME_WORKER/sbin/start-worker.sh spark://$MASTER:7077"

echo ">>> Cluster started. Check UI at http://$MASTER:8080"

stop-cluster.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/bin/bash
MASTER=100.83.165.19
SPARK_HOME_MASTER=/home/hien/spark
SPARK_HOME_WORKER=/home/noname/dev/spark

echo ">>> Stopping Worker on Worker node ..."
ssh noname@100.112.156.29 "$SPARK_HOME_WORKER/sbin/stop-worker.sh"

echo ">>> Stopping Worker on Master ..."
$SPARK_HOME_MASTER/sbin/stop-worker.sh

echo ">>> Stopping Spark Master ..."
$SPARK_HOME_MASTER/sbin/stop-master.sh

echo ">>> Cluster stopped."

Cấp quyền:

1
2
chmod +x start-cluster.sh stop-cluster.sh


  • Note:

    Nếu có nhiều worker node :

    • Nếu bạn muốn chạy $SPARK_HOME/sbin/start-all.sh (nó sẽ tự start master và các workers theo danh sách trong conf/workers).
    • Khi bạn có nhiều worker cố định và muốn start/stop đồng loạt bằng 1 lệnh (start-all.sh, stop-all.sh), thay vì viết script riêng thì cấu hình file conf/workers

    Ví dụ conf/workers:

    1
    2
    
      100.83.165.19
      100.112.156.29
    

    Rồi chỉ cần chạy:

    1
    2
    
      $SPARK_HOME/sbin/start-all.sh
      $SPARK_HOME/sbin/stop-all.sh
    

5. Kiểm tra Web UI

Spark Cluster


6. Chạy job demo

wordcount.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from pyspark.sql import SparkSession

spark = SparkSession.builder.appName("WordCountDemo").getOrCreate()

data = [
    "hello spark cluster",
    "spark makes big data easy",
    "hello world",
    "big data big challenge"
]

rdd = spark.sparkContext.parallelize(data)
word_counts = (rdd.flatMap(lambda line: line.split(" "))
                  .map(lambda word: (word, 1))
                  .reduceByKey(lambda a, b: a + b))

for word, count in word_counts.collect():
    print(f"{word}: {count}")

spark.stop()

Chạy trên Master:

1
2
$SPARK_HOME/bin/spark-submit --master spark://100.83.165.19:7077 wordcount.py


✅ Kết quả

  • Cluster 2 node, tổng cộng 12 cores / 21.1 GiB RAM
  • Spark Master: spark://100.83.165.19:7077
  • Worker1: 192.168.1.61 (8 cores, 14.4 GiB)
  • Worker2: 192.168.0.5 (4 cores, 6.7 GiB)
  • Job demo chạy thành công, hiển thị trong Spark WebUI.

Như vậy, bạn đã có một cluster Spark nhỏ gọn, sẵn sàng chạy các job phân tán với PySpark rồi.

This post is licensed under CC BY 4.0 by the author.