Hadoop分布式集群搭建


基於樹莓派和台式機搭建集群,但是樹莓派的性能特別差,不建議使用,但還是記錄下來,拓展到多台機器大同小異。

搭建過程參考廈門大學數據庫實驗室的網站。http://dblab.xmu.edu.cn/blog/install-hadoop-cluster/

用到的設備有關Centos系統的筆記本,centos系統的樹莓派兩個,ubuntu的台式機一個,網線四根,交換機一個。

安裝總體過程:

  1. 選定一台機器作為 Master
  2. 在 Master 節點上配置 hadoop 用戶、安裝 SSH server、安裝 Java 環境
  3. 在 Master 節點上安裝 Hadoop,並完成配置
  4. 在其他 Slave 節點上配置 hadoop 用戶、安裝 SSH server、安裝 Java 環境
  5. 將 Master 節點上的 /usr/local/hadoop 目錄復制到其他 Slave 節點上
  6. 在 Master 節點上開啟 Hadoop

1.創建Hadoop賬戶

 如果你安裝 CentOS 的時候不是用的 “hadoop” 用戶,那么需要增加一個名為 hadoop 的用戶。

打開終端

    su              # 上述提到的以 root 用戶登錄
    useradd -m hadoop -s /bin/bash   # 創建新用戶hadoop

接着使用如下命令修改密碼,按提示輸入兩次密碼,可簡單的設為 “hadoop”(密碼隨意指定,若提示“無效的密碼,過於簡單”則再次輸入確認就行):

 

passwd hadoop

 可為 hadoop 用戶增加管理員權限,方便部署,修改文件內容

    visudo

添加上一行內容后,先按一下鍵盤上的 ESC 鍵,然后輸入 :wq (輸入冒號還有wq,這是vi/vim編輯器的保存方法),再按回車鍵保存退出就可以了。

 最后注銷當前用戶(點擊屏幕右上角的用戶名,選擇退出->注銷),在登陸界面使用剛創建的 hadoop 用戶進行登陸。(如果已經是 hadoop 用戶,且在終端中使用 su 登錄了 root 用戶,那么需要執行 exit 退出 root 用戶狀態)

2安裝SSH

集群、單節點模式都需要用到 SSH 登陸(類似於遠程登陸,你可以登錄某台 Linux 主機,並且在上面運行命令),一般情況下,CentOS 默認已安裝了 SSH client、SSH server

 若需要安裝,則可以通過 yum 進行安裝(安裝過程中會讓你輸入 [y/N],輸入 y 即可):

    sudo yum install openssh-clients
    sudo yum install openssh-server

 接着執行如下命令測試一下 SSH 是否可用:

    ssh localhost

此時會有如下提示(SSH首次登陸提示),輸入 yes 。然后按提示輸入密碼 hadoop,這樣就登陸到本機了。 

但這樣登陸是需要每次輸入密碼的,我們需要配置成SSH無密碼登陸比較方便。

首先輸入 exit 退出剛才的 ssh,就回到了我們原先的終端窗口,然后利用 ssh-keygen 生成密鑰,並將密鑰加入到授權中:

    exit                           # 退出剛才的 ssh localhost
    cd ~/.ssh/                     # 若沒有該目錄,請先執行一次ssh localhost
    ssh-keygen -t rsa              # 會有提示,都按回車就可以
    cat id_rsa.pub >> authorized_keys  # 加入授權
    chmod 600 ./authorized_keys    # 修改文件權限

此時再用 ssh localhost 命令,無需輸入密碼就可以直接登陸了,如下圖所示。

3安裝Java

    sudo yum install java-1.8.0-openjdk java-1.8.0-openjdk-devel

 查看安裝路徑,紅色以前的部分為安裝路徑

rpm -ql java-1.7.0-openjdk-devel | grep '/bin/javac'
 
        

 

接着需要配置一下 JAVA_HOME 環境變量,為方便,我們在 ~/.bashrc 中進行設置

    vim ~/.bashrc

在文件最后面添加如下單獨一行(指向 JDK 的安裝位置),並保存下面的第一行:

 

使變量生效

    source ~/.bashrc    # 使變量設置生效

 檢驗是否正確

echo $JAVA_HOME     # 檢驗變量值
java -version
$JAVA_HOME/bin/java -version  # 與直接執行 java -version 一樣

 

此時,其他的節點也要作如上的操作。

4配置局域網

使用交換機和網線將電腦連接起來。

添加網絡,配置ip,每個節點都要設置網絡,例如主節點設置的ip為192.168.0.1,其他節點可以三192.168.0.2等,子網掩碼為255.255.255.0,網關設置為和主節點的ip一樣。

添加完后可以ping命令,,檢查是否在一個局域網內。

為了便於區分,可以修改各個節點的主機名(在終端標題、命令行中可以看到主機名,以便區分)。在 Ubuntu/CentOS 7 中,我們在 Master 節點上執行如下命令修改主機名(即改為 Master,注意是區分大小寫的):

    sudo vim /etc/hostname

 

然后執行如下命令修改自己所用節點的IP映射:

 

    sudo vim /etc/hosts

 

我們在 /etc/hosts 中將該映射關系填寫上去即可,如下圖所示(一般該文件中只有一個 127.0.0.1,其對應名為 localhost,如果有多余的應刪除,特別是不能有 “127.0.0.1 Master” 這樣的記錄).

修改完成后需要重啟一下,重啟后在終端中才會看到機器名的變化。接下來的教程中請注意區分 Master 節點與 Slave 節點的操作。

需要在所有節點上完成網絡配置。如上面講的是 Master 節點的配置,而在其他的 Slave 節點上,也要對 /etc/hostname(修改為 Slave1、Slave2 等) 和 /etc/hosts(跟 Master 的配置一樣)這兩個文件進行修改! 繼續下一步配置前,請先完成所有節點的網絡配置,修改過主機名的話需重啟才能生效

5 SSH無密碼登陸節點

這個操作是要讓 Master 節點可以無密碼 SSH 登陸到各個 Slave 節點上。

首先生成 Master 節點的公匙,在 Master 節點的終端中執行(因為改過主機名,所以還需要刪掉原有的再重新生成一次):

cd ~/.ssh               # 如果沒有該目錄,先執行一次ssh localhost
rm ./id_rsa*            # 刪除之前生成的公匙(如果有)
ssh-keygen -t rsa       # 一直按回車就可以

 在Master節點上運行

    cat ./id_rsa.pub >> ./authorized_keys

 完成后可執行 ssh Master 驗證一下(可能需要輸入 yes,成功后執行 exit 返回原來的終端)。接着在 Master 節點將上公匙傳輸到 全部的Slave 節點:

    scp ~/.ssh/id_rsa.pub hadoop@Slave1:/home/hadoop/

scp 是 secure copy 的簡寫,用於在 Linux 下進行遠程拷貝文件,類似於 cp 命令,不過 cp 只能在本機中拷貝。執行 scp 時會要求輸入 Slave1 上 hadoop 用戶的密碼(hadoop),輸入完成后會提示傳輸完畢。

 

接着在 Slave1 節點上,將 ssh 公匙加入授權:

mkdir ~/.ssh       # 如果不存在該文件夾需先創建,若已存在則忽略
cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
rm ~/id_rsa.pub    # 用完就可以刪掉了

 

如果有其他 Slave 節點,也要執行將 Master 公匙傳輸到 Slave 節點、在 Slave 節點上加入授權這兩步。

這樣,在 Master 節點上就可以無密碼 SSH 到各個 Slave 節點了,可在 Master 節點上執行如下命令進行檢驗,如下圖所示:

6安裝Hadoop

 

下載時請下載 hadoop-2.x.y.tar.gz 這個格式的文件,這是編譯好的

我們選擇將 Hadoop 安裝至 /usr/local/ 中:

sudo tar -zxf ~/下載/hadoop-2.6.0.tar.gz -C /usr/local    # 解壓到/usr/local中
cd /usr/local/
sudo mv ./hadoop-2.6.0/ ./hadoop            # 將文件夾名改為hadoop
sudo chown -R hadoop:hadoop ./hadoop        # 修改文件權限

Hadoop 解壓后即可使用。輸入如下命令來檢查 Hadoop 是否可用,成功則會顯示 Hadoop 版本信息: 

cd /usr/local/hadoop
./bin/hadoop version

 

將 Hadoop 安裝目錄加入 PATH 變量中,這樣就可以在任意目錄中直接使用 hadoo、hdfs 等命令了,如果還沒有配置的,需要在 Master 節點上進行配置。首先執行 vim ~/.bashrc,加入一行:

export PATH=$PATH:/usr/local/hadoop/bin:/usr/local/hadoop/sbin

 保存后執行 source ~/.bashrc 使配置生效。

7配置集群/分布式環境

集群/分布式模式需要修改 /usr/local/hadoop/etc/hadoop 中的5個配置文件,更多設置項可點擊查看官方說明,這里僅設置了正常啟動所必須的設置項: slaves、core-site.xmlhdfs-site.xmlmapred-site.xmlyarn-site.xml

1, 文件 slaves,將作為 DataNode 的主機名寫入該文件,每行一個,默認為 localhost,所以在偽分布式配置時,節點即作為 NameNode 也作為 DataNode。分布式配置可以保留 localhost,也可以刪掉,讓 Master 節點僅作為 NameNode 使用。

 

本教程讓 Master 節點僅作為 NameNode 使用,因此將文件中原來的 localhost 刪除,只添加一行內容:Slave1。

2, 文件 core-site.xml 改為下面的配置:

<configuration>
        <property>
                <name>fs.defaultFS</name>
                <value>hdfs://Master:9000</value>
        </property>
        <property>
                <name>hadoop.tmp.dir</name>
                <value>file:/usr/local/hadoop/tmp</value>
                <description>Abase for other temporary directories.</description>
        </property>
</configuration>

3, 文件 hdfs-site.xml,dfs.replication 一般設為 3,但我們只有一個 Slave 節點,所以 dfs.replication 的值還是設為 1:

<configuration>
        <property>
                <name>dfs.namenode.secondary.http-address</name>
                <value>Master:50090</value>
        </property>
        <property>
                <name>dfs.replication</name>
                <value>1</value>
        </property>
        <property>
                <name>dfs.namenode.name.dir</name>
                <value>file:/usr/local/hadoop/tmp/dfs/name</value>
        </property>
        <property>
                <name>dfs.datanode.data.dir</name>
                <value>file:/usr/local/hadoop/tmp/dfs/data</value>
        </property>
</configuration>

4, 文件 mapred-site.xml (可能需要先重命名,默認文件名為 mapred-site.xml.template),然后配置修改如下:

<configuration>
        <property>
                <name>mapreduce.framework.name</name>
                <value>yarn</value>
        </property>
        <property>
                <name>mapreduce.jobhistory.address</name>
                <value>Master:10020</value>
        </property>
        <property>
                <name>mapreduce.jobhistory.webapp.address</name>
                <value>Master:19888</value>
        </property>
</configuration>

5, 文件 yarn-site.xml

<configuration>
        <property>
                <name>yarn.resourcemanager.hostname</name>
                <value>Master</value>
        </property>
        <property>
                <name>yarn.nodemanager.aux-services</name>
                <value>mapreduce_shuffle</value>
        </property>
</configuration>

配置好后,將 Master 上的 /usr/local/Hadoop 文件夾復制到各個節點上。因為之前有跑過偽分布式模式,建議在切換到集群模式前先刪除之前的臨時文件。在 Master 節點上執行:

cd /usr/local
sudo rm -r ./hadoop/tmp     # 刪除 Hadoop 臨時文件
sudo rm -r ./hadoop/logs/*   # 刪除日志文件
tar -zcf ~/hadoop.master.tar.gz ./hadoop   # 先壓縮再復制
cd ~
scp ./hadoop.master.tar.gz Slave1:/home/hadoop

 在 Slave1 節點上執行:注意上面最后一行的Slave1,其他節點可改為Slave2,3,4等,同樣下面也要在不同的節點允許

sudo rm -r /usr/local/hadoop    # 刪掉舊的(如果存在)
sudo tar -zxf ~/hadoop.master.tar.gz -C /usr/local
sudo chown -R hadoop /usr/local/hadoop

同樣,如果有其他 Slave 節點,也要執行將 hadoop.master.tar.gz 傳輸到 Slave 節點、在 Slave 節點解壓文件的操作。

首次啟動需要先在 Master 節點執行 NameNode 的格式化:

 

    hdfs namenode -format       # 首次運行需要執行初始化,之后不需要

關閉防火牆centos7

systemctl stop firewalld.service    # 關閉firewall
systemctl disable firewalld.service # 禁止firewall開機啟動

接着可以啟動 hadoop 了,啟動需要在 Master 節點上進行:

start-dfs.sh
start-yarn.sh
mr-jobhistory-daemon.sh start historyserver

 通過命令 jps 可以查看各個節點所啟動的進程。正確的話,在 Master 節點上可以看到 NameNode、ResourceManager、SecondrryNameNode、JobHistoryServer 進程,如下圖所示:

缺少任一進程都表示出錯。另外還需要在 Master 節點上通過命令 hdfs dfsadmin -report 查看 DataNode 是否正常啟動,如果 Live datanodes 不為 0 ,則說明集群啟動成功。例如我這邊一共有 3個 Datanodes:

 

 

偽分布式、分布式配置切換時的注意事項

1, 從分布式切換到偽分布式時,不要忘記修改 slaves 配置文件;
2, 在兩者之間切換時,若遇到無法正常啟動的情況,可以刪除所涉及節點的臨時文件夾,這樣雖然之前的數據會被刪掉,但能保證集群正確啟動。所以如果集群以前能啟動,但后來啟動不了,特別是 DataNode 無法啟動,不妨試着刪除所有節點(包括 Slave 節點)上的 /usr/local/hadoop/tmp 文件夾,再重新執行一次 hdfs namenode -format,再次啟動試試。

8運行示例

以wordcount為例

在Master的home文件夾,建立file文件夾,里面放幾個文本文件。可參考網上的教程

 

#新建文件夾
hadoop fs -mkdir input2
#查看文件夾
hadoop fs -ls
#將home文件夾中的file1文件夾內的文件放到input2中 hadoop fs
-put ~/file1/file*.txt input2 #允許wordcount示例程序,輸出到output3中,需要自定義,更改文件夾名稱 hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.1.jar wordcount input2 output3 #將結果輸出,更改路徑 hadoop fs -cat output3/part-r-00000

有樹莓派時,運行較慢

把連接樹莓派的網線去掉,並stop-all.sh,start-all.sh重新啟動hadoop

如果在安全模式,則可以等待或者強制關閉安全模式

hadoop dfsadmin -safemode leave

重啟hadoop只有一個datanode,只需要二十幾s即可計算完畢。

查看結果,這個文件是Centos的瀏覽器歡迎界面復制了很多遍,因此單詞個數很有規律。

 

 可以想象,如果硬件配置更好,節點更多時,處理效率會更高。被樹莓派折騰了好久,折騰了樹莓派好久。

 9 問題集錦

1. 問題:卡住沒有mapreduce進度,且DataNode節點Java進程占用大量CPU

解決方案:在master節點關閉Hadoop集群,在slave節點用top命令查看Java是否大量占用內存,如果占用則根據其pid關閉進程,即kill 32540(32540為pid,下圖的紅圈所示),再次啟動Hadoop集群,且注意輸出目錄不要和已經存在的目錄的重復。

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM