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