Ubuntu16.04 下多節點集群的 Spark 及 Hadoop HDFS 安裝、配置及運行(二)

多節點集群的 Spark + HDFS 部署

Posted by laochanlam on May 18, 2020

前言

本文是 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 的節點訊息

Imgur

這樣就成功的在多節點間簡單的部署了 Spark,可以透過提交任務到 master 來來進行多節點的 Spark 的運算。

HDFS 部署

HDFS 我們需要在 master 和 slaves 先設定好配置文件,主要是設定 core-site.xmlslaves 這兩個文件

$ 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 的部署 Imgur Imgur

在 Spark 以及 Hadoop HDFS 布署完成之後,我們就可以在自己建立的多節點集群中使用 Spark + HDFS 的分布式存儲及計算解決方案了。

總結

在本文(二)中介紹了 Spark 以及 Hadoop HDFS 的簡單部署過程以及方法,在(一)中介紹了安裝方法,透過這兩篇文章的方法即可部署 Spark 和 HDFS,適合在私人的集群中進行部署並使用 Spark + HDFS 的分布式存儲及計算解決場景方案。