溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Hadoop 單節(jié)點 & 偽分布 安裝手記

發(fā)布時間:2020-07-03 09:25:15 來源:網(wǎng)絡(luò) 閱讀:2158 作者:oceanszf 欄目:大數(shù)據(jù)

實驗環(huán)境
CentOS 6.X
Hadoop 2.6.0
JDK    1.8.0_65

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

先決條件
支持平臺
    GNU/Linux是產(chǎn)品開發(fā)和運行的平臺。 Hadoop已在有2000個節(jié)點的GNU/Linux主機組成的集群系統(tǒng)上得到驗證。
    Win32平臺是作為開發(fā)平臺支持的。由于分布式操作尚未在Win32平臺上充分測試,所以還不作為一個生產(chǎn)平臺被支持。

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

創(chuàng)建用戶
# useradd -m hadoop -s /bin/bash   # 創(chuàng)建新用戶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環(huán)境
# 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的發(fā)行版,從Apache的某個鏡像服務(wù)器上下載最近的 穩(wěn)定發(fā)行版。
運行Hadoop集群的準(zhǔn)備工作
# wget http://apache.fayea.com/hadoop/common/hadoop-2.6.0/hadoop-2.6.0.tar.gz

解壓所下載的Hadoop發(fā)行版。編輯 conf/hadoop-env.sh文件,至少需要將JAVA_HOME設(shè)置為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 腳本的使用文檔。


現(xiàn)在你可以用以下三種支持的模式中的一種啟動Hadoop集群:
    單機模式
    偽分布式模式
    完全分布式模式



單機模式的操作方法

默認情況下,Hadoop被配置成以非分布式模式運行的一個獨立Java進程。這對調(diào)試非常有幫助。
現(xiàn)在我們可以執(zhí)行例子來感受下 Hadoop 的運行。Hadoop 附帶了豐富的例子包括 wordcount、terasort、join、grep 等。
在此我們選擇運行 grep 例子,我們將 input 文件夾中的所有文件作為輸入,篩選當(dāng)中符合正則表達式 dfs[a-z.]+ 的單詞并統(tǒng)計出現(xiàn)的次數(shù),最后輸出結(jié)果到 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/*
若執(zhí)行成功的話會輸出很多作業(yè)的相關(guān)信息,最后的輸出信息如下圖所示。作業(yè)的結(jié)果會輸出在指定的 output 文件夾中,通過命令 cat ./output/* 查看結(jié)果,符合正則的單詞 dfsadmin 出現(xiàn)了1次:
[10:57:58][hadoop@ocean-lab hadoop-2.6.0]$ cat ./ouput/*
1 dfsadmin


注意,Hadoop 默認不會覆蓋結(jié)果文件,因此再次運行上面實例會提示出錯,需要先將 ./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
若出現(xiàn)提示 “INFO metrics.MetricsUtil: Unable to obtain hostName java.net.UnknowHostException”,這需要執(zhí)行如下命令修改 hosts 文件,為你的主機名增加IP映射:
# cat /etc/hosts| grep ocean-lab
192.168.9.70     ocean-lab.ocean.org  ocean-lab


偽分布式模式的操作方法

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

在設(shè)置 Hadoop 偽分布式配置前,我們還需要設(shè)置 HADOOP 環(huán)境變量,執(zhí)行如下命令在 ~/.bashrc 中設(shè)置
# 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>

關(guān)于Hadoop配置項的一點說明

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



免密碼ssh設(shè)置
現(xiàn)在確認能否不輸入口令就用ssh登錄localhost:
# ssh localhost date

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


格式化一個新的分布式文件系統(tǒng):
$ 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 p_w_picpaths 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 中的文件。

Hadoop 單節(jié)點 & 偽分布 安裝手記


運行Hadoop偽分布式實例

上面的單機模式,grep 例子讀取的是本地數(shù)據(jù),偽分布式讀取的則是 HDFS 上的數(shù)據(jù)。

要使用 HDFS,首先需要在 HDFS 中創(chuàng)建用戶目錄:
# ./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 文件作為輸入文件復(fù)制到分布式文件系統(tǒng)中,即將 /usr/local/hadoop/etc/hadoop 復(fù)制到分布式文件系統(tǒng)中的 /user/hadoop/input 中。我們使用的是 hadoop 用戶,并且已創(chuàng)建相應(yīng)的用戶目錄 /user/hadoop ,因此在命令中就可以使用相對路徑如 input,其對應(yīng)的絕對路徑就是 /user/hadoop/input:
# ./bin/hdfs dfs -mkdir input
# ./bin/hdfs dfs -put ./etc/hadoop/*.xml input

復(fù)制完成后,可以通過如下命令查看 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 作業(yè)的方式跟單機模式相同,區(qū)別在于偽分布式讀取的是HDFS中的文件(可以將單機步驟中創(chuàng)建的本地 input 文件夾,輸出結(jié)果 output 文件夾都刪掉來驗證這一點)。
# ./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0.jar grep input output 'dfs[a-z.]+'

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


結(jié)果如下,注意到剛才我們已經(jīng)更改了配置文件,所以運行結(jié)果不同。
Hadoop偽分布式運行g(shù)rep的結(jié)果Hadoop偽分布式運行g(shù)rep的結(jié)果
我們也可以將運行結(jié)果取回到本地:
# 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” ,因此若要再次執(zhí)行,需要執(zhí)行如下命令刪除 output 文件夾:
# 刪除 output 文件夾
$./bin/hdfs dfs -rm -r output
Deleted output


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

若要關(guān)閉 Hadoop,則運行
./sbin/stop-dfs.sh


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

YARN 是從 MapReduce 中分離出來的,負責(zé)資源管理與任務(wù)調(diào)度。YARN 運行于 MapReduce 之上,提供了高可用性、高擴展性,YARN 的更多介紹在此不展開,有興趣的可查閱相關(guān)資料。

上述通過 ./sbin/start-dfs.sh 啟動 Hadoop,僅僅是啟動了 MapReduce 環(huán)境,我們可以啟動 YARN ,讓 YARN 來負責(zé)資源管理與任務(wù)調(diào)度。

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

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

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


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

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

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


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

# 創(chuàng)建文件目錄
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



自此,你已經(jīng)掌握 Hadoop 的配置和基本使用了。


向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI