在 windows 安裝 Spark on Yarn

自從在 windows 安裝 Spark Standalone 之後。就開始有把 Spark on Yarn 也安裝在 Windows 上的念頭? 於是在工作閒暇之餘,開始這次的踩雷之旅。

部署前的準備

Cluster 主機的規劃

先準備三台 windows 的主機,其規劃如下:

主機名稱 IP 說明
master 192.168.10.1 運行 name node, resource manager
slave01 192.168.10.2 運行 node manager, data node
slave02 192.168.10.3 運行 node manager, data node

設定 hosts

在 windows 中, hosts 檔案是放在 C:\Windows\System32\drivers\etc 之下。
修改 hosts,如果 hosts 不存在則新增一個並複製到每一台主機上。

C:\Windows\System32\drivers\etc\hosts
1
2
3
192.168.10.1 master
192.168.10.2 slave01
192.168.10.3 slave02

開始部署

安裝所需軟體

我們要部署的版本是 Spark 2.2。在部署之前,依照官方網站的需求,要先安裝這些軟體在每一台主機上。

  • Java 8
  • Scala 2.11.x (如果你不會用到,可以不用裝)
  • Python 2.7/3.4 或之後的版本 (如果你不會用到,可以不用裝)

<a name="install_hodoop"></a > 安裝 Hadoop

  1. Hadoop 的官方網站下載,預先編譯好的版本,
    在這我們選擇 hadoop-2.7.4.tgz。
  2. 下載完成後,我們使用解壓縮軟體,把它解開到你所想要放的位置。在這裡我們把它解壓縮到 D 磁碟下,並且改名為 hadoop

在 windows 下,還需要編譯 hadoop 的原始碼來產生 dll 檔及 exe 檔。所幸,已經有神人幫我們編譯好,連到 winutils,選擇 hadoop-2.7.1 目錄下的 bin。把全部的檔案都下載下來,並且放到 hadoop 目錄下的 bin。

安裝 Spark

  1. Spark 的官方網站下載,預先編譯好的版本,
    在這我們選擇 spark-2.2.0-bin-hadoop2.7.tgz。
  2. 下載完成後,我們使用解壓縮軟體,把它解開到你所想要放的位置。在這裡我們把它解壓縮到 D 磁碟下,並且改名為 spark

設定環境變數

在安裝完後,需要設定環境變數,可以從 控制台 -> 系統 -> 進階系統設定 -> 進階 -> 環境變數 中進行設定.
以下是我們需要設定的環境變數

環境變數 內容值 說明
JAVA_HOME Java 的安裝目錄 設定 JAVA 的家目錄
CLASSPATH %JAVA_HOME%\lib 設定 JAVA 的類別路徑
SPARK_HOME SPARK 的安裝目錄 設定 SPARK 的家目錄
HADOOP_HOME HADOOP 的安裝目錄 設定 HADOOP 的家目錄
HADOOP_CONF_HOME %HADOOP_HOME%/etc/hadoop 設定 HADOOP 的設定檔目錄
YARN_CONF_HOME %HADOOP_HOME%/etc/hadoop 設定 YARN 的設定檔目錄

接著將這些值附加在 PATH 之後

1
%JAVA_HOME%\bin;%SPARK_HOME%\bin;%SPARK_HOME%\sbin;%HADOOP_HOME%\bin

設定 Hadoop

%HADOOP_HOME%/etc/hadoop 目錄來進行設定,總共有以下 5 個文件需要設定:

設定 slave 的 host 或 IP

%HADOOP_HOME%/etc/hadoop/slave
1
2
slave01
slave02

設定 core-site.xml

%HADOOP_HOME%/etc/hadoop/core-site.xml
1
2
3
4
5
6
7
8
9
10
11
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000/</value>
</property>
<!— 設定 hadoop 的暫存目錄—>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/D:/workspaces/hadoop</value>
</property>
</configuration>

設定 hdfs-site.xml

%HADOOP_HOME%/etc/hadoop/hdfs-site.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<configuration>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>master:9001</value>
</property>
<!— 設定 hadoop name node 的工作目錄—>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/D:/workspaces/hadoop/dfs/name</value>
</property>
<!— 設定 hadoop data node 的工作目錄—>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/D:/workspaces/hadoop/dfs/data</value>
</property>

<!— 預設值為3,因為我們只有2台slave 主機,故設為2—>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>

</configuration>

設定 mapred-site.xml

%HADOOP_HOME%/etc/hadoop/mapred-site.xml
1
2
3
4
5
6
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>

設定 yarn-site.xml

%HADOOP_HOME%/etc/hadoop/yarn-site.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<configuration>

<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>master:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>master:8030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>master:8035</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>master:8033</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>master:8088</value>
</property>

</configuration>

最後再把設定檔同步到其它台機器。

啟動 Hadoop

Master

如果是第一次執行,需要先做 name node 的格式化

1
hadoop namenode -format

再編輯 %HADOOP_HOME%\sbin\start-dfs.cmd ,把啟動 data node 的指令註解起來。

%HADOOP_HOME%\sbin\start-dfs.cmd
1
2
start "Apache Hadoop Distribution" hadoop namenode
rem start "Apache Hadoop Distribution" hadoop datanode

接著再編輯 %HADOOP_HOME%\sbin\start-yarn.cmd ,把啟動 node manager 的指令註解起來.

%HADOOP_HOME%\sbin\start-yarn.cmd
1
2
start "Apache Hadoop Distribution" yarn resourcemanager
rem start "Apache Hadoop Distribution" yarn nodemanager

編輯完後, 再以系統管理員身分執行來執行這二個檔。
可以使用 jps 指令來查看啟動的程序,正常的話,會有以下這些程序。

1
2
3
10024 ResourceManager
13304 NameNode
3212 Jps

Slave

編輯 %HADOOP_HOME%\sbin\start-dfs.cmd ,把啟動 name node 的指令註解起來。

%HADOOP_HOME%\sbin\start-dfs.cmd
1
2
rem start "Apache Hadoop Distribution" hadoop namenode
start "Apache Hadoop Distribution" hadoop datanode

接著再編輯 %HADOOP_HOME%\sbin\start-yarn.cmd ,把啟動 resource manager 的指令註解起來。

%HADOOP_HOME%\sbin\start-yarn.cmd
1
2
rem start "Apache Hadoop Distribution" yarn resourcemanager
start "Apache Hadoop Distribution" yarn nodemanager

編輯完後, 以 系統管理員身分執行 來執行這二個檔。
可以使用 jps 指令來查看啟動的程序, 正常的話, 會有以下這些程序。

1
2
3
10024 ResourceManager
15372 NodeManager
15392 Jps

檢視 WebUI

在瀏覽器上鍵入 http://master:8088/cluster/nodes ,就可以看到 WebUI。上面會顯示目前 Hadoop Cluster 的情況。

Spark on Yarn Web UI

驗證

在 YARN 模式下,有二種運行模式 yarn-client 及 yarn-cluster。
有關它們的區別可以參考 Spark:Yarn-cluster 和 Yarn-client 区别与联系

我們使用 Spark 附的範例程式 SparkPi 來驗證是否可以正常運行。到 SPARK_HOME 之下,執行以下指令,你可以選擇是要執行 Java 版本或是 Python 版本。

Java 版本

1
2
3
4
# yarn-client 模式
spark-submit —class org.apache.spark.examples.SparkPi —master yarn-client examples/jars/spark-examples_2.11-2.2.0.jar 100
# yarn-cluster 模式
spark-submit —class org.apache.spark.examples.SparkPi —master yarn-cluster examples/jars/spark-examples_2.11-2.2.0.jar 100

Python 版本

1
2
3
4
# yarn-client 模式
spark-submit --master yarn-client examples/src/main/python/pi.py 100
# yarn-cluster 模式
spark-submit --master yarn-cluster examples/src/main/python/pi.py 100

接著打開 WebUI, 鍵入 http://master:8088/cluster/apps 就可以看到運行結果。

Spark on Yarn Web UI

曾經踩過的坑

出現 xxxxx on HDFS should be writable. 的訊息
這個是指在 HDFS 文件系統下,沒有寫入目錄的權限,解決方式可以用以下指令來改變目錄的權限:

1
winutils chmod 766 -R <目錄名稱>

系統無法找到指定的批次標籤 - resourcemanager
可能是批次檔的行結尾字元不正確,可以檢查行結尾字元是否為 windows 格式: <CR><LF>

出現 doesn't satisfy minimum allocations 的訊息
這是指所分配的資源不足, 或是不符合最小需求。可以在 yarn-site.xml 中修改資源設定。

yarn-site.xml
1
2
3
4
5
6
7
8
9
10
11
12
<!-- 分配記憶體資源, 至少要大於 1024 -->
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>2048</value>
</property>

<!-- 分配CPU的核心資源, 通常是CPU的核心數-->
<property>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>8</value>
</property>

出現 Datanode denied communication with namenode because hostname cannot be resolved 訊息
這是因為 DNS 反解析不正確所造成的。你可以在 hdfs-site.xml 中關掉 DNS 反查。

hdfs-site.xml
1
2
3
4
<property>
<name>dfs.namenode.datanode.registration.ip-hostname-check</name>
<value>false</value>
</property>

出現 java.lang.UnsatisfiedLinkError: org.apache.hadoop.io.nativeio.NativeIO 訊息
找不到或是缺少相關的 DLL 檔。可以參照 安裝 Hadoop, 安裝相關的 DLL 檔。