Hadoop 單節點 & 僞分佈 安裝手記

實驗環境
CentOS 6.X
Hadoop 2.6.0
JDK    1.8.0_65

目的
這篇文檔的目的是幫助你快速完成單機上的Hadoop安裝與使用以便你對Hadoop分佈式文件系統(HDFS)和Map-Reduce框架有所體會,比如在HDFS上運行示例程序或簡單作業等。

先決條件
支持平臺
    GNU/Linux是產品開發和運行的平臺。 Hadoop已在有2000個節點的GNU/Linux主機組成的集羣系統上得到驗證。
    Win32平臺是作爲開發平臺支持的。由於分佈式操作尚未在Win32平臺上充分測試,所以還不作爲一個生產平臺被支持。

安裝軟件
如果你的集羣尚未安裝所需軟件,你得首先安裝它們。
以 CentOS 爲例:
# yum install ssh rsync -y
# ssh 必須安裝並且保證 sshd一直運行,以便用Hadoop 腳本管理遠端Hadoop守護進程。

創建用戶
# useradd -m hadoop -s /bin/bash   # 創建新用戶hadoop

Hosts解析
# cat /etc/hosts| grep ocean-lab
192.168.9.70     ocean-lab.ocean.org  ocean-lab

安裝jdk
JDK – http://www.oracle.com/technetwork/java/javase/downloads/index.html
首先安裝JAVA環境
# wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u65-b17/jdk-8u65-linux-x64.rpm"
# rpm -Uvh jdk-8u65-linux-x64.rpm

配置 Java
# echo "export JAVA_HOME=/usr/java/jdk1.8.0_65" >> /home/hadoop/.bashrc
# source /home/hadoop/.bashrc
# echo $JAVA_HOME
/usr/java/jdk1.8.0_65


下載安裝hadoop
爲了獲取Hadoop的發行版,從Apache的某個鏡像服務器上下載最近的 穩定發行版。
運行Hadoop集羣的準備工作
# wget http://apache.fayea.com/hadoop/common/hadoop-2.6.0/hadoop-2.6.0.tar.gz

解壓所下載的Hadoop發行版。編輯 conf/hadoop-env.sh文件,至少需要將JAVA_HOME設置爲Java安裝根路徑。

# tar xf hadoop-2.6.0.tar.gz -C /usr/local

#### mv /usr/local/hadoop-2.6.0 /usr/local/hadoop

嘗試如下命令:
# bin/hadoop
將會顯示hadoop 腳本的使用文檔。


現在你可以用以下三種支持的模式中的一種啓動Hadoop集羣:
    單機模式
    僞分佈式模式
    完全分佈式模式



單機模式的操作方法

默認情況下,Hadoop被配置成以非分佈式模式運行的一個獨立Java進程。這對調試非常有幫助。
現在我們可以執行例子來感受下 Hadoop 的運行。Hadoop 附帶了豐富的例子包括 wordcount、terasort、join、grep 等。
在此我們選擇運行 grep 例子,我們將 input 文件夾中的所有文件作爲輸入,篩選當中符合正則表達式 dfs[a-z.]+ 的單詞並統計出現的次數,最後輸出結果到 output 文件夾中。

# mkdir input
# cp conf/*.xml input
# ./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0.jar grep ./input/ ./ouput 'dfs[a-z.]+'
# cat output/*
若執行成功的話會輸出很多作業的相關信息,最後的輸出信息如下圖所示。作業的結果會輸出在指定的 output 文件夾中,通過命令 cat ./output/* 查看結果,符合正則的單詞 dfsadmin 出現了1次:
[10:57:58][hadoop@ocean-lab hadoop-2.6.0]$ cat ./ouput/*
1 dfsadmin


注意,Hadoop 默認不會覆蓋結果文件,因此再次運行上面實例會提示出錯,需要先將 ./output 刪除。
否則會報如下錯誤
INFO jvm.JvmMetrics: Cannot initialize JVM Metrics with processName=JobTracker, sessionId= - already initialized
org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory file:/usr/local/hadoop-2.6.0/ouput already exists
若出現提示 “INFO metrics.MetricsUtil: Unable to obtain hostName java.net.UnknowHostException”,這需要執行如下命令修改 hosts 文件,爲你的主機名增加IP映射:
# cat /etc/hosts| grep ocean-lab
192.168.9.70     ocean-lab.ocean.org  ocean-lab


僞分佈式模式的操作方法

Hadoop可以在單節點上以所謂的僞分佈式模式運行,此時每一個Hadoop守護進程都作爲一個獨立的Java進程運行。
節點既作爲 NameNode 也作爲 DataNode,同時,讀取的是 HDFS 中的文件。

在設置 Hadoop 僞分佈式配置前,我們還需要設置 HADOOP 環境變量,執行如下命令在 ~/.bashrc 中設置
# Hadoop Environment Variables
export HADOOP_HOME=/usr/local/hadoop-2.6.0
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

配置

使用如下的 etc/hadoop/core-site.xml

<configuration>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>file:/usr/local/hadoop-2.6.0/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-2.6.0/tmp/dfs/name</value>
    </property>
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>file:/usr/local/hadoop-2.6.0/tmp/dfs/data</value>
    </property>
</configuration>

關於Hadoop配置項的一點說明

雖 然只需要配置 fs.defaultFS 和 dfs.replication 就可以運行(官方教程如此),不過若沒有配置 hadoop.tmp.dir 參數,則默認使用的臨時目錄爲 /tmp/hadoo-hadoop,而這個目錄在重啓時有可能被系統清理掉,導致必須重新執行 format 才行。所以我們進行了設置,同時也指定 dfs.namenode.name.dir 和 dfs.datanode.data.dir,否則在接下來的步驟中可能會出錯。



免密碼ssh設置
現在確認能否不輸入口令就用ssh登錄localhost:
# ssh localhost date

如果不輸入口令就無法用ssh登陸localhost,執行下面的命令:
# ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
# cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
#chmod  600 ~/.ssh/authorized_keys


格式化一個新的分佈式文件系統:
$ bin/hadoop namenode -format
15/12/23 11:30:20 INFO util.GSet: VM type       = 64-bit
15/12/23 11:30:20 INFO util.GSet: 0.029999999329447746% max memory 966.7 MB = 297.0 KB
15/12/23 11:30:20 INFO util.GSet: capacity      = 2^15 = 32768 entries
15/12/23 11:30:20 INFO namenode.NNConf: ACLs enabled? false
15/12/23 11:30:20 INFO namenode.NNConf: XAttrs enabled? true
15/12/23 11:30:20 INFO namenode.NNConf: Maximum size of an xattr: 16384
15/12/23 11:30:20 INFO namenode.FSImage: Allocated new BlockPoolId: BP-823870322-192.168.9.70-1450841420347
15/12/23 11:30:20 INFO common.Storage: Storage directory /usr/local/hadoop-2.6.0/tmp/dfs/name has been successfully formatted.
15/12/23 11:30:20 INFO namenode.NNStorageRetentionManager: Going to retain 1 images with txid >= 0
15/12/23 11:30:20 INFO util.ExitUtil: Exiting with status 0
15/12/23 11:30:20 INFO namenode.NameNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at ocean-lab.ocean.org/192.168.9.70
************************************************************/
成功的話,會看到 “successfully formatted” 和 “Exitting with status 0″ 的提示

注意
下次啓動 hadoop 時,無需進行 NameNode 的初始化,只需要運行 ./sbin/start-dfs.sh 就可以!



啓動 NameNode 和  DataNode

$  ./sbin/start-dfs.sh
15/12/23 11:37:20 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Starting namenodes on [localhost]
localhost: starting namenode, logging to /usr/local/hadoop-2.6.0/logs/hadoop-hadoop-namenode-ocean-lab.ocean.org.out
localhost: starting datanode, logging to /usr/local/hadoop-2.6.0/logs/hadoop-hadoop-datanode-ocean-lab.ocean.org.out
Starting secondary namenodes [0.0.0.0]
The authenticity of host '0.0.0.0 (0.0.0.0)' can't be established.
RSA key fingerprint is a5:26:42:a0:5f:da:a2:88:52:04:9c:7f:8d:6a:98:9b.
Are you sure you want to continue connecting (yes/no)? yes
0.0.0.0: Warning: Permanently added '0.0.0.0' (RSA) to the list of known hosts.
0.0.0.0: starting secondarynamenode, logging to /usr/local/hadoop-2.6.0/logs/hadoop-hadoop-secondarynamenode-ocean-lab.ocean.org.out
15/12/23 11:37:44 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable


[13:57:08][hadoop@ocean-lab hadoop-2.6.0]$ jps
27686 SecondaryNameNode
28455 Jps
27501 DataNode
27405 NameNode
27006 GetConf

如果沒有進程則說明啓動失敗 查看日誌bebug


成功啓動後,可以訪問 Web 界面  http://[ip,fqdn]:/50070  查看 NameNode 和 Datanode 信息,還可以在線查看 HDFS 中的文件。

wKiom1Z6Q3vAlkXcAACeq3_WIqU567.png


運行Hadoop僞分佈式實例

上面的單機模式,grep 例子讀取的是本地數據,僞分佈式讀取的則是 HDFS 上的數據。

要使用 HDFS,首先需要在 HDFS 中創建用戶目錄:
# ./bin/hdfs dfs -mkdir -p /user/hadoop
# ./bin/hadoop fs -ls /user/hadoop
Found 1 items
drwxr-xr-x   - hadoop supergroup          0 2015-12-23 15:03 /user/hadoop/input


接着將 ./etc/hadoop 中的 xml 文件作爲輸入文件複製到分佈式文件系統中,即將 /usr/local/hadoop/etc/hadoop 複製到分佈式文件系統中的 /user/hadoop/input 中。我們使用的是 hadoop 用戶,並且已創建相應的用戶目錄 /user/hadoop ,因此在命令中就可以使用相對路徑如 input,其對應的絕對路徑就是 /user/hadoop/input:
# ./bin/hdfs dfs -mkdir input
# ./bin/hdfs dfs -put ./etc/hadoop/*.xml input

複製完成後,可以通過如下命令查看 HDFS 中的文件列表:

# ./bin/hdfs dfs -ls input    
-rw-r--r--   1 hadoop supergroup       4436 2015-12-23 16:46 input/capacity-scheduler.xml
-rw-r--r--   1 hadoop supergroup       1180 2015-12-23 16:46 input/core-site.xml
-rw-r--r--   1 hadoop supergroup       9683 2015-12-23 16:46 input/hadoop-policy.xml
-rw-r--r--   1 hadoop supergroup       1136 2015-12-23 16:46 input/hdfs-site.xml
-rw-r--r--   1 hadoop supergroup        620 2015-12-23 16:46 input/httpfs-site.xml
-rw-r--r--   1 hadoop supergroup       3523 2015-12-23 16:46 input/kms-acls.xml
-rw-r--r--   1 hadoop supergroup       5511 2015-12-23 16:46 input/kms-site.xml
-rw-r--r--   1 hadoop supergroup        858 2015-12-23 16:46 input/mapred-site.xml
-rw-r--r--   1 hadoop supergroup        690 2015-12-23 16:46 input/yarn-site.xml


僞分佈式運行 MapReduce 作業的方式跟單機模式相同,區別在於僞分佈式讀取的是HDFS中的文件(可以將單機步驟中創建的本地 input 文件夾,輸出結果 output 文件夾都刪掉來驗證這一點)。
# ./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0.jar grep input output 'dfs[a-z.]+'

查看運行結果的命令(查看的是位於 HDFS 中的輸出結果):
$ ./bin/hdfs dfs -cat output/*
1   dfsadmin
1   dfs.replication
1   dfs.namenode.name.dir
1   dfs.datanode.data.dir


結果如下,注意到剛纔我們已經更改了配置文件,所以運行結果不同。
Hadoop僞分佈式運行grep的結果Hadoop僞分佈式運行grep的結果
我們也可以將運行結果取回到本地:
# rm -r ./output    # 先刪除本地的 output 文件夾(如果存在)
# ./bin/hdfs dfs -get output ./output     # 將 HDFS 上的 output 文件夾拷貝到本機
# 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 文件夾:
# 刪除 output 文件夾
$./bin/hdfs dfs -rm -r output
Deleted output


運行程序時,輸出目錄不能存在
運行 Hadoop 程序時,爲了防止覆蓋結果,程序指定的輸出目錄(如 output)不能存在,否則會提示錯誤,因此運行前需要先刪除輸出目錄。在實際開發應用程序時,可考慮在程序中加上如下代碼,能在每次運行時自動刪除輸出目錄,避免繁瑣的命令行操作:
Configuration conf = new Configuration();
Job job = new Job(conf);
/* 刪除輸出目錄 */
Path outputPath = new Path(args[1]);
outputPath.getFileSystem(conf).delete(outputPath, true);

若要關閉 Hadoop,則運行
./sbin/stop-dfs.sh


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

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

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

首先修改配置文件 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 了(需要先執行過 ./sbin/start-dfs.sh):
# ./sbin/start-yarn.sh                                # 啓動YARN
# ./sbin/mr-jobhistory-daemon.sh start historyserver  # 開啓歷史服務器,才能在Web中查看任務運行情況

開啓後通過 jps 查看,可以看到多了 NodeManager 和 ResourceManager 兩個後臺進程:

[09:18:34][hadoop@ocean-lab ~]$ jps
27686 SecondaryNameNode
6968 ResourceManager
7305 Jps
7066 NodeManager
27501 DataNode
27405 NameNode


啓動 YARN 之後,運行實例的方法還是一樣的,僅僅是資源管理方式、任務調度不同。觀察日誌信息可以發現,不啓用 YARN 時,是 “mapred.LocalJobRunner” 在跑任務,啓用 YARN 之後,是 “mapred.YARNRunner” 在跑任務。啓動 YARN 有個好處是可以通過 Web 界面查看任務的運行情況:http://[ip,fqdn]:8088/cluster

開啓YARN後可以查看任務運行信息開啓YARN後可以查看任務運行信息
但 YARN 主要是爲集羣提供更好的資源管理與任務調度,然而這在單機上體現不出價值,反而會使程序跑得稍慢些。因此在單機上是否開啓 YARN 就看實際情況了。
不啓動 YARN 需刪掉/重命名 mapred-site.xml
否則在該配置文件存在,而未開啓 YARN 的情況下,運行程序會提示 “Retrying connect to server: 0.0.0.0/0.0.0.0:8032″ 的錯誤。

同樣的,關閉 YARN 的腳本如下:
# ./sbin/stop-yarn.sh
# ./sbin/mr-jobhistory-daemon.sh stop historyserver


hadoop 常用命令
# 查看HDFS文件列表
hadoop fs -ls /usr/local/log/

# 創建文件目錄
hadoop fs -mkdir /usr/local/log/test

# 刪除文件
/hadoop fs -rm /usr/local/log/07

# 上傳一個本機文件到HDFS中/usr/local/log/目錄下
adoop fs -put /usr/local/src/infobright-4.0.6-0-x86_64-ice.rpm  /usr/local/log/

# 下載
hadoop fs –get /usr/local/log/infobright-4.0.6-0-x86_64-ice.rpm   /usr/local/src/

# 查看文件
hadoop fs -cat /usr/local/log/zabbix/access.log.zabbix

# 查看HDFS基本使用情況
# hadoop dfsadmin -report
DEPRECATED: Use of this script to execute hdfs command is deprecated.
Instead use the hdfs command for it.

Configured Capacity: 29565767680 (27.54 GB)
Present Capacity: 17956433920 (16.72 GB)
DFS Remaining: 17956405248 (16.72 GB)
DFS Used: 28672 (28 KB)
DFS Used%: 0.00%
Under replicated blocks: 0
Blocks with corrupt replicas: 0
Missing blocks: 0

-------------------------------------------------
Live datanodes (1):

Name: 127.0.0.1:50010 (localhost)
Hostname: ocean-lab.ocean.org
Decommission Status : Normal
Configured Capacity: 29565767680 (27.54 GB)
DFS Used: 28672 (28 KB)
Non DFS Used: 11609333760 (10.81 GB)
DFS Remaining: 17956405248 (16.72 GB)
DFS Used%: 0.00%
DFS Remaining%: 60.73%
Configured Cache Capacity: 0 (0 B)
Cache Used: 0 (0 B)
Cache Remaining: 0 (0 B)
Cache Used%: 100.00%
Cache Remaining%: 0.00%
Xceivers: 1
Last contact: Thu Dec 24 09:52:14 CST 2015



自此,你已經掌握 Hadoop 的配置和基本使用了。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章