天天看點

[喵咪大資料]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是什麼,怎麼配置環境,怎麼測試運作情況,但是這僅僅是一個開始後面還有很長的路要走,那麼大家要是有問題可以在博文下留言,有好的想法可以來和喵咪來溝通交流哦!

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