分散式處理框架Hadoop的安裝與使用

與李發表於2020-09-13

Hadoop簡介

Hadoop是一個由Apache基金會所開發的分散式系統基礎架構。使用者可以在不瞭解分散式底層細節的情況下,開發分散式程式。

充分利用叢集的威力進行高速運算和儲存。Hadoop實現了一個分散式檔案系統(Hadoop Distributed File System),簡稱

HDFS。HDFS有高容錯性的特點,並且設計用來部署在低廉的(low-cost)硬體上;而且它提供高吞吐量(high throughput)

來訪問應用程式的資料,適合那些有著超大資料集(large data set)的應用程式。HDFS放寬了(relax)POSIX的要求,可以以

流的形式訪問(streaming access)檔案系統中的資料。Hadoop的框架最核心的設計就是:HDFS和MapReduce。HDFS為海

量的資料提供了儲存,而MapReduce則為海量的資料提供了計算  。

環境:

CentOS7。

安裝指南:《VMware安裝Centos7並聯網使用

一、新建hadoop使用者

1、以root使用者登入虛擬機器,建立使用者hadoop

$ useradd -m hadoop -s /bin/bash   # 建立新使用者hadoop
$ passwd hadoop   #設定密碼

2、為hadoop使用者新增管理員許可權

$ visudo

出現以下內容

按下鍵盤上的esc鍵,輸入“:98”(先輸入冒號,再輸入98),便於快速定位到98行。按下鍵盤上的i,進入插入模式。

新增如下內容,空格就是一個tab鍵。

最後按下esc鍵,輸入“:wq”(先輸入冒號,再輸入wq),意為儲存並退出。

執行exit,退出root狀態,重新以hadoop使用者登入。

二、安裝SSH、配置SSH無密碼登入

SSH 是較可靠,專為遠端登入會話和其他網路服務提供安全性的協議。使用SSH,還有一個額外的好處就是傳輸的資料是經過壓

縮的,所以可以加快傳輸的速度。

一般情況下,CentOS已經預設幫你安裝好了ssh-clients、ssh-server,不需要再額外進行安裝。

可以使用shell命令,檢視你本機的ssh安裝情況。

$ rpm -qa | grep ssh

如果結果如下,包含了ssh-clients、ssh-server,說明已經安裝好了,不需要額外安裝。

如果未安裝,可以通過yum進行安裝:

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

執行命令,檢視ssh是否可用:

$ ssh localhost

首次登入會有提示:

輸入yes,按照提示輸入密碼,就可以登入到本機。但是這樣連線每次都需要輸入密碼。配置成無密碼登入比較方便。

利用ssh-keygen生成金鑰,並將金鑰新增到授權資訊中。

cd ~/.ssh/                     # 若沒有該目錄,請先執行一次ssh localhost
ssh-keygen -t rsa              # 會有提示,都按回車就可以
cat id_rsa.pub >> authorized_keys  # 加入授權
chmod 600 ./authorized_keys    # 修改檔案許可權

需要鍵入內容地方直接回車。

我們再次使用ssh localhost,就可以直接登入了。

三、安裝java環境

下載jdk-8u51-linux-x64.tar.gz壓縮包到/home/hadoop/download資料夾,並解壓縮到/usr/lib/jvm資料夾

$ tar -zxf ~/download/jdk-8u51-linux-x64.tar.gz -C /usr/lib/jvm

編輯環境變數:

$ vi ~/.bashrc

新增JAVA_HOME:

export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_51
export PATH=$JAVA_HOME/bin

讓環境變數生效:

$ source ~/.bashrc

檢視java版本:

$ java -version

檢驗環境變數是否正確:

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

四、安裝Hadoop2

映象倉庫:

https://mirrors.cnnic.cn/apache/hadoop/common/hadoop-2.7.7/

http://mirror.bit.edu.cn/apache/hadoop/common/hadoop-2.7.7/

下載“*.tar.gz”,-src檔案是Hadoop的原始碼。

將下載的tar.gz檔案放到/usr/hadoop/download下。

執行命令解壓修改hadoop檔案:

$ sudo tar -zxf ~/download/hadoop-2.7.7.tar.gz -C /usr/local    # 解壓到/usr/local中
$ cd /usr/local/
$ sudo mv ./hadoop-2.7.7/ ./hadoop            # 將資料夾名改為hadoop
$ sudo chown -R hadoop:hadoop ./hadoop        # 修改檔案許可權

檢視hadoop版本資訊:

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

五、Hadoop單機配置(非分散式)

Hadoop 預設模式為非分散式模式,無需進行其他配置即可執行。非分散式即單 Java 程式,方便進行除錯。

現在我們可以執行例子來感受下 Hadoop 的執行。Hadoop 附帶了豐富的例子(執行 /usr/local/hadoop/bin/hadoop jar

/usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar可以看到所有例子),包括

wordcount、terasort、join、grep 等。

在此我們選擇執行 grep 例子,我們將 input 資料夾中的所有檔案作為輸入,篩選當中符合正規表示式dfs[a-z.]+的單詞並統計出

現的次數,最後輸出結果到 output 資料夾中。

$ cd /usr/local/hadoop
$ mkdir ./input
$ cp ./etc/hadoop/*.xml ./input   # 將配置檔案作為輸入檔案
$ ./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar grep ./input ./output 'dfs[a-z.]+'
$ cat ./output/*          # 檢視執行結果

**注意: **Hadoop 預設不會覆蓋結果檔案,因此再次執行上面例項會提示出錯,需要先將./output刪除。

刪除輸出檔案:

$ rm -r ./output

六、Hadoop偽分散式配置

Hadoop 可以在單節點上以偽分散式的方式執行,Hadoop 程式以分離的 Java 程式來執行,節點既作為 NameNode 也作為

DataNode,同時,讀取的是 HDFS 中的檔案。

在設定 Hadoop 偽分散式配置前,我們還需要設定 HADOOP 環境變數,執行如下命令在 ~/.bashrc 中設定:

$ vi ~/.bashrc

在檔案最後面增加如下內容:

# Hadoop Environment Variables
export HADOOP_HOME=/usr/local/hadoop
export HADOOP_INSTALL=$HADOOP_HOME
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin

使檔案生效:

$ source ~/.bashrc

Hadoop 的配置檔案位於 /usr/local/hadoop/etc/hadoop/中,偽分散式需要修改2個配置檔案 core-site.xml 和 hdfs-

site.xml 。

Hadoop的配置檔案是 xml 格式,每個配置以宣告 property 的 name 和 value 的方式來實現。

修改core-site.xml檔案:

替換成如下內容:

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

修改hdfs-site.xml檔案:

替換成如下內容:

<configuration>
    <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>

配置完成後,執行 NameNode 的格式化:

$ /usr/local/hadoop/bin/hdfs namenode -format

成功則會顯示successfully formatted與Exiting with status 0。失敗則會Exiting with status 1。

開啟NameNode與DataNode守護程式:

$ /usr/local/hadoop/sbin/start-dfs.sh

出現“Are you sure you want to continue connecting”提示時,輸入yes繼續執行。

啟動完成後,可以通過命令JPS來判斷是否成功啟動,若成功啟動則會列出如下程式: “NameNode”、”DataNode”和

SecondaryNameNode(如果 SecondaryNameNode 沒有啟動,請執行 sbin/stop-dfs.sh 關閉程式,然後再次嘗試啟動嘗試)。

如果沒有 NameNode 或 DataNode ,那就是配置不成功,請仔細檢查之前步驟,或通過檢視啟動日誌排查原因。

通過檢視啟動日誌分析啟動失敗原因

有時 Hadoop 無法正確啟動,如 NameNode 程式沒有順利啟動,這時可以檢視啟動日誌來排查原因,注意幾點:

  • 啟動時會提示形如 “localhost: starting namenode, logging to /usr/local/hadoop/logs/hadoop-hadoop-namenode-localhost.out”,其中 localhost對應你的主機名,但啟動的日誌資訊是記錄在 /usr/local/hadoop/logs/hadoop-hadoop-namenode-localhost.log 中,所以應該檢視這個字尾為.log的檔案;
  • 每一次的啟動日誌都是追加在日誌檔案之後,所以得拉到最後面看,看下記錄的時間就知道了。
  • 一般出錯的提示在最後面,也就是寫著 Fatal、Error 或者 Java Exception 的地方。
  • 可以在網上搜尋一下出錯資訊,看能否找到一些相關的解決方法。

成功啟動後,可以訪問 Web 介面http://localhost:50070檢視 NameNode 和 Datanode 資訊,還可以線上檢視 HDFS 中的檔案。

由於本例中未使用CentOS圖形化介面,所以需要在windows瀏覽器上訪問虛擬機器中hadoop的web介面。

CentOS7中埠開放請移步《CentOS7 中開放埠》。

七、執行Hadoop偽分散式例項

上面例子是單機模式,讀取的資料是本地檔案。偽分散式例項資料來源於HDFS檔案系統。要使用HDFS,首先需要在HDFS中創

建使用者目錄。

$ /usr/local/hadoop/bin/hdfs dfs -mkdir -p /user/hadoop

將/usr/local/hadoop/etc/hadoop/下所有xml作為檔案複製到hdfs的/user/hadoop/input中。

我們使用的是 hadoop 使用者,並且已建立相應的使用者目錄 /user/hadoop ,因此在命令中就可以使用相對路徑如 input,其對應

的絕對路徑就是 /user/hadoop/input。

/usr/local/hadoop/bin/hdfs dfs -mkdir input
/usr/local/hadoop/bin/hdfs dfs -put /usr/local/hadoop/etc/hadoop/*.xml input

複製完成之後,可以通過命令檢視HDFS中檔案列表:

$ /usr/local/hadoop/bin/hdfs dfs -ls input

執行MapReduce作業:

$ /usr/local/hadoop/bin/hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grep input output 'dfs[a-z.]+'

檢視執行結果:

$ /usr/local/hadoop/bin/hdfs dfs -cat output/*

將HDFS中的檔案取回到本地:

$ rm -r /usr/local/hadoop/output    # 先刪除本地的 output 資料夾(如果存在)
$ /usr/local/hadoop/bin/hdfs dfs -get output /usr/local/hadoop/output     # 將 HDFS 上的 output 資料夾拷貝到本機
cat /usr/local/hadoop/output/*

Hadoop在執行時,輸出目錄不能存在,如果存在,就會丟擲org.apache.hadoop.mapred.FileAlreadyExistsException異常。

所以在執行前,需要刪除輸出目錄。

/usr/local/hadoop/bin/hdfs dfs -rm -r output    # 刪除 output 資料夾

關閉Hadoop:

/usr/local/hadoop/sbin/stop-dfs.sh

注意:下次啟動 hadoop 時,無需進行 NameNode 的初始化,只需要執行/usr/local/hadoop/sbin/start-dfs.sh就可以!

八、 啟動YARN

新版的 Hadoop 使用了新的 MapReduce 框架(MapReduce V2,也稱為 YARN,Yet Another Resource Negotiator)。

YARN 是從 MapReduce 中分離出來的,負責資源管理與任務排程。YARN 執行於 MapReduce 之上,提供了高可用性、高擴充套件

性。

偽分散式不啟動 YARN 也可以,一般不會影響程式執行。

上述通過/usr/local/hadoop/sbin/start-dfs.sh啟動 Hadoop,僅僅是啟動了 MapReduce 環境,我們可以啟動 YARN ,讓

YARN 來負責資源管理與任務排程。

修改配置檔案mapred-site.xml:

$ cd /usr/local/hadoop/etc/hadoop  #進入配置檔案的資料夾
$ mv ./mapred-site.xml.template ./mapred-site.xml  #重新命名
$ vi ./mapred-site.xml  #編輯檔案

將configuration修改如下:

<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
</configuration>

修改配置檔案yarn-site.xml:

$ vi ./yarn-site.xml

將configuration修改如下:

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

啟動YARN

$ /usr/local/hadoop/sbin/start-yarn.sh      $ 啟動YARN
$ /usr/local/hadoop/sbin/mr-jobhistory-daemon.sh start historyserver  # 開啟歷史伺服器,才能在Web中檢視任務執行情況

通過jps檢視,可以看到多了ResourceManager與NodeManager兩個程式。

啟動後,可通過web介面http://localhost:8088/cluster檢視任務執行情況

YARN 主要是為叢集提供更好的資源管理與任務排程,然而這在單機上體現不出價值,反而會使程式跑得稍慢些。因此在單機上

是否開啟 YARN 就看實際情況了。

注意: 不啟動 YARN 需重新命名 mapred-site.xml

如果不想啟動 YARN,務必把配置檔案 mapred-site.xml 重新命名,改成 mapred-site.xml.template,需要用時改回來就行。否

則在該配置檔案存在,而未開啟 YARN 的情況下,執行程式會提示 “Retrying connect to server: 0.0.0.0/0.0.0.0:8032” 的錯誤,

這也是為何該配置檔案初始檔名為 mapred-site.xml.template。

關閉YARN

$ /usr/local/hadoop/sbin/stop-yarn.sh
$ /usr/local/hadoop/sbin/mr-jobhistory-daemon.sh stop historyserver

image.gif

相關文章