分佈式處理框架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