前言
本文是 Spark + HDFS 系統的第二篇文章,第一篇介紹了 Spark 以及 Hadoop 的安裝,在本文章(二)中會介紹如何在多節點的集群上進行設置以及部署。
*文章中部分名詞在解釋概念時因方便讀者理解並沒有採用 Spark/HDFS 的專用名詞,採用了便能意會的詞彙如 master/slave 等。
前置工作
Spark 和 HDFS 的部署十分簡單,但是我們需要做一些設置。
Hostname
首先我們要對每個機器加入整個集群的 Hostname 列表設置,方便我們可以在 Spark 和 Hadoop 中分辨出各個機器。
首先透過設置 Hosts 文件
$ sudo vim /etc/hosts
下列例子中因筆者有多台機器,所以把 hostname 設置為 worker1~worker9,讀者可以按照自己的網域進行設置。
127.0.0.1 localhost
10.0.0.1 worker1
10.0.0.2 worker2
10.0.0.3 worker3
10.0.0.4 worker4
10.0.0.5 worker5
10.0.0.6 worker6
10.0.0.7 worker7
10.0.0.8 worker8
10.0.0.9 worker9
# The following lines are desirable for IPv6 capable hosts
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
SSH key
因為我們要對多個節點進行管理,而這些節點之間的通訊都離不開 ssh,在我們進行 ssh 時,有些人因為各位原因會選擇每次輸入密碼,但在程序之間進行溝通的時候,我們不能採取這種 interactive 的方法,我們需要提前讓這些機器 “認識彼此” 以及 “驗證對方”。
我們以 worker1 作為例子,首先需要在機器上進行 ssh key 的生成
$ ssh-keygen -t rsa
然後把你剛剛生成的 key 放到別人的 “認可列表” 當中(也可包括自己)
$ ssh 10.0.0.1 mkdir -p .ssh && \
ssh 10.0.0.2 mkdir -p .ssh && \
ssh 10.0.0.3 mkdir -p .ssh && \
ssh 10.0.0.4 mkdir -p .ssh && \
ssh 10.0.0.5 mkdir -p .ssh && \
ssh 10.0.0.6 mkdir -p .ssh && \
ssh 10.0.0.7 mkdir -p .ssh && \
ssh 10.0.0.8 mkdir -p .ssh && \
ssh 10.0.0.9 mkdir -p .ssh
$ cat .ssh/id_rsa.pub | ssh 10.0.0.1 'cat >> .ssh/authorized_keys' &&\
cat .ssh/id_rsa.pub | ssh 10.0.0.2 'cat >> .ssh/authorized_keys' &&\
cat .ssh/id_rsa.pub | ssh 10.0.0.3 'cat >> .ssh/authorized_keys' &&\
cat .ssh/id_rsa.pub | ssh 10.0.0.4 'cat >> .ssh/authorized_keys' &&\
cat .ssh/id_rsa.pub | ssh 10.0.0.5 'cat >> .ssh/authorized_keys' &&\
cat .ssh/id_rsa.pub | ssh 10.0.0.6 'cat >> .ssh/authorized_keys' &&\
cat .ssh/id_rsa.pub | ssh 10.0.0.7 'cat >> .ssh/authorized_keys' &&\
cat .ssh/id_rsa.pub | ssh 10.0.0.8 'cat >> .ssh/authorized_keys' &&\
cat .ssh/id_rsa.pub | ssh 10.0.0.9 'cat >> .ssh/authorized_keys'
這樣之後你在 worker1 上 ssh 到其他 worker 上就不需要密碼了,滿足 其他 worker 對 master 連接進來的許可,若讀者想把所以 worker 之間互通,可以在每個 worker 上進行同樣的操作。
Spark 部署
我們確定完這些機器之間的連接是互通的之後,就可以在 master node 上開啓 master,在這裡我們選用 worker1 充當 master
$ $SPARK_HOME/sbin/start-master.sh
SPARK master 預設採用的是 7077 的端口,而 spark://worker1:7077
就是我們剛剛開起來的 Spark 路徑。
把 master 開起來之後, worker2~worker9 可以連接到 spark://worker1:7077
中,如下 (當然亦可以在 Worker1 設定 slaves 統一進行 start-all.sh
)
$ $SPARK_HOME/sbin/start-slave.sh spark://worker1:7077
在進行完 master & slave 機器的布署後,我們可以透過 Spark 提供的 web UI 來查看 Spark 端點訊息,這裡預設的端口為 8080,在 master 瀏覽器上輸入即可查詢
http://10.0.0.1:8080/
之後我們在 worker1 上通過 50070 端口看到類似的介面代表 Spark 運行成功,此之亦能查詢 slaves 的節點訊息
這樣就成功的在多節點間簡單的部署了 Spark,可以透過提交任務到 master 來來進行多節點的 Spark 的運算。
HDFS 部署
HDFS 我們需要在 master 和 slaves 先設定好配置文件,主要是設定 core-site.xml
和 slaves
這兩個文件
$ vim $HADOOP_HOME/etc/hadoop/core-site.xml
我們把 master 設定為 worker1 (10.0.0.1),注意這個設定文件必須要在每個 worker (master/slave) 都擁有一份,以指定 hdfs 的路徑。
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://10.0.0.1:9000</value>
</property>
</configuration>
然後在 master (worker1) 的 slaves 的文件之中把所用到的 slave 加入(也可加入自己)
$ vim $HADOOP_HOME/etc/hadoop/slaves
worker1
worker2
worker3
worker4
worker5
worker6
worker7
worker8
worker9
在第一次運行 HDFS 之前,我們先要進行 formatting。
$ hdfs namenode -format
之後就可以在 master (worker1) 中開啓 HDFS,用 Hadoop 提供的腳本即可部署 HDFS
$ $HADOOP_HOME/sbin/start-dfs.sh
同樣地, Hadoop 亦有提供 web UI 可以進行節點訊息的確認, Hadoop 的預設端口為 50070
http://10.0.0.1:50070/
看到以下介面後,即完成 HDFS 的部署
在 Spark 以及 Hadoop HDFS 布署完成之後,我們就可以在自己建立的多節點集群中使用 Spark + HDFS 的分布式存儲及計算解決方案了。
總結
在本文(二)中介紹了 Spark 以及 Hadoop HDFS 的簡單部署過程以及方法,在(一)中介紹了安裝方法,透過這兩篇文章的方法即可部署 Spark 和 HDFS,適合在私人的集群中進行部署並使用 Spark + HDFS 的分布式存儲及計算解決場景方案。