1. 程式人生 > 其它 >[喵咪大資料]Hadoop單機模式

[喵咪大資料]Hadoop單機模式

千里之行始於足下,學習大資料我們首先就要先接觸Hadoop,上節介紹到Hadoop分為Hadoop-HDFS,Hadoop-YARN,Hadoop-Mapreduce組成,分別負責分散式檔案儲存,任務排程,計算處理,本機我們在單機模式下把Hadoop執行起來並且簡單的使用接觸Hadoop相關的機制.

附上:

Hadoop的官網:hadoop.apache.org 喵了個咪的部落格:w-blog.cn

1.環境準備

這裡所有的系統統一使用Centos7.X 64位系統 其他系統未經過測試

建立install目錄存放各項包,使用oneinstack更新基礎元件(按照提示選擇即可)

> mkdir -p /app/install && cd /app/install
# 使用oneinstack更新一下環境基礎元件 全部選擇N即可
> wget http://mirrors.linuxeye.com/oneinstack-full.tar.gz
> tar -zxvf oneinstack-full.tar.gz
> cd oneinstack && ./install.sh

建立hadoop使用者並設定密碼(如果暴露外網IP務必使用複雜密碼避免攻擊)

useradd -m hadoop -s /bin/bash
passwd hadoop

為 hadoop 使用者增加管理員許可權,方便使用sudo來以root許可權來進行操作

visudo
# 找到root複製一條改為hadoop
root    ALL=(ALL)       ALL
hadoop  ALL=(ALL)       ALL

新增SSH免密登入

# 先切換到hadoop使用者
su hadoop
ssh-keygen -t rsa              # 會有提示,都按回車就可以
cd ~/.ssh/  
cat id_rsa.pub >> authorized_keys  # 加入授權
chmod 600 ./authorized_keys    # 修改檔案許可權
ssh localhost      # 此時使用ssh首次需要yes以下不用密碼即可登入

2.Hadoop安裝

這裡使用的Hadoop版本為2.7.3版本可以自行在官網下載 統一安裝目錄均為**/usr/local/XX**

2.1 環境配置

需要準備好JAVA安裝包和Hadoop安裝包,我們把以下兩個檔案放到我們建立好的install目錄下

hadoop-2.7.3.tar.gz
jdk-8u101-linux-x64.tar.gz

JAVA環境

cd /app/install
sudo tar -zxvf jdk-8u101-linux-x64.tar.gz 
sudo mv jdk1.8.0_101/ /usr/local/jdk1.8

環境變數增加如下內容

sudo vim /etc/profile

# JAVA_HOME
export JAVA_HOME=/usr/local/jdk1.8
export JRE_HOME=/usr/local/jdk1.8/jre
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$PATH

# 使環境變數生效
source /etc/profile

如下結果為Java安裝成功輸出

java -version
java version "1.8.0_101"
Java(TM) SE Runtime Environment (build 1.8.0_101-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.101-b13, mixed mode)

Hadoop環境

> sudo tar -zxvf hadoop-2.7.3.tar.gz
> sudo mv hadoop-2.7.3 /usr/local/
> sudo chown -R hadoop:hadoop /usr/local/hadoop-2.7.3

環境變數增加如下內容

> sudo vim /etc/profile
export HADOOP_HOME=/usr/local/hadoop-2.7.3
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=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH

# 使環境變數生效
> source /etc/profile

檢視hadoop版本資訊驗證是否安裝成功

hadoop version
# 如下結構為安裝成功
Hadoop 2.7.3
Subversion https://git-wip-us.apache.org/repos/asf/hadoop.git -r baa91f7c6bc9cb92be5982de4719c1c8af91ccff
Compiled by root on 2016-08-18T01:41Z
Compiled with protoc 2.5.0
From source with checksum 2e4ce5f957ea4db193bce3734ff29ff4
This command was run using /usr/local/hadoop-2.7.3/share/hadoop/common/hadoop-common-2.7.3.jar

2.1 測試Hadoop是否正常

Hadoop 預設模式為非分散式模式,無需進行其他配置即可執行。非分散式即單 Java 程序,方便進行除錯。 現在我們可以執行例子來感受下 Hadoop 的執行。Hadoop 附帶了豐富的例子執行如下命令可以看到所有例子 包括 wordcount、terasort、join、grep 等。

hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar 

在此我們選擇執行 grep 例子來驗證搭建的hadoop是否可以正常執行,我們將 input 資料夾中的所有檔案作為輸入,篩選當中符合正則表示式 dfs[a-z.]+ 的單詞並統計出現的次數,最後輸出結果到 output 資料夾中。

cd $HADOOP_HOME
mkdir ./input
cp ./etc/hadoop/*.xml ./input   # 將配置檔案作為輸入檔案
hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grep ./input ./output 'dfs[a-z.]+'
cat ./output/*          # 檢視執行結果
# 如果執行成功結果如下
1       dfsadmin

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

3.Hadoop偽分散式配置

Hadoop 可以在單節點上以偽分散式的方式執行,Hadoop 程序以分離的 Java 程序來執行,節點既作為 NameNode 也作為 DataNode,同時,讀取的是 HDFS 中的檔案。

Hadoop 的配置檔案位於 $HADOOP_HOME/etc/hadoop/ 中,偽分散式需要修改2個配置檔案 core-site.xml 和 hdfs-site.xml 。Hadoop的配置檔案是 xml 格式,每個配置以宣告 property 的 name 和 value 的方式來實現。

修改配置檔案hadoop-env.sh 更新JAVA_HOME環境變數

export JAVA_HOME=/usr/local/jdk1.8

修改配置檔案 core-site.xml

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

這裡配置namenode和datanode的目錄,namenode和datanode是什麼東西呢??

NameNode:管理檔案系統的元資料,所有的資料讀取工作都會先經過NameNode獲取源資料在哪個DataNode裡面在進行獲取操作 DataNode:實際資料儲存節點,具體的對映關係會儲存在NameNode下

修改配置檔案vim :

<configuration>
    <property>
        <name>dfs.replication</name>
        <value>1</value>
    </property>
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>file:/usr/local/hadoop-2.7.3/tmp/dfs/name</value>
    </property>
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>file:/usr/local/hadoop-2.7.3/tmp/dfs/data</value>
    </property>
</configuration>

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

hdfs namenode -format

成功的話,會看到 “successfully formatted” 和 “Exitting with status 0” 的提示,若為 “Exitting with status 1” 則是出錯。

接著開啟 NaneNode 和 DataNode 守護程序:

start-dfs.sh

若出現如下 SSH 的提示 “Are you sure you want to continue connecting”,輸入 yes 即可。 啟動完成後,可以通過命令 jps 來判斷是否成功啟動,若成功啟動則會列出如下程序: “NameNode”、”DataNode”和SecondaryNameNode(如果 SecondaryNameNode 沒有啟動,請執行 sbin/stop-dfs.sh 關閉程序,然後再次嘗試啟動嘗試)。如果沒有 NameNode 或 DataNode ,那就是配置不成功,請仔細檢查之前步驟,或通過檢視啟動日誌排查原因。

16035 Jps
15748 DataNode
15621 NameNode
15911 SecondaryNameNode

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

上面的單機模式,grep 例子讀取的是本地資料,偽分散式讀取的則是 HDFS 上的資料。要使用 HDFS,首先需要在 HDFS 中建立使用者目錄:

hdfs dfs -mkdir -p /user/hadoop

接著將 ./etc/hadoop 中的 xml 檔案作為輸入檔案複製到分散式檔案系統中,即將 /usr/local/hadoop/etc/hadoop 複製到分散式檔案系統中的 /user/hadoop/input 中。我們使用的是 hadoop 使用者,並且已建立相應的使用者目錄 /user/hadoop ,因此在命令中就可以使用相對路徑如 input,其對應的絕對路徑就是 /user/hadoop/input:

hdfs dfs -mkdir input
hdfs dfs -put $HADOOP_HOME/etc/hadoop/*.xml input

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

hdfs dfs -ls input

偽分散式執行 MapReduce 作業的方式跟單機模式相同,區別在於偽分散式讀取的是HDFS中的檔案(可以將單機步驟中建立的本地 input 資料夾,輸出結果 output 資料夾都刪掉來驗證這一點)。

hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar grep input output 'dfs[a-z.]+'

檢視執行結果的命令(檢視的是位於 HDFS 中的輸出結果):

hdfs dfs -cat output/*
1       dfsadmin
1       dfs.replication
1       dfs.namenode.name.dir
1       dfs.datanode.data.dir

Hadoop 執行程式時,輸出目錄不能存在,否則會提示錯誤 “org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory hdfs://localhost:9000/user/hadoop/output already exists” ,因此若要再次執行,需要執行如下命令刪除 output 資料夾:

hdfs dfs -rm -r output 

若要關閉 Hadoop-HDFS,則執行

stop-dfs.sh

4.YARN

(偽分散式不啟動 YARN 也可以,一般不會影響程式執行) 有的讀者可能會疑惑,怎麼啟動 Hadoop 後,見不到書上所說的 JobTracker 和 TaskTracker,這是因為新版的 Hadoop 使用了新的 MapReduce 框架(MapReduce V2,也稱為 YARN,Yet Another Resource Negotiator)。

YARN 是從 MapReduce 中分離出來的,負責資源管理與任務排程。YARN 運行於 MapReduce 之上,提供了高可用性、高擴充套件性,YARN 的更多介紹在此不展開,有興趣的可查閱相關資料。

上述通過 start-dfs.sh 啟動 Hadoop,僅僅是啟動了 MapReduce 環境,我們可以啟動 YARN ,讓 YARN 來負責資源管理與任務排程。

首先修改配置檔案 mapred-site.xml

mv $HADOOP_HOME/etc/hadoop/mapred-site.xml.template $HADOOP_HOME/etc/hadoop/mapred-site.xml
configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
</configuration>

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

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

然後就可以啟動 YARN 了

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

在使用jps檢視可以看到多了幾項

16707 ResourceManager
15748 DataNode
15621 NameNode
15911 SecondaryNameNode
16811 NodeManager
17199 Jps
17151 JobHistoryServer

啟動 YARN 之後,執行例項的方法還是一樣的,僅僅是資源管理方式、任務排程不同。觀察日誌資訊可以發現,不啟用 YARN 時,是 “mapred.LocalJobRunner” 在跑任務,啟用 YARN 之後,是 “mapred.YARNRunner” 在跑任務。啟動 YARN 有個好處是可以通過 Web 介面檢視任務的執行情況:ur,如下圖所示。但 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 的指令碼如下:

stop-yarn.sh
mr-jobhistory-daemon.sh stop historyserver

YARN webui

啟動yarn之後可以通過web介面檢視執行進度等,訪問hadoop-1:8080會獲得如下介面

5 總結

本節我們先簡單瞭解了一下Hadoop大家應該對Hadoop有了一個簡單的概念,HDFS是什麼,怎麼配置環境,怎麼測試執行情況,但是這僅僅是一個開始後面還有很長的路要走,那麼大家要是有問題可以在博文下留言,有好的想法可以來和喵咪來溝通交流哦!

注:筆者能力有限有說的不對的地方希望大家能夠指出,也希望多多交流!