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

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

鏡像倉庫:

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

//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 界面//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界面//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