# Spark環境安裝教學(二)

<!--more-->

## 前言

{{< admonition info >}}
本篇文章接續前篇 **[Spark環境安裝教學](https://as183789043.github.io/theme-document-spark-install/)**，繼續往下延伸。這次要串接的是 Jupyter，有了它，寫 Spark 邏輯的過程會輕鬆不少，尤其是互動式除錯跟資料觀察，比純終端機方便非常多。
{{< /admonition >}}

## 開始之前

{{< admonition tip >}}
請先確保手上已經有一套可以正常運作的虛擬機與 Spark 環境（單節點或叢集皆可），這篇會直接沿用前篇裝好的環境繼續往下走。
{{< /admonition >}}

### 版號

|  軟體   | 版本  |
|  ----  | ----  |
| Virtual Machine   | 7.1.4（或以上） |
| Redhat ISO   |  9.8 |
| Java openjdk   |  17.0 |
| Spark  |  4.2.0 |
| Python3  |  3.11 |

## 套件版本檢查與 PIP 環境安裝

1. 升級系統預設 Python 版本（系統內建版本無法支援 4.2.0 版 Spark 的運算需求，因此必須升級）：
    ~~~bash
    sudo dnf install -y python3.11 python3.11-devel
    sudo alternatives --install /usr/bin/python3 python3 /usr/bin/python3.11 1
    ~~~
    ![point](./point.png)

2. 檢查套件版本：
    ~~~bash
    python3 --version   # Python 3.11.13
    ~~~

3. 安裝套件管理器 pip：
    ~~~bash
    sudo dnf install python3-pip   # 輸入 y 同意安裝
    ~~~
    ![pip](./pip.png)

### 建立虛擬環境（venv）

4. 建立虛擬環境：
    ~~~bash
    python3 -m venv .venv   # 會在當前目錄生成隱藏資料夾 .venv
    ~~~

5. 啟用虛擬環境：
    ~~~bash
    source .venv/bin/activate
    ~~~
    啟用成功後，會看到終端機最新一行前方多了 `(.venv)` 的標記。
    ![venv](./venv.png)

到這裡，虛擬環境已經準備就緒，接下來就可以開始安裝 PySpark 與 Jupyter-Lab 了。

## 安裝 PySpark 與 Jupyter-Lab

1. 安裝核心套件：
    ~~~bash
    pip install pyspark
    pip install jupyter-lab   # 這個版本比 jupyter 更輕量
    ~~~

2. 產生 Jupyter-Lab 設定檔，供外部連線使用（注意縮排）：
    ~~~bash
    jupyter server --generate-config   # 預設會建立檔案於 ~/.jupyter/jupyter_server_config.py
    ~~~

3. 打開設定檔 `~/.jupyter/jupyter_server_config.py`，調整接聽來源為外部：
    ~~~python
    c.ServerApp.ip = '0.0.0.0'            # 接聽外部連線
    c.ServerApp.allow_remote_access = True   # 允許外部連線
    ~~~

    {{< admonition warning >}}
    這組設定等於把 Jupyter 對外網開放，如果只在內網或個人測試機使用還好，但如果機器有對外 IP，務必搭配 Jupyter 內建的 token 驗證機制（不要手動關掉），並考慮用防火牆限制來源 IP，避免任何人都能連進來執行程式碼——這在實務環境裡是很常見的資安破口。
    {{< /admonition >}}

4. 設定環境變數：
    ~~~bash
    vim ~/.bashrc   # 編輯完 :wq 離開
        export PYSPARK_DRIVER_PYTHON=jupyter-lab
    source ~/.bashrc   # 重新讀取
    ~~~

5. 開放防火牆：
    ~~~bash
    sudo firewall-cmd --add-port=8888/tcp --permanent   # 永久參數需視情況使用
    sudo firewall-cmd --reload
    ~~~

## 啟動服務

1. 輸入指令啟動：
    ~~~bash
    pyspark   # 複製回傳的網址與 token
    ~~~
    ![token](./token.png)

2. 把回傳網址中的 `localhost`（或 `127.0.0.1`）換成主機的實際 IP，再貼到瀏覽器打開即可。
   ![UI](./ui.png)

## 串接功能測試

#### 在 Jupyter-Lab 輸入測試程式碼，觀察回傳結果

執行以下程式碼，若得到類似下圖的回傳，就代表安裝成功、環境可以正常運作：

~~~python
from pyspark.sql import SparkSession

# 手動初始化 SparkSession
spark = SparkSession.builder \
    .appName("JupyterPySparkTest") \
    .getOrCreate()

# 取得 SparkContext（若需要）
sc = spark.sparkContext

# 測試運算
print("Spark Version:", spark.version)

df = spark.createDataFrame([(1, "PySpark"), (2, "JupyterLab")], ["id", "name"])
df.show()
~~~

![result](./result.png)

## 結語
恭喜，Spark 環境已經成功擴展成更貼近實務操作的樣貌了。之後開發時，可以直接用 Jupyter 編寫與除錯邏輯，比起純終端機作業，互動性跟效率都會提升不少，尤其是在資料探索與逐步驗證的階段，感受會特別明顯。

---

> 作者: Rick  
> URL: https://as183789043.github.io/zh-tw/theme-document-spark-install-extend/  

