
<a href="#_Toc25536%20">目錄 1</a>
<a href="#_Toc28975%20">1. 前言 2</a>
<a href="#_Toc13072%20">2. 部署 2</a>
<a href="#_Toc9619%20">2.1. 機器清單 2</a>
<a href="#_Toc391%20">2.2. 主機名 2</a>
<a href="#_Toc32612%20">2.2.1. 臨時修改主機名 3</a>
<a href="#_Toc3091%20">2.2.2. 永久修改主機名 3</a>
<a href="#_Toc24800%20">2.3. 免密碼登入範圍 4</a>
<a href="#_Toc2269%20">3. 約定 4</a>
<a href="#_Toc6375%20">3.1. 安裝目錄約定 4</a>
<a href="#_Toc7990%20">3.2. 服務端口約定 5</a>
<a href="#_Toc15792%20">4. 工作詳單 6</a>
<a href="#_Toc4092%20">5. JDK安裝 6</a>
<a href="#_Toc2590%20">5.1. 下載下傳安裝包 6</a>
<a href="#_Toc6680%20">5.2. 安裝步驟 6</a>
<a href="#_Toc15037%20">6. 免密碼ssh2登入 7</a>
<a href="#_Toc17413%20">7. Hadoop安裝和配置 8</a>
<a href="#_Toc4019%20">7.1. 下載下傳安裝包 8</a>
<a href="#_Toc14982%20">7.2. 安裝和環境變量配置 8</a>
<a href="#_Toc807%20">7.3. 修改hadoop-env.sh 9</a>
<a href="#_Toc13799%20">7.4. 修改/etc/hosts 9</a>
<a href="#_Toc32746%20">7.5. 修改slaves 10</a>
<a href="#_Toc8841%20">7.6. 準備好各配置檔案 10</a>
<a href="#_Toc617%20">7.7. 修改core-site.xml 11</a>
<a href="#_Toc28291%20">7.8. 修改hdfs-site.xml 11</a>
<a href="#_Toc7730%20">7.8.1. dfs.namenode.rpc-address 11</a>
<a href="#_Toc11682%20">7.9. 修改mapred-site.xml 12</a>
<a href="#_Toc29836%20">7.10. 修改yarn-site.xml 12</a>
<a href="#_Toc3598%20">8. 啟動HDFS 12</a>
<a href="#_Toc19706%20">8.1. 格式化NameNode 12</a>
<a href="#_Toc11092%20">8.2. 啟動HDFS 13</a>
<a href="#_Toc18075%20">8.3. 檢查啟動是否成功 13</a>
<a href="#_Toc31414%20">8.3.1. DataNode 13</a>
<a href="#_Toc4549%20">8.3.2. NameNode 14</a>
<a href="#_Toc8931%20">8.3.3. SecondaryNameNode 14</a>
<a href="#_Toc23382%20">8.4. 執行HDFS指令 14</a>
<a href="#_Toc25224%20">8.4.1. hdfs dfs ls 14</a>
<a href="#_Toc8065%20">8.4.2. hdfs dfs -put 14</a>
<a href="#_Toc1116%20">8.4.3. hdfs dfs -rm 15</a>
<a href="#_Toc2090%20">9. 啟動YARN 15</a>
<a href="#_Toc5265%20">9.1. 啟動YARN 15</a>
<a href="#_Toc23316%20">9.2. 執行YARN指令 15</a>
<a href="#_Toc27349%20">9.2.1. yarn node -list 15</a>
<a href="#_Toc24161%20">9.2.2. yarn node -status 16</a>
<a href="#_Toc30019%20">10. 運作MapReduce程式 16</a>
<a href="#_Toc3641%20">11. 常見錯誤 17</a>
<a href="#_Toc21494%20">11.1. 執行“hdfs dfs -ls”時報ConnectException 17</a>
<a href="#_Toc5271%20">11.2. Incompatible clusterIDs 18</a>
<a href="#_Toc4635%20">11.3. Inconsistent checkpoint fields 20</a>
<a href="#_Toc15498%20">12. 相關文檔 21</a>
本文的目的是為目前最新版本的Hadoop 2.4.0提供最為詳細的安裝說明,以幫助減少安裝過程中遇到的困難,并對一些錯誤原因進行說明。本文的安裝隻涉及了hadoop-common、hadoop-hdfs、hadoop-mapreduce和hadoop-yarn,并不包含HBase、Hive和Pig等。
共5台機器,部署如下表所示:
NameNode
SecondaryNameNode
DataNodes
172.25.40.171
172.25.39.166
10.12.154.77
10.12.154.78
10.12.154.79
機器IP
對應的主機名
VM-40-171-sles10-64
VM-39-166-sles10-64
DEVNET-154-77
DEVNET-154-70
DEVNET-154-79
注意主機名不能有下劃線,否則啟動時,SecondaryNameNode節點會報如下所示的錯誤(取自hadoop-hadoop-secondarynamenode-VM_39_166_sles10_64.out檔案):
Java HotSpot(TM) 64-Bit Server VM warning: You have loaded library /data/hadoop/hadoop-2.4.0/lib/native/libhadoop.so.1.0.0 which might have disabled stack guard. The VM will try to fix the stack guard now.
It's highly recommended that you fix the library with 'execstack -c ', or link it with '-z noexecstack'.
Exception in thread "main" java.lang.IllegalArgumentException: The value of property bind.address must not be null
at com.google.common.base.Preconditions.checkArgument(Preconditions.java:88)
at org.apache.hadoop.conf.Configuration.set(Configuration.java:971)
at org.apache.hadoop.conf.Configuration.set(Configuration.java:953)
at org.apache.hadoop.http.HttpServer2.initializeWebServer(HttpServer2.java:391)
at org.apache.hadoop.http.HttpServer2.(HttpServer2.java:344)
at org.apache.hadoop.http.HttpServer2.(HttpServer2.java:104)
at org.apache.hadoop.http.HttpServer2$Builder.build(HttpServer2.java:292)
at org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode.initialize(SecondaryNameNode.java:264)
at org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode.(SecondaryNameNode.java:192)
at org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode.main(SecondaryNameNode.java:651)
指令hostname不但可以檢視主機名,還可以用它來修改主機名,格式為:hostname 新主機名。
在修改之前172.25.40.171對應的主機名為VM-40-171-sles10-64,而172.25.39.166對應的主機名為VM_39_166_sles10_64。兩者的主機名均帶有下劃線,是以需要修改。為求簡單,僅将原下劃線改成橫線:
hostname VM-40-171-sles10-64
hostname VM-39-166-sles10-64
經過上述修改後,還不夠,類似于修改環境變量,還需要通過修改系統配置檔案做永久修改。
不行的Linux發行版本,對應的系統配置檔案可能不同,對于SuSE 10.1,它的是/etc/HOSTNAME:
# cat /etc/HOSTNAME
VM_39_166_sles10_64
将檔案中的“VM_39_166_sles10_64”,改成“VM-39-166-sles10-64”。有些Linux發行版本對應的可能是/etc/hostname檔案,有些可能是/etc/sysconfig/network檔案。
不但所在檔案不同,修改的方法可能也不一樣,比如有些是名字對形式,如:HOSTNAME=主機名。
修改之後,需要重新開機網卡,以使修改生效,執行指令:/etc/rc.d/boot.localnet start(不同系統,指令會有差異,這是SuSE上的方法),再次使用hostname檢視,會發現主機名變了。
直接重新開機系統,也可以使修改生效。
注意修改主機名後,需要重新驗證ssh免密碼登入,方法為:ssh 使用者名@新的主機名。
要求能通過免登入包括使用IP和主機名都能免密碼登入:
1) NameNode能免密碼登入所有的DataNode
2) SecondaryNameNode能免密碼登入所有的DataNode
3) NameNode能免密碼登入自己
4) SecondaryNameNode能免密碼登入自己
5) NameNode能免密碼登入SecondaryNameNode
6) SecondaryNameNode能免密碼登入NameNode
7) DataNode能免密碼登入自己
8) DataNode不需要配置免密碼登入NameNode、SecondaryNameNode和其它DataNode。
為便于講解,本文約定Hadoop、JDK安裝目錄如下:
安裝目錄
版本
說明
JDK
/data/jdk
1.7.0
ln -s /data/jdk1.7.0_55 /data/jdk
Hadoop
/data/hadoop/current
2.4.0
ln -s /data/hadoop/hadoop-2.4.0 /data/hadoop/current
在實際安裝部署時,可以根據實際進行修改。
端口
作用
9000
fs.defaultFS,如:hdfs://172.25.40.171:9000
9001
dfs.namenode.rpc-address,DataNode會連接配接這個端口
50070
dfs.namenode.http-address
50470
dfs.namenode.https-address
50100
dfs.namenode.backup.address
50105
dfs.namenode.backup.http-address
50090
dfs.namenode.secondary.http-address,如:172.25.39.166:50090
50091
dfs.namenode.secondary.https-address,如:172.25.39.166:50091
50020
dfs.datanode.ipc.address
50075
dfs.datanode.http.address
50475
dfs.datanode.https.address
50010
dfs.datanode.address,DataNode的資料傳輸端口
8480
dfs.journalnode.rpc-address
8481
dfs.journalnode.https-address
8032
yarn.resourcemanager.address
8088
yarn.resourcemanager.webapp.address,YARN的http端口
8090
yarn.resourcemanager.webapp.https.address
8030
yarn.resourcemanager.scheduler.address
8031
yarn.resourcemanager.resource-tracker.address
8033
yarn.resourcemanager.admin.address
8042
yarn.nodemanager.webapp.address
8040
yarn.nodemanager.localizer.address
8188
yarn.timeline-service.webapp.address
10020
mapreduce.jobhistory.address
19888
mapreduce.jobhistory.webapp.address
2888
ZooKeeper,如果是Leader,用來監聽Follower的連接配接
3888
ZooKeeper,用于Leader選舉
2181
ZooKeeper,用來監聽用戶端的連接配接
60010
hbase.master.info.port,HMaster的http端口
60000
hbase.master.port,HMaster的RPC端口
60030
hbase.regionserver.info.port,HRegionServer的http端口
60020
hbase.regionserver.port,HRegionServer的RPC端口
8080
hbase.rest.port,HBase REST server的端口
10000
hive.server2.thrift.port
9083
hive.metastore.uris
為運作Hadoop(HDFS、YARN和MapReduce)需要完成的工作詳單:
<a href="#_JDK%E5%AE%89%E8%A3%85">JDK安裝</a>
Hadoop是Java語言開發的,是以需要。
<a href="#_%E5%85%8D%E5%AF%86%E7%A0%81%E7%99%BB%E5%BD%95">免密碼登入</a>
NameNode控制SecondaryNameNode和DataNode使用了ssh和scp指令,需要無密碼執行。
這裡指的是HDFS、YARN和MapReduce,不包含HBase、Hive等的安裝。
本文安裝的JDK 1.7.0版本,基于JDK1.8版本也可以安裝成功,但建議采用JDK1.7版本。原因是在編譯Hadoop 2.4.0源碼時,使用JDK1.8時大量文法錯誤,改用JDK1.7版本後,順序通過,詳情請參見《在Linux上編譯Hadoop-2.4.0》一文。
JDK最新二進制安裝包下載下傳網址:
<a href="http://www.oracle.com/technetwork/java/javase/downloads">http://www.oracle.com/technetwork/java/javase/downloads</a>
JDK1.7二進制安裝包下載下傳網址:
<a href="http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html">http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html</a>
本文下載下傳的是64位Linux版本的JDK1.7:jdk-7u55-linux-x64.gz。請不要安裝JDK1.8版本,JDK1.8和Hadoop 2.4.0不比對,編譯Hadoop 2.4.0源碼時會報很多錯誤。
JDK的安裝非常簡單,将jdk-7u55-linux-x64.gz上傳到Linux,然後解壓,接着配置好環境變量即可(本文jdk-7u55-linux-x64.gz被上傳在/data目錄下):
1) 進入/data目錄
2) 解壓安裝包:tar xzf jdk-7u55-linux-x64.gz,解壓後會在生成目錄/data/jdk1.7.0_55
3) 建立軟體連結:ln -s /data/jdk1.7.0_55 /data/jdk
4) 修改/etc/profile或使用者目錄下的profile,或同等檔案,配置如下所示環境變量:
export JAVA_HOME=/data/jdk
export CLASSPATH=$JAVA_HOME/lib/tools.jar
export PATH=$JAVA_HOME/bin:$PATH
完成這項操作之後,需要重新登入,或source一下profile檔案,以便環境變量生效,當然也可以手工運作一下,以即時生效。如果還不放心,可以運作下java或javac,看看指令是否可執行。如果在安裝JDK之前,已經可執行了,則表示不用安裝JDK。
以下針對的是ssh2,而不是ssh,也不包括OpenSSH。配置分兩部分:一是對登入機的配置,二是對被登入機的配置,其中登入機為用戶端,被登入機為服務端,也就是解決用戶端到服務端的無密碼登入問題。下述涉及到的指令,可以直接拷貝到Linux終端上執行,已全部驗證通過,操作環境為SuSE 10.1。
第一步,修改所有被登入機上的sshd配置檔案/etc/ssh2/sshd2_config:
1) 将PermitRootLogin值設定為yes,也就是取掉前面的注釋号#
2) 将AllowedAuthentications值設定為publickey,password,也就是取掉前面的注釋号#
3) 重新開機sshd服務:service ssh2 restart
第二步,在所有登入機上,執行以下步驟:
1) 進入到.ssh2目錄:cd ~/.ssh2
2) ssh-keygen2 -t dsa -P''
-P表示密碼,-P''就表示空密碼,也可以不用-P參數,但這樣就要敲三次Enter鍵,用-P''就一次回車。
成功之後,會在使用者的主目錄下生成私鑰檔案id_dsa_2048_a,和公鑰檔案id_dsa_2048_a.pub。
3) 生成identification檔案:echo "IdKey id_dsa_2048_a" >> identification,請注意IdKey後面有一個空格,確定identification檔案内容如下:
# cat identification
IdKey id_dsa_2048_a
第三步,在所有被登入機上,執行以下步驟:
2) 生成authorization檔案:echo "Key id_dsa_2048_a.pub" >> authorization,請注意Key後面有一個空格,確定authorization檔案内容如下:
# cat authorization
Key id_dsa_2048_a.pub
完成上述工作之後,從登入機到被登入機的ssh登入就不需要密碼了。如果沒有配置好免密碼登入,在啟動時會遇到如下錯誤:
Starting namenodes on [172.25.40.171]
172.25.40.171: Host key not found from database.
172.25.40.171: Key fingerprint:
172.25.40.171: xofiz-zilip-tokar-rupyb-tufer-tahyc-sibah-kyvuf-palik-hazyt-duxux
172.25.40.171: You can get a public key's fingerprint by running
172.25.40.171: % ssh-keygen -F publickey.pub
172.25.40.171: on the keyfile.
172.25.40.171: warning: tcgetattr failed in ssh_rl_set_tty_modes_for_fd: fd 1: Invalid argument
或下列這樣的錯誤:
172.25.40.171: hadoop's password:
建議生成的私鑰和公鑰檔案名都帶上自己的IP,否則會有些混亂。
本部分僅包括HDFS、MapReduce和Yarn的安裝,不包括HBase、Hive等的安裝。
官方的安裝說明請浏覽Cluster Setup:
1) 将Hadoop安裝包hadoop-2.4.0.tar.gz上傳到/data/hadoop目錄下
2) 進入/data/hadoop目錄
3) 在/data/hadoop目錄下,解壓安裝包hadoop-2.4.0.tar.gz:tar xzf hadoop-2.4.0.tar.gz
4) 建立軟體連結:ln -s /data/hadoop/hadoop-2.4.0 /data/hadoop/current
5) 修改使用者主目錄下的檔案.profile(當然也可以是/etc/profile),設定Hadoop環境變量:
export HADOOP_HOME=/data/hadoop/current
export PATH=$HADOOP_HOME/bin:$PATH
需要重新登入以生效,或者在終端上執行:export HADOOP_HOME=/data/hadoop/current也可以即時生效。
修改所有節點上的$HADOOP_HOME/etc/hadoop/hadoop-env.sh檔案,在靠近檔案頭部分加入:export JAVA_HOME=/data/jdk
特别說明一下:雖然在/etc/profile已經添加了JAVA_HOME,但仍然得修改所有節點上的hadoop-env.sh,否則啟動時,報如下所示的錯誤:
10.12.154.79: Error: JAVA_HOME is not set and could not be found.
10.12.154.77: Error: JAVA_HOME is not set and could not be found.
10.12.154.78: Error: JAVA_HOME is not set and could not be found.
為省去不必要的麻煩,建議在所有節點的/etc/hosts檔案,都做如下所配置:
172.25.40.171 VM-40-171-sles10-64 # NameNode
172.25.39.166 VM-39-166-sles10-64 # SecondaryNameNode
10.12.154.77 DEVNET-154-77 # DataNode
10.12.154.78 DEVNET-154-70 # DataNode
10.12.154.79 DEVNET-154-79 # DataNode
注意不要為一個IP配置多個不同主機名,否則HTTP頁面可能無法正常運作。
主機名,如VM-39-166-sles10-64,可通過hostname指令取得。由于都配置了主機名,在啟動HDFS或其它之前,需要確定針對主機名進行過ssh,否則啟動時,會遇到如下所示的錯誤:
VM-39-166-sles10-64: Host key not found from database.
VM-39-166-sles10-64: Key fingerprint:
VM-39-166-sles10-64: xofiz-zilip-tokar-rupyb-tufer-tahyc-sibah-kyvuf-palik-hazyt-duxux
VM-39-166-sles10-64: You can get a public key's fingerprint by running
VM-39-166-sles10-64: % ssh-keygen -F publickey.pub
VM-39-166-sles10-64: on the keyfile.
VM-39-166-sles10-64: warning: tcgetattr failed in ssh_rl_set_tty_modes_for_fd: fd 1: Invalid argument
上述錯誤表示沒有以主機名ssh過一次VM-39-166-sles10-64。按下列方法修複錯誤:
ssh hadoop@VM-39-166-sles10-64
Host key not found from database.
Key fingerprint:
xofiz-zilip-tokar-rupyb-tufer-tahyc-sibah-kyvuf-palik-hazyt-duxux
You can get a public key's fingerprint by running
% ssh-keygen -F publickey.pub
on the keyfile.
Are you sure you want to continue connecting (yes/no)? yes
Host key saved to /data/hadoop/.ssh2/hostkeys/key_36000_137vm_13739_137166_137sles10_13764.pub
host key for VM-39-166-sles10-64, accepted by hadoop Thu Apr 17 2014 12:44:32 +0800
Authentication successful.
Last login: Thu Apr 17 2014 09:24:54 +0800 from 10.32.73.69
Welcome to SuSE Linux 10 SP2 64Bit Nov 10,2010 by DIS
Version v2.6.20101110
No mail.
修改NameNode和SecondaryNameNode上的$HADOOP_HOME/etc/hadoop/slaves檔案,将slaves的節點IP(也可以是相應的主機名)一個人加進去,一行一個IP,如下所示:
> cat slaves
配置檔案放在$HADOOP_HOME/etc/hadoop目錄下,對于Hadoop 2.3.0和Hadoop 2.4.0版本,該目錄下的core-site.xml、yarn-site.xml、hdfs-site.xml和mapred-site.xml都是空的。如果不配置好就啟動,如執行start-dfs.sh,則會遇到各種錯誤。
可從$HADOOP_HOME/share/hadoop目錄下拷貝一份到/etc/hadoop目錄,然後在此基礎上進行修改(以下内容可以直接拷貝執行,2.3.0版本中各default.xml檔案路徑不同于2.4.0版本):
# 進入$HADOOP_HOME目錄
cd $HADOOP_HOME
cp ./share/doc/hadoop/hadoop-project-dist/hadoop-common/core-default.xml ./etc/hadoop/core-site.xml
cp ./share/doc/hadoop/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml ./etc/hadoop/hdfs-site.xml
cp ./share/doc/hadoop/hadoop-yarn/hadoop-yarn-common/yarn-default.xml ./etc/hadoop/yarn-site.xml
cp ./share/doc/hadoop/hadoop-mapreduce-client/hadoop-mapreduce-client-core/mapred-default.xml ./etc/hadoop/mapred-site.xml
接下來,需要對預設的core-site.xml、yarn-site.xml、hdfs-site.xml和mapred-site.xml進行适當的修改,否則仍然無法啟動成功。
對core-site.xml檔案的修改,涉及下表中的屬性:
屬性名
屬性值
涉及範圍
fs.defaultFS
hdfs://172.25.40.171:9000
所有節點
hadoop.tmp.dir
/data/hadoop/current/tmp
dfs.datanode.data.dir
/data/hadoop/current/data
所有DataNode,在hdfs-site.xml也有這個屬性
注意啟動之前,需要将配置的目錄建立好,如建立好/data/hadoop/current/tmp目錄。詳細可參考:
對hdfs-site.xml檔案的修改,涉及下表中的屬性:
dfs.namenode.rpc-address
172.25.40.171:9001
dfs.namenode.secondary.http-address
172.25.39.166:50090
dfs.namenode.name.dir
/data/hadoop/current/dfs/name
所有DataNode
詳細配置可參考:
如果沒有配置,則啟動時報如下錯誤:
Incorrect configuration: namenode address dfs.namenode.servicerpc-address or dfs.namenode.rpc-address is not configured.
這裡需要指定IP和端口,如果隻指定了IP,如172.25.40.171,則啟動時輸出如下:
Starting namenodes on []
改成“172.25.40.171:9001”後,則啟動時輸出為:
mapreduce.framework.name
yarn
對yarn-site.xml檔案的修改,涉及下表中的屬性:
yarn.resourcemanager.hostname
ResourceManager
NodeManager
yarn.nodemanager.hostname
0.0.0.0
所有的NodeManager
yarn.nodemanager.hostname如果配置成具體的IP,如10.12.154.79,則會導緻每個NamoManager的配置不同。詳細配置可參考:
在啟動HDFS之前,需要先完成對NameNode的格式化。
1) 進入$HADOOP_HOME/bin目錄
2) 進行格式化:./hdfs namenode -format
如果完成有,輸出包含“INFO util.ExitUtil: Exiting with status 0”,則表示格式化成功。
在進行格式化時,如果沒有在/etc/hosts檔案中添加主機名和IP的映射:“172.25.40.171 VM-40-171-sles10-64”,則會報如下所示錯誤:
14/04/17 03:44:09 WARN net.DNS: Unable to determine local hostname -falling back to "localhost"
java.net.UnknownHostException: VM-40-171-sles10-64: VM-40-171-sles10-64: unknown error
at java.net.InetAddress.getLocalHost(InetAddress.java:1484)
at org.apache.hadoop.net.DNS.resolveLocalHostname(DNS.java:264)
at org.apache.hadoop.net.DNS.(DNS.java:57)
at org.apache.hadoop.hdfs.server.namenode.NNStorage.newBlockPoolID(NNStorage.java:945)
at org.apache.hadoop.hdfs.server.namenode.NNStorage.newNamespaceInfo(NNStorage.java:573)
at org.apache.hadoop.hdfs.server.namenode.FSImage.format(FSImage.java:144)
at org.apache.hadoop.hdfs.server.namenode.NameNode.format(NameNode.java:845)
at org.apache.hadoop.hdfs.server.namenode.NameNode.createNameNode(NameNode.java:1256)
at org.apache.hadoop.hdfs.server.namenode.NameNode.main(NameNode.java:1370)
Caused by: java.net.UnknownHostException: VM-40-171-sles10-64: unknown error
at java.net.Inet4AddressImpl.lookupAllHostAddr(Native Method)
at java.net.InetAddress$2.lookupAllHostAddr(InetAddress.java:907)
at java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1302)
at java.net.InetAddress.getLocalHost(InetAddress.java:1479)
... 8 more
1) 進入$HADOOP_HOME/sbin目錄
2) 啟動HDFS:./start-dfs.sh
啟動時,遇到如下所示的錯誤,則表示NameNode不能免密碼登入自己。如果之前使用IP可以免密碼登入自己,則原因一般是因為沒有使用主機名登入過自己,是以解決辦法是使用主機名SSH一下,比如:ssh hadoop@VM_40_171_sles10_64,然後再啟動。
Starting namenodes on [VM_40_171_sles10_64]
VM_40_171_sles10_64: Host key not found from database.
VM_40_171_sles10_64: Key fingerprint:
VM_40_171_sles10_64: xofiz-zilip-tokar-rupyb-tufer-tahyc-sibah-kyvuf-palik-hazyt-duxux
VM_40_171_sles10_64: You can get a public key's fingerprint by running
VM_40_171_sles10_64: % ssh-keygen -F publickey.pub
VM_40_171_sles10_64: on the keyfile.
VM_40_171_sles10_64: warning: tcgetattr failed in ssh_rl_set_tty_modes_for_fd: fd 1: Invalid argument
1) 使用JDK提供的jps指令,檢視相應的程序是否已啟動
2) 檢查$HADOOP_HOME/logs目錄下的log和out檔案,看看是否有異常資訊。
執行jps指令,可看到DataNode程序:
$ jps
18669 DataNode
24542 Jps
執行jps指令,可看到NameNode程序:
18669 NameNode
執行jps指令,可看到:
3839 SecondaryNameNode
執行HDFS指令,以進一步檢驗是否已經安裝成功和配置好。關于HDFS指令的用法,直接運作指令hdfs或hdfs dfs,即可看到相關的用法說明。
“hdfs dfs -ls”帶一個參數,如果參數以“hdfs://URI”打頭表示通路HDFS,否則相當于ls。其中URI為NameNode的IP或主機名,可以包含端口号,即hdfs-site.xml中“dfs.namenode.rpc-address”指定的值。
“hdfs dfs -ls”要求預設端口為8020,如果配置成9000,則需要指定端口号,否則不用指定端口,這一點類似于浏覽器通路一個URL。示例:
> hdfs dfs -ls hdfs://172.25.40.171:9001/
9001後面的斜杠/是和必須的,否則被當作檔案。如果不指定端口号9001,則使用預設的8020,“172.25.40.171:9001”由hdfs-site.xml中“dfs.namenode.rpc-address”指定。
不難看出“hdfs dfs -ls”可以操作不同的HDFS叢集,隻需要指定不同的URI。
檔案上傳後,被存儲在DataNode的data目錄下(由DataNode的hdfs-site.xml中的屬性“dfs.datanode.data.dir”指定),如:
$HADOOP_HOME/data/current/BP-139798373-172.25.40.171-1397735615751/current/finalized/blk_1073741825
檔案名中的“blk”是block,即塊的意思,預設情況下blk_1073741825即為檔案的一個完整塊,Hadoop未對它進額外處理。
上傳檔案指令,示例:
> hdfs dfs -put /etc/SuSE-release hdfs://172.25.40.171:9001/
删除檔案指令,示例:
> hdfs dfs -rm hdfs://172.25.40.171:9001/SuSE-release
Deleted hdfs://172.25.40.171:9001/SuSE-release
2) 執行:start-yarn.sh,即開始啟動YARN
若啟動成功,則在Master節點執行jps,可以看到ResourceManager:
> jps
24689 NameNode
30156 Jps
28861 ResourceManager
在Slaves節點執行jps,可以看到NodeManager:
14019 NodeManager
23257 DataNode
15115 Jps
列舉YARN叢集中的所有NodeManager,如:
> yarn node -list
Total Nodes:3
Node-Id Node-State Node-Http-Address Number-of-Running-Containers
localhost:45980 RUNNING localhost:8042 0
localhost:47551 RUNNING localhost:8042 0
localhost:58394 RUNNING localhost:8042 0
檢視指定NodeManager的狀态,如:
> yarn node -status localhost:47551
Node Report :
Node-Id : localhost:47551
Rack : /default-rack
Node-State : RUNNING
Node-Http-Address : localhost:8042
Last-Health-Update : 星期五 18/四月/14 01:45:41:555GMT
Health-Report :
Containers : 0
Memory-Used : 0MB
Memory-Capacity : 8192MB
CPU-Used : 0 vcores
CPU-Capacity : 8 vcores
在安裝目錄的share/hadoop/mapreduce子目錄下,有現存的示例程式:
hadoop@VM-40-171-sles10-64:~/current> ls share/hadoop/mapreduce
hadoop-mapreduce-client-app-2.4.0.jar hadoop-mapreduce-client-jobclient-2.4.0-tests.jar
hadoop-mapreduce-client-common-2.4.0.jar hadoop-mapreduce-client-shuffle-2.4.0.jar
hadoop-mapreduce-client-core-2.4.0.jar hadoop-mapreduce-examples-2.4.0.jar
hadoop-mapreduce-client-hs-2.4.0.jar lib
hadoop-mapreduce-client-hs-plugins-2.4.0.jar lib-examples
hadoop-mapreduce-client-jobclient-2.4.0.jar sources
跑一個示例程式試試:
hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.4.0.jar wordcount ./in ./out
wordcount運作完成後,結果會儲存在out目錄下,儲存結果的檔案名類似于“part-r-00000”。另外,跑這個示例程式有兩個需求注意的點:
1) in目錄下要有文本檔案,或in即為被統計的文本檔案,可以為HDFS上的檔案或目錄,也可以為本地檔案或目錄
2) out目錄不能存在,程式會自動去建立它,如果已經存在則會報錯。
包hadoop-mapreduce-examples-2.4.0.jar中含有多個示例程式,不帶參數運作,即可看到用法:
> hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.4.0.jar wordcount
Usage: wordcount
> hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.4.0.jar
An example program must be given as the first argument.
Valid program names are:
aggregatewordcount: An Aggregate based map/reduce program that counts the words in the input files.
aggregatewordhist: An Aggregate based map/reduce program that computes the histogram of the words in the input files.
bbp: A map/reduce program that uses Bailey-Borwein-Plouffe to compute exact digits of Pi.
dbcount: An example job that count the pageview counts from a database.
distbbp: A map/reduce program that uses a BBP-type formula to compute exact bits of Pi.
grep: A map/reduce program that counts the matches of a regex in the input.
join: A job that effects a join over sorted, equally partitioned datasets
multifilewc: A job that counts words from several files.
pentomino: A map/reduce tile laying program to find solutions to pentomino problems.
pi: A map/reduce program that estimates Pi using a quasi-Monte Carlo method.
randomtextwriter: A map/reduce program that writes 10GB of random textual data per node.
randomwriter: A map/reduce program that writes 10GB of random data per node.
secondarysort: An example defining a secondary sort to the reduce.
sort: A map/reduce program that sorts the data written by the random writer.
sudoku: A sudoku solver.
teragen: Generate data for the terasort
terasort: Run the terasort
teravalidate: Checking results of terasort
wordcount: A map/reduce program that counts the words in the input files.
wordmean: A map/reduce program that counts the average length of the words in the input files.
wordmedian: A map/reduce program that counts the median length of the words in the input files.
wordstandarddeviation: A map/reduce program that counts the standard deviation of the length of the words in the input files.
原因可能是指定的端口号9000不對,該端口号由hdfs-site.xml中的屬性“dfs.namenode.rpc-address”指定,即為NameNode的RPC服務端口号。
檔案上傳後,被存儲在DataNode的data(由DataNode的hdfs-site.xml中的屬性“dfs.datanode.data.dir”指定)目錄下,如:
hdfs dfs -ls hdfs://172.25.40.171:9000
14/04/17 12:04:02 WARN conf.Configuration: mapred-site.xml:an attempt to override final parameter: mapreduce.job.end-notification.max.attempts; Ignoring.
14/04/17 12:04:02 WARN conf.Configuration: mapred-site.xml:an attempt to override final parameter: mapreduce.job.end-notification.max.retry.interval; Ignoring.
14/04/17 12:04:02 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
14/04/17 12:04:03 WARN conf.Configuration: mapred-site.xml:an attempt to override final parameter: mapreduce.job.end-notification.max.attempts; Ignoring.
14/04/17 12:04:03 WARN conf.Configuration: mapred-site.xml:an attempt to override final parameter: mapreduce.job.end-notification.max.retry.interval; Ignoring.
ls: Call From VM-40-171-sles10-64/172.25.40.171 to VM-40-171-sles10-64:9000 failed on connection exception: java.net.ConnectException: 拒絕連接配接; For more details see: http://wiki.apache.org/hadoop/ConnectionRefused
“Incompatible clusterIDs”的錯誤原因是在執行“hdfs namenode -format”之前,沒有清空DataNode節點的data目錄。
網上一些文章和文章說是tmp目錄,它本身也是沒問題的,但Hadoop 2.4.0是data目錄,實際上這個資訊已經由日志的“/data/hadoop/hadoop-2.4.0/data”指出,是以不能死死的參照網上的解決辦法,遇到問題時多仔細觀察。
從上述描述不難看出,解決辦法就是清空所有DataNode的data目錄,但注意不要将data目錄本身給删除了。
data目錄由core-site.xml檔案中的屬性“dfs.datanode.data.dir”指定。
2014-04-17 19:30:33,075 INFO org.apache.hadoop.hdfs.server.common.Storage: Lock on /data/hadoop/hadoop-2.4.0/data/in_use.lock acquired by nodename 28326@localhost
2014-04-17 19:30:33,078 FATAL org.apache.hadoop.hdfs.server.datanode.DataNode: Initialization failed for block pool Block pool (Datanode Uuid unassigned) service to /172.25.40.171:9001
java.io.IOException: Incompatible clusterIDs in /data/hadoop/hadoop-2.4.0/data: namenode clusterID = CID-50401d89-a33e-47bf-9d14-914d8f1c4862; datanode clusterID = CID-153d6fcb-d037-4156-b63a-10d6be224091
at org.apache.hadoop.hdfs.server.datanode.DataStorage.doTransition(DataStorage.java:472)
at org.apache.hadoop.hdfs.server.datanode.DataStorage.recoverTransitionRead(DataStorage.java:225)
at org.apache.hadoop.hdfs.server.datanode.DataStorage.recoverTransitionRead(DataStorage.java:249)
at org.apache.hadoop.hdfs.server.datanode.DataNode.initStorage(DataNode.java:929)
at org.apache.hadoop.hdfs.server.datanode.DataNode.initBlockPool(DataNode.java:900)
at org.apache.hadoop.hdfs.server.datanode.BPOfferService.verifyAndSetNamespaceInfo(BPOfferService.java:274)
at org.apache.hadoop.hdfs.server.datanode.BPServiceActor.connectToNNAndHandshake(BPServiceActor.java:220)
at org.apache.hadoop.hdfs.server.datanode.BPServiceActor.run(BPServiceActor.java:815)
at java.lang.Thread.run(Thread.java:744)
2014-04-17 19:30:33,081 WARN org.apache.hadoop.hdfs.server.datanode.DataNode: Ending block pool service for: Block pool (Datanode Uuid unassigned) service to /172.25.40.171:9001
2014-04-17 19:30:33,184 WARN org.apache.hadoop.hdfs.server.datanode.DataNode: Block pool ID needed, but service not yet registered with NN
java.lang.Exception: trace
at org.apache.hadoop.hdfs.server.datanode.BPOfferService.getBlockPoolId(BPOfferService.java:143)
at org.apache.hadoop.hdfs.server.datanode.BlockPoolManager.remove(BlockPoolManager.java:91)
at org.apache.hadoop.hdfs.server.datanode.DataNode.shutdownBlockPool(DataNode.java:859)
at org.apache.hadoop.hdfs.server.datanode.BPOfferService.shutdownActor(BPOfferService.java:350)
at org.apache.hadoop.hdfs.server.datanode.BPServiceActor.cleanUp(BPServiceActor.java:619)
at org.apache.hadoop.hdfs.server.datanode.BPServiceActor.run(BPServiceActor.java:837)
2014-04-17 19:30:33,184 INFO org.apache.hadoop.hdfs.server.datanode.DataNode: Removed Block pool (Datanode Uuid unassigned)
at org.apache.hadoop.hdfs.server.datanode.DataNode.shutdownBlockPool(DataNode.java:861)
2014-04-17 19:30:35,185 WARN org.apache.hadoop.hdfs.server.datanode.DataNode: Exiting Datanode
2014-04-17 19:30:35,187 INFO org.apache.hadoop.util.ExitUtil: Exiting with status 0
2014-04-17 19:30:35,189 INFO org.apache.hadoop.hdfs.server.datanode.DataNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down DataNode at localhost/127.0.0.1
************************************************************/
SecondaryNameNode中的“Inconsistent checkpoint fields”錯誤原因,可能是因為沒有設定好SecondaryNameNode上core-site.xml檔案中的“hadoop.tmp.dir”。
2014-04-17 11:42:18,189 INFO org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode: Log Size Trigger :1000000 txns
2014-04-17 11:43:18,365 ERROR org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode: Exception in doCheckpoint
java.io.IOException: Inconsistent checkpoint fields.
LV = -56 namespaceID = 1384221685 cTime = 0 ; clusterId = CID-319b9698-c88d-4fe2-8cb2-c4f440f690d4 ; blockpoolId = BP-1627258458-172.25.40.171-1397735061985.
Expecting respectively: -56; 476845826; 0; CID-50401d89-a33e-47bf-9d14-914d8f1c4862; BP-2131387753-172.25.40.171-1397730036484.
at org.apache.hadoop.hdfs.server.namenode.CheckpointSignature.validateStorageInfo(CheckpointSignature.java:135)
at org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode.doCheckpoint(SecondaryNameNode.java:518)
at org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode.doWork(SecondaryNameNode.java:383)
at org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode$1.run(SecondaryNameNode.java:349)
at org.apache.hadoop.security.SecurityUtil.doAsLoginUserOrFatal(SecurityUtil.java:415)
at org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode.run(SecondaryNameNode.java:345)
另外,也請配置好SecondaryNameNode上hdfs-site.xml中的“dfs.datanode.data.dir”為合适的值:
hadoop.tmp.dir
/data/hadoop/current/tmp
A base for other temporary directories.
《HBase-0.98.0分布式安裝指南》
《Hive 0.12.0安裝指南》
《ZooKeeper-3.4.6分布式安裝指南》
《Hadoop 2.3.0源碼反向工程》
《在Linux上編譯Hadoop-2.4.0》
《Accumulo-1.5.1安裝指南》
《Drill 1.0.0安裝指南》
《Shark 0.9.1安裝指南》