天天看點

Hadoop-2.7.2分布式安裝手冊 Hadoop-2.7.2分布式安裝手冊.pdf目錄 1. 前言 2. 特性介紹 3. 部署 4. 約定 5. 工作詳單 6. JDK安裝 7. 免密碼ssh2登入 8. Hadoop安裝和配置 9. 啟動順序 10. 啟動HDFS 11. 啟動YARN 12. 運作MapReduce程式 13. HDFS權限配置 14. C++用戶端程式設計 15. 常見錯誤 16. 相關文檔

Hadoop-2.7.2分布式安裝手冊 Hadoop-2.7.2分布式安裝手冊.pdf目錄 1. 前言 2. 特性介紹 3. 部署 4. 約定 5. 工作詳單 6. JDK安裝 7. 免密碼ssh2登入 8. Hadoop安裝和配置 9. 啟動順序 10. 啟動HDFS 11. 啟動YARN 12. 運作MapReduce程式 13. HDFS權限配置 14. C++用戶端程式設計 15. 常見錯誤 16. 相關文檔

<a href="#_Toc482%20">目錄 1</a>

<a href="#_Toc16123%20">1. 前言 3</a>

<a href="#_Toc9793%20">2. 特性介紹 3</a>

<a href="#_Toc30383%20">3. 部署 5</a>

<a href="#_Toc3282%20">3.1. 機器清單 5</a>

<a href="#_Toc9618%20">3.2. 主機名 5</a>

<a href="#_Toc13708%20">3.2.1. 臨時修改主機名 6</a>

<a href="#_Toc29661%20">3.2.2. 永久修改主機名 6</a>

<a href="#_Toc14169%20">3.3. 免密碼登入範圍 7</a>

<a href="#_Toc22025%20">4. 約定 7</a>

<a href="#_Toc20795%20">4.1. 安裝目錄約定 7</a>

<a href="#_Toc25043%20">4.2. 服務端口約定 8</a>

<a href="#_Toc20916%20">4.3. 各子產品RPC和HTTP端口 9</a>

<a href="#_Toc25729%20">5. 工作詳單 9</a>

<a href="#_Toc28286%20">6. JDK安裝 9</a>

<a href="#_Toc3147%20">6.1. 下載下傳安裝包 9</a>

<a href="#_Toc14025%20">6.2. 安裝步驟 10</a>

<a href="#_Toc17939%20">7. 免密碼ssh2登入 10</a>

<a href="#_Toc23704%20">8. Hadoop安裝和配置 11</a>

<a href="#_Toc14800%20">8.1. 下載下傳安裝包 11</a>

<a href="#_Toc13823%20">8.2. 安裝和環境變量配置 12</a>

<a href="#_Toc25432%20">8.3. 修改hadoop-env.sh 12</a>

<a href="#_Toc7499%20">8.4. 修改/etc/hosts 13</a>

<a href="#_Toc29291%20">8.5. 修改slaves 14</a>

<a href="#_Toc20307%20">8.6. 準備好各配置檔案 14</a>

<a href="#_Toc13359%20">8.7. 修改hdfs-site.xml 14</a>

<a href="#_Toc8592%20">8.8. 修改core-site.xml 16</a>

<a href="#_Toc6527%20">8.8.1. dfs.namenode.rpc-address 17</a>

<a href="#_Toc30121%20">8.9. 修改mapred-site.xml 17</a>

<a href="#_Toc18618%20">8.10. 修改yarn-site.xml 17</a>

<a href="#_Toc16012%20">9. 啟動順序 19</a>

<a href="#_Toc24306%20">10. 啟動HDFS 19</a>

<a href="#_Toc19295%20">10.1. 建立好目錄 19</a>

<a href="#_Toc25514%20">10.2. 啟動好zookeeper 20</a>

<a href="#_Toc28352%20">10.3. 建立命名空間 20</a>

<a href="#_Toc19341%20">10.4. 啟動所有JournalNode 20</a>

<a href="#_Toc3368%20">10.5. 初始化JournalNode 20</a>

<a href="#_Toc2493%20">10.6. 格式化NameNode 20</a>

<a href="#_Toc13184%20">10.7. 啟動主NameNode 21</a>

<a href="#_Toc27814%20">10.8. 啟動備NameNode 21</a>

<a href="#_Toc7960%20">10.9. 啟動主備切換程序 22</a>

<a href="#_Toc10884%20">10.10. 啟動所有DataNode 22</a>

<a href="#_Toc10918%20">10.11. 檢查啟動是否成功 22</a>

<a href="#_Toc25340%20">10.11.1. DataNode 22</a>

<a href="#_Toc28667%20">10.11.2. NameNode 22</a>

<a href="#_Toc18026%20">10.12. 執行HDFS指令 23</a>

<a href="#_Toc11399%20">10.12.1. 檢視DataNode是否正常啟動 23</a>

<a href="#_Toc22754%20">10.12.2. 檢視NameNode的主備狀态 23</a>

<a href="#_Toc9963%20">10.12.3. hdfs dfs ls 23</a>

<a href="#_Toc13810%20">10.12.4. hdfs dfs -put 24</a>

<a href="#_Toc1574%20">10.12.5. hdfs dfs -rm 24</a>

<a href="#_Toc9120%20">10.12.6. 新NameNode如何加入? 24</a>

<a href="#_Toc20258%20">10.12.7. HDFS隻允許有一主一備兩個NameNode 24</a>

<a href="#_Toc30272%20">10.12.8. 存儲均衡start-balancer.sh 25</a>

<a href="#_Toc9128%20">10.12.9. 新增JournalNode 26</a>

<a href="#_Toc5142%20">11. 啟動YARN 27</a>

<a href="#_Toc30220%20">11.1. 啟動YARN 27</a>

<a href="#_Toc7899%20">11.2. 執行YARN指令 27</a>

<a href="#_Toc16136%20">11.2.1. yarn node -list 27</a>

<a href="#_Toc15010%20">11.2.2. yarn node -status 28</a>

<a href="#_Toc28576%20">11.2.3. yarn rmadmin -getServiceState rm1 28</a>

<a href="#_Toc25777%20">11.2.4. yarn rmadmin -transitionToStandby rm1 28</a>

<a href="#_Toc26380%20">12. 運作MapReduce程式 28</a>

<a href="#_Toc8772%20">13. HDFS權限配置 30</a>

<a href="#_Toc13553%20">13.1. hdfs-site.xml 30</a>

<a href="#_Toc20060%20">13.2. core-site.xml 30</a>

<a href="#_Toc29304%20">14. C++用戶端程式設計 30</a>

<a href="#_Toc18176%20">14.1. 示例代碼 30</a>

<a href="#_Toc4352%20">14.2. 運作示例 31</a>

<a href="#_Toc32163%20">15. 常見錯誤 32</a>

<a href="#_Toc13185%20">15.1. 執行“hdfs dfs -ls”時報ConnectException 32</a>

<a href="#_Toc19332%20">15.2. Initialization failed for Block pool 33</a>

<a href="#_Toc4053%20">15.3. Incompatible clusterIDs 33</a>

<a href="#_Toc12868%20">15.4. Inconsistent checkpoint fields 35</a>

<a href="#_Toc32644%20">15.5. fs.defaultFS is file:/// 36</a>

<a href="#_Toc12811%20">15.6. a shared edits dir must not be specified if HA is not enabled 36</a>

<a href="#_Toc25550%20">15.7. /tmp/dfs/name is in an inconsistent state: storage directory does not exist or is not accessible. 36</a>

<a href="#_Toc27121%20">15.8. The auxService:mapreduce_shuffle does not exist 36</a>

<a href="#_Toc24312%20">15.9. org.apache.hadoop.ipc.Client: Retrying connect to server 36</a>

<a href="#_Toc7297%20">15.10. mapreduce.Job: Running job: job_1445931397013_0001 36</a>

<a href="#_Toc13622%20">15.11. Could not format one or more JournalNodes 36</a>

<a href="#_Toc16792%20">15.12. org.apache.hadoop.yarn.server.resourcemanager.ResourceManager: Already in standby state 37</a>

<a href="#_Toc31138%20">15.13. No valid image files found 37</a>

<a href="#_Toc22504%20">15.14. xceivercount 4097 exceeds the limit of concurrent xcievers 4096 38</a>

<a href="#_Toc4121%20">15.15. java.lang.IllegalArgumentException: Unable to construct journal, qjournal://hadoop-030:8485;hadoop-031:8454;hadoop-032 38</a>

<a href="#_Toc31719%20">15.16. Bad URI 'qjournal://hadoop-030:8485;hadoop-031:8454;hadoop-032:8454': must identify journal in path component 38</a>

<a href="#_Toc4871%20">15.17. 16/04/06 14:48:19 INFO ipc.Client: Retrying connect to server: hadoop-032/10.143.136.211:8454. Already tried 0 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleepTime=1000 MILLISECONDS) 38</a>

<a href="#_Toc14074%20">15.18. Exception in thread "main" org.apache.hadoop.HadoopIllegalArgumentException: Could not get the namenode ID of this node. You may run zkfc on the node other than namenode. 38</a>

<a href="#_Toc25687%20">15.19. 2016-04-06 17:08:07,690 INFO org.apache.hadoop.hdfs.server.common.Storage: Storage directory [DISK]file:/data3/datanode/data/ has already been used. 39</a>

<a href="#_Toc20752%20">15.20. 2016-04-06 18:00:26,939 WARN org.apache.hadoop.hdfs.server.datanode.DataNode: Problem connecting to server: hadoop-031/10.143.136.208:8020 39</a>

<a href="#_Toc11047%20">15.21. ERROR cluster.YarnClientSchedulerBackend: Yarn application has already exited with state FINISHED! 40</a>

<a href="#_Toc16%20">16. 相關文檔 40</a>

目前版本的Hadoop已解決了hdfs、yarn和hbase等單點,并支援自動的主備切換。

本文的目的是為目前最新版本的Hadoop 2.7.2提供最為詳細的安裝說明,以幫助減少安裝過程中遇到的困難,并對一些錯誤原因進行說明,hdfs配置使用基于QJM(Quorum Journal Manager)的HA。本文的安裝隻涉及了hadoop-common、hadoop-hdfs、hadoop-mapreduce和hadoop-yarn,并不包含HBase、Hive和Pig等。

版本

發版本日期

新特性

2.7.2

2016/1/25

2.7.1

2015/7/6

2.7.0

2015/4/21

1) 不再支援JDK6,須JDK 7+

2) 支援檔案截取(truncate)

3) 支援為每種存儲類型設定配額

4) 支援檔案變長塊(之前一直為固定塊大小,預設為64M)

5) 支援Windows Azure Storage

6) YARN認證可插拔

7) 自動共享,全局緩存YARN本地化資源(測試階段)

8) 限制一個作業運作的Map/Reduce任務

9) 加快大量輸出檔案時大型作業的FileOutputCommitter速度

2.6.4

2016/2/11

2.6.3

2015/12/17

2.6.2

2015/10/28

2.6.1

2015/9/23

2.6.0

2014/11/18

1) YARN支援長時間運作的服務

2) YARN支援更新復原

3) YARN支援應用運作在Docker容器中

2.5.2

2014/11/19

2.5.1

2014/9/12

2.5.0

2014/8/11

2.4.1

2014/6/30

2.4.0

2014/4/7

1) HDFS更新復原

2) HDFS支援完整的https

3) YARN ResourceManager支援自動故障切換

2.2.0

2013/10/15

1) HDFS Federation

2) HDFS Snapshots

2.1.0-beta

2013/8/25

1) HDFS快照

2) 支援Windows

2.0.3-alpha

2013/2/14

1) 基于QJM的NameNode HA

2.0.0-alpha

2012/5/23

1) 人工切換的NameNode HA

2) HDFS Federation

1.0.0

2011/12/27

0.23.11

2014/6/27

0.23.10

2013/12/11

0.22.0

2011/12/10

0.23.0

2011/11/17

0.20.205.0

2011/10/17

0.20.204.0

2011/9/5

0.20.203.0

2011/5/11

0.21.0

2010/8/23

0.20.2

2010/2/26

0.20.1

2009/9/14

0.19.2

2009/7/23

0.20.0

2009/4/22

0.19.1

2009/2/24

0.18.3

2009/1/29

0.19.0

2008/11/21

0.18.2

2008/11/3

0.18.1

2008/9/17

0.18.0

2008/8/22

0.17.2

2008/8/19

0.17.1

2008/6/23

0.17.0

2008/5/20

0.16.4 

2008/5/5

0.16.3

2008/4/16

0.16.2

2008/4/2

0.16.1

2008/3/13

0.16.0

2008/2/7

0.15.3

2008/1/18

0.15.2

2008/1/2

0.15.1

2007/11/27

0.14.4

2007/11/26

0.15.0

2007/10/29

0.14.3

2007/10/19

0.14.1

2007/9/4

共5台機器(zookeeper部署在這5台機器上),部署如下表所示:

NameNode

JournalNode

DataNode

ZooKeeper

10.148.137.143

10.148.137.204

10.148.138.11

10.148.140.14

10.148.140.15

機器IP

對應的主機名

hadoop-137-143

hadoop-137-204

hadoop-138-11

hadoop-140-14

hadoop-140-15

注意主機名不能有下劃線,否則啟動時,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.7.2/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檔案。

不但所在檔案不同,修改的方法可能也不一樣,比如有些是名字對形式,如/etc/sysconfig/network格式為:HOSTNAME=主機名。

修改之後,需要重新開機網卡,以使修改生效,執行指令:/etc/rc.d/boot.localnet start(不同系統指令會有差異,這是SuSE上的方法),再次使用hostname檢視,會發現主機名變了。

直接重新開機系統,也可以使修改生效。

注意修改主機名後,需要重新驗證ssh免密碼登入,方法為:ssh 使用者名@新的主機名。

可以通過以下多處檢視機器名:

1) hostname指令(也可以用來修改主機名,但當次僅當次會話有效)

2) cat /proc/sys/kernel/hostname

3) cat /etc/hostname或cat /etc/sysconfig/network(永久性的修改,需要重新開機)

4) sysctl kernel.hostname(也可以用來修改主機名,但僅重新開機之前有效)

要求能通過免登入包括使用IP和主機名都能免密碼登入:

1) NameNode能免密碼登入所有的DataNode

2) 各NameNode能免密碼登入自己

3) 各NameNode間能免密碼互登入

4) DataNode能免密碼登入自己

5) DataNode不需要配置免密碼登入NameNode和其它DataNode。

注:免密碼登入不是必須的,如果不使用hadoop-daemons.sh等需要ssh、scp的腳本。

為便于講解,本文約定Hadoop、JDK安裝目錄如下:

安裝目錄

說明

JDK

/data/jdk

1.7.0

ln -s /data/jdk1.7.0_55 /data/jdk

Hadoop

/data/hadoop/hadoop

ln -s /data/hadoop/hadoop-2.7.2 /data/hadoop/hadoop

在實際安裝部署時,可以根據實際進行修改。

端口

作用

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,用來監聽用戶端的連接配接

16010

hbase.master.info.port,HMaster的http端口

16000

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

子產品

RPC端口

HTTP端口

HTTPS端口

HDFS JournalNode

8485

HDFS NameNode

8020

HDFS DataNode

HDFS SecondaryNameNode

Yarn Resource Manager

Yarn Node Manager

Yarn SharedCache

8788

HMaster

HRegionServer

16030

HBase thrift

9090

9095

HBase rest

8085

注:DataNode通過端口50010傳輸資料。

為運作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版本。

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.7.2不比對,編譯Hadoop 2.7.2源碼時會報很多錯誤。

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) (如果不以root使用者運作hadoop,則跳過這一步)将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" &gt;&gt; identification,請注意IdKey後面有一個空格,確定identification檔案内容如下:

# cat identification

IdKey id_dsa_2048_a

第三步,在所有被登入機上,執行以下步驟:

2) 生成authorization檔案:echo "Key id_dsa_2048_a.pub" &gt;&gt; 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.7.2.tar.gz上傳到/data/hadoop目錄下

2) 進入/data/hadoop目錄

3) 在/data/hadoop目錄下,解壓安裝包hadoop-2.7.2.tar.gz:tar xzf hadoop-2.7.2.tar.gz

4) 建立軟體連結:ln -s /data/hadoop/hadoop-2.7.2 /data/hadoop/hadoop

5) 修改使用者主目錄下的檔案.profile(當然也可以是/etc/profile或其它同等效果的檔案),設定Hadoop環境變量:

export HADOOP_HOME=/data/hadoop/hadoop

export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop

export PATH=$HADOOP_HOME/bin:$PATH

需要重新登入以生效,或者在終端上執行:export HADOOP_HOME=/data/hadoop/hadoop也可以即時生效。

修改所有節點上的$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.

除JAVA_HOME之外,再添加:

export HADOOP_CONF_DIR=${HADOOP_HOME}/etc/hadoop

同時,建議将下列添加到/etc/profile或~/.profile中:

為省去不必要的麻煩,建議在所有節點的/etc/hosts檔案,都做如下所配置:

10.148.137.143 hadoop-137-143 # NameNode

10.148.137.204 hadoop-137-204 # NameNode

10.148.138.11  hadoop-138-11  # DataNode

10.148.140.14  hadoop-140-14  # DataNode

10.148.140.15  hadoop-140-15  # 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.

slaves即為HDFS的DataNode節點。當使用腳本start-dfs.sh來啟動hdfs時,會使用到這個檔案,以無密碼登入方式到各slaves上啟動DataNode。

修改主NameNode和備NameNode上的$HADOOP_HOME/etc/hadoop/slaves檔案,将slaves的節點IP(也可以是相應的主機名)一個個加進去,一行一個IP,如下所示:

&gt; cat slaves 

配置檔案放在$HADOOP_HOME/etc/hadoop目錄下,對于Hadoop 2.3.0、Hadoop 2.7.2和Hadoop 2.7.2版本,該目錄下的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.7.2版本):

# 進入$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進行适當的修改,否則仍然無法啟動成功。

QJM的配置參照的官方文檔:

對hdfs-site.xml檔案的修改,涉及下表中的屬性:

屬性名

屬性值

dfs.nameservices

mycluster

dfs.ha.namenodes.mycluster

nn1,nn2

同一nameservice下,隻能配置一或兩個,也就是不能有nn3了

dfs.namenode.rpc-address.mycluster.nn1

hadoop-137-143:8020

dfs.namenode.rpc-address.mycluster.nn2

hadoop-137-204:8020

dfs.namenode.http-address.mycluster.nn1

hadoop-137-143:50070

dfs.namenode.http-address.mycluster.nn2

hadoop-137-204:50070

dfs.namenode.shared.edits.dir

qjournal://hadoop-137-143:8485;hadoop-137-204:8485;hadoop-138-11:8485/mycluster

至少三台Quorum Journal節點配置

dfs.client.failover.proxy.provider.mycluster

org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider

用戶端通過它來找主NameNode

dfs.ha.fencing.methods

sshfence

如果配置為sshfence,當主NameNode異常時,使用ssh登入到主NameNode,然後使用fuser将主NameNode殺死,是以需要確定所有NameNode上可以使用fuser。

用來保證同一時刻隻有一個主NameNode,以防止腦裂。可帶使用者名和端口參數,格式示例:sshfence([[username][:port]]);值還可以為shell腳本,格式示例:

shell(/path/to/my/script.sh arg1 arg2 ...),如:

shell(/bin/true)

如果sshd不是預設的22端口時,就需要指定。

dfs.ha.fencing.ssh.private-key-files

/data/hadoop/.ssh2/id_dsa_2048_a

指定私鑰,如果是OpenSSL,則值為/data/hadoop/.ssh/id_rsa

dfs.ha.fencing.ssh.connect-timeout

30000

可選的配置

dfs.journalnode.edits.dir

/data/hadoop/hadoop/journal

JournalNode存儲其本地狀态的位置,在JouralNode機器上的絕對路徑,JNs的edits和其他本地狀态将被存儲在此處

dfs.datanode.data.dir

/data/hadoop/hadoop/data

dfs.namenode.name.dir

NameNode中繼資料存放目錄,預設值為file://${hadoop.tmp.dir}/dfs/name,也就是在臨時目錄下,可以考慮放到資料目錄下

dfs.namenode.checkpoint.dir

預設值為file://${hadoop.tmp.dir}/dfs/namesecondary,但如果沒有啟用SecondaryNameNode,則不需要

dfs.ha.automatic-failover.enabled

true

自動主備切換

dfs.datanode.max.xcievers

4096

可選修改,類似于linux的最大可打開的檔案個數,預設為256,建議設定成大一點。同時,需要保證系統可打開的檔案個數足夠(可通過ulimit指令檢視)。該錯誤會導緻hbase報“notservingregionexception”。

0.0.0.0:8485

配置JournalNode的RPC端口号,預設為0.0.0.0:8485,可以不用修改

詳細配置可參考:

對core-site.xml檔案的修改,涉及下表中的屬性:

fs.defaultFS

hdfs://mycluster

fs.default.name

按理應當不用填寫這個參數,因為fs.defaultFS已取代它,但啟動時報錯:

fs.defaultFS is file:///

hadoop.tmp.dir

/data/hadoop/hadoop/tmp

ha.zookeeper.quorum

hadoop-137-143:2181,hadoop-138-11:2181,hadoop-140-14:2181

ha.zookeeper.parent-znode

/mycluster/hadoop-ha

io.seqfile.local.dir

預設值為${hadoop.tmp.dir}/io/local

fs.s3.buffer.dir

預設值為${hadoop.tmp.dir}/s3

fs.s3a.buffer.dir

預設值為${hadoop.tmp.dir}/s3a

注意啟動之前,需要将配置的目錄建立好,如建立好/data/hadoop/current/tmp目錄。詳細可參考:

如果沒有配置,則啟動時報如下錯誤:

Incorrect configuration: namenode address dfs.namenode.servicerpc-address or dfs.namenode.rpc-address is not configured.

這裡需要指定IP和端口,如果隻指定了IP,如10.148.137.143,則啟動時輸出如下:

Starting namenodes on []

改成“hadoop-137-143:8020”後,則啟動時輸出為:

Starting namenodes on [10.148.137.143]

涉及範圍

mapreduce.framework.name

yarn

所有mapreduce節點

對yarn-site.xml檔案的修改,涉及下表中的屬性:

yarn.resourcemanager.hostname

0.0.0.0

ResourceManager

NodeManager

HA模式可不配置,但由于其它配置項可能有引用它,建議保持值為0.0.0.0,如果沒有被引用到,則可不配置。

yarn.nodemanager.hostname

yarn.nodemanager.aux-services

mapreduce_shuffle

以下為HA相關的配置,包括自動切換(可僅可在ResourceManager節點上配置)

yarn.resourcemanager.ha.enabled

啟用HA

yarn.resourcemanager.cluster-id

yarn-cluster

可不同于HDFS的

yarn.resourcemanager.ha.rm-ids

rm1,rm2

注意NodeManager要和ResourceManager一樣配置

yarn.resourcemanager.hostname.rm1

yarn.resourcemanager.hostname.rm2

yarn.resourcemanager.webapp.address.rm1

hadoop-137-143:8088

yarn.resourcemanager.webapp.address.rm2

hadoop-137-204:8088

yarn.resourcemanager.zk-address

hadoop-137-143:2181,hadoop-137-204:2181,hadoop-138-11:2181

yarn.resourcemanager.ha.automatic-failover.enable

可不配置,因為當yarn.resourcemanager.ha.enabled為true時,它的預設值即為true

以下為NodeManager配置

yarn.nodemanager.vmem-pmem-ratio

每使用1MB實體記憶體,最多可用的虛拟記憶體數,預設值為2.1,在運作spark-sql時如果遇到“Yarn application has already exited with state FINISHED”,則應當檢查NodeManager的日志,以檢視是否該配置偏小原因

yarn.nodemanager.resource.cpu-vcores

NodeManager總的可用虛拟CPU個數,預設值為8

yarn.nodemanager.resource.memory-mb

該節點上YARN可使用的實體記憶體總量,預設是8192(MB)

yarn.nodemanager.pmem-check-enabled

是否啟動一個線程檢查每個任務正使用的實體記憶體量,如果任務超出配置設定值,則直接将其殺掉,預設是true

yarn.nodemanager.vmem-check-enabled

是否啟動一個線程檢查每個任務正使用的虛拟記憶體量,如果任務超出配置設定值,則直接将其殺掉,預設是true

以下為ResourceManager配置

yarn.scheduler.minimum-allocation-mb

單個容器可申請的最小記憶體

yarn.scheduler.maximum-allocation-mb

單個容器可申請的最大記憶體

yarn.nodemanager.hostname如果配置成具體的IP,如10.12.154.79,則會導緻每個NodeManager的配置不同。詳細配置可參考:

Yarn HA的配置可以參考:

Zookeeper -&gt; JournalNode -&gt; 格式化NameNode -&gt; 初始化JournalNode

-&gt; 建立命名空間(zkfc) -&gt; NameNode -&gt; DataNode -&gt; ResourceManager -&gt; NodeManager。

但請注意首次啟動NameNode之前,得先做format,也請注意備NameNode的啟動方法。

在啟動HDFS之前,需要先完成對NameNode的格式化。

mkdir -p /data/hadoop/hadoop-2.7.2/tmp/dfs/name

./zkServer.sh start

注意在啟動其它之前先啟動zookeeper。

在其中一個namenode上執行:

./hdfs zkfc -formatZK

注意,這一步要在初始化命名空間之後執行。

NameNode将中繼資料記錄檔記錄在JournalNode上,主備NameNode通過記錄在JouralNode上的日志完成中繼資料同步。

在所有JournalNode上執行(注意是兩個參數,在“hdfs namenode -format”之後做這一步):

./hadoop-daemon.sh start journalnode

注意,在執行“hdfs namenode -format”之前,必須先啟動好JournalNode,而format又必須在啟動namenode之前。

如果是非HA轉HA才需要這一步,在其中一個JournalNode上執行:

./hdfs namenode -initializeSharedEdits

此指令預設是互動式的,加上參數-force轉成非互動式。

在所有JournalNode建立如下目錄:

mkdir -p /data/hadoop/hadoop/journal/mycluster/current

注意隻有新的,才需要做這一步,而且隻需要在主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) 啟動主NameNode:

./hadoop-daemon.sh start namenode

啟動時,遇到如下所示的錯誤,則表示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) ./hdfs namenode -bootstrapStandby

2) ./hadoop-daemon.sh start namenode

如果沒有執行第1步,直接啟動會遇到如下錯誤:

No valid image files found

或者在該NameNode日志會發現如下錯誤:

2016-04-08 14:08:39,745 WARN org.apache.hadoop.hdfs.server.namenode.FSNamesystem: Encountered exception loading fsimage

java.io.IOException: NameNode is not formatted.

在所有NameNode上啟動主備切換程序:

./hadoop-daemon.sh start zkfc

隻有啟動了DFSZKFailoverController程序,HDFS才能自動切換主備。

注:zkfc是zookeeper failover controller的縮寫。

在各個DataNode上分别執行:

./hadoop-daemon.sh start datanode

如果有發現DataNode程序并沒有起來,可以試試删除logs目錄下的DataNode日志,再得啟看看。

1) 使用JDK提供的jps指令,檢視相應的程序是否已啟動

2) 檢查$HADOOP_HOME/logs目錄下的log和out檔案,看看是否有異常資訊。

啟動後nn1和nn2都處于備機狀态,将nn1切換為主機:

./hdfs haadmin -transitionToActive nn1

執行jps指令(注:jps是jdk中的一個指令,不是jre中的指令),可看到DataNode程序:

$ jps

18669 DataNode

24542 Jps

執行jps指令,可看到NameNode程序:

18669 NameNode

執行HDFS指令,以進一步檢驗是否已經安裝成功和配置好。關于HDFS指令的用法,直接運作指令hdfs或hdfs dfs,即可看到相關的用法說明。

hdfs dfsadmin -report

注意如果core-site.xml中的配置項fs.default.name的值為file:///,則會報:

report: FileSystem file:/// is not an HDFS file system

Usage: hdfs dfsadmin [-report] [-live] [-dead] [-decommissioning]

解決這個問題,隻需要将fs.default.name的值設定為和fs.defaultFS相同的值。

如檢視NameNode1和NameNode2分别是主還是備:

$ hdfs haadmin -getServiceState nm1

standby

$ hdfs haadmin -getServiceState nm2

active

“hdfs dfs -ls”帶一個參數,如果參數以“hdfs://URI”打頭表示通路HDFS,否則相當于ls。其中URI為NameNode的IP或主機名,可以包含端口号,即hdfs-site.xml中“dfs.namenode.rpc-address”指定的值。

“hdfs dfs -ls”要求預設端口為8020,如果配置成9000,則需要指定端口号,否則不用指定端口,這一點類似于浏覽器通路一個URL。示例:

&gt; 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未對它進額外處理。

上傳檔案指令,示例:

&gt; hdfs dfs -put /etc/SuSE-release hdfs://172.25.40.171:9001/

删除檔案指令,示例:

&gt; hdfs dfs -rm hdfs://172.25.40.171:9001/SuSE-release

Deleted hdfs://172.25.40.171:9001/SuSE-release

當有NameNode機器損壞時,必然存在新NameNode來替代。把配置修改成指向新NameNode,然後以備機形式啟動新NameNode,這樣新的NameNode即加入到Cluster中:

如果試圖配置三個NameNode,如:

  dfs.ha.namenodes.test

  nm1,nm2,nm3

    The prefix for a given nameservice, contains a comma-separated

    list of namenodes for a given nameservice (eg EXAMPLENAMESERVICE).

則運作“hdfs namenode -bootstrapStandby”時會報如下錯誤,表示在同一NameSpace内不能超過2個NameNode:

16/04/11 09:51:57 ERROR namenode.NameNode: Failed to start namenode.

java.io.IOException: java.lang.IllegalArgumentException: Expected exactly 2 NameNodes in namespace 'test'. Instead, got only 3 (NN ids were 'nm1','nm2','nm3'

        at org.apache.hadoop.hdfs.server.namenode.ha.BootstrapStandby.run(BootstrapStandby.java:425)

        at org.apache.hadoop.hdfs.server.namenode.NameNode.createNameNode(NameNode.java:1454)

        at org.apache.hadoop.hdfs.server.namenode.NameNode.main(NameNode.java:1554)

Caused by: java.lang.IllegalArgumentException: Expected exactly 2 NameNodes in namespace 'test'. Instead, got only 3 (NN ids were 'nm1','nm2','nm3'

        at com.google.common.base.Preconditions.checkArgument(Preconditions.java:115)

示例:start-balancer.sh –t 10%

10%表示機器與機器之間磁盤使用率偏差小于10%時認為均衡,否則做均衡搬動。“start-balancer.sh”調用“hdfs start balancer”來做均衡,可以調用stop-balancer.sh停止均衡。

均衡過程非常慢,但是均衡過程中,仍能夠正常通路HDFS,包括往HDFS上傳檔案。

[VM2016@hadoop-030 /data4/hadoop/sbin]$ hdfs balancer # 可以改為調用start-balancer.sh

16/04/08 14:26:55 INFO balancer.Balancer: namenodes  = [hdfs://test] // test為HDFS的cluster名

16/04/08 14:26:55 INFO balancer.Balancer: parameters = Balancer.Parameters[BalancingPolicy.Node, threshold=10.0, max idle iteration = 5, number of nodes to be excluded = 0, number of nodes to be included = 0]

Time Stamp               Iteration#  Bytes Already Moved  Bytes Left To Move  Bytes Being Moved

16/04/08 14:26:56 INFO net.NetworkTopology: Adding a new node: /default-rack/192.168.1.231:50010

16/04/08 14:26:56 INFO net.NetworkTopology: Adding a new node: /default-rack/192.168.1.229:50010

16/04/08 14:26:56 INFO net.NetworkTopology: Adding a new node: /default-rack/192.168.1.213:50010

16/04/08 14:26:56 INFO net.NetworkTopology: Adding a new node: /default-rack/192.168.1.208:50010

16/04/08 14:26:56 INFO net.NetworkTopology: Adding a new node: /default-rack/192.168.1.232:50010

16/04/08 14:26:56 INFO net.NetworkTopology: Adding a new node: /default-rack/192.168.1.207:50010

16/04/08 14:26:56 INFO balancer.Balancer: 5 over-utilized: [192.168.1.231:50010:DISK, 192.168.1.229:50010:DISK, 192.168.1.213:50010:DISK, 192.168.1.208:50010:DISK, 192.168.1.232:50010:DISK]

16/04/08 14:26:56 INFO balancer.Balancer: 1 underutilized(未充分利用的): [192.168.1.207:50010:DISK] # 資料将移向該節點

16/04/08 14:26:56 INFO balancer.Balancer: Need to move 816.01 GB to make the cluster balanced. # 需要移動816.01G資料達到平衡

16/04/08 14:26:56 INFO balancer.Balancer: Decided to move 10 GB bytes from 192.168.1.231:50010:DISK to 192.168.1.207:50010:DISK # 從192.168.1.231移動10G資料到192.168.1.207

16/04/08 14:26:56 INFO balancer.Balancer: Will move 10 GB in this iteration

16/04/08 14:32:58 INFO balancer.Dispatcher: Successfully moved blk_1073749366_8542 with size=77829046 from 192.168.1.231:50010:DISK to 192.168.1.207:50010:DISK through 192.168.1.213:50010

16/04/08 14:32:59 INFO balancer.Dispatcher: Successfully moved blk_1073749386_8562 with size=77829046 from 192.168.1.231:50010:DISK to 192.168.1.207:50010:DISK through 192.168.1.231:50010

16/04/08 14:33:34 INFO balancer.Dispatcher: Successfully moved blk_1073749378_8554 with size=77829046 from 192.168.1.231:50010:DISK to 192.168.1.207:50010:DISK through 192.168.1.231:50010

16/04/08 14:34:38 INFO balancer.Dispatcher: Successfully moved blk_1073749371_8547 with size=134217728 from 192.168.1.231:50010:DISK to 192.168.1.207:50010:DISK through 192.168.1.213:50010

16/04/08 14:34:54 INFO balancer.Dispatcher: Successfully moved blk_1073749395_8571 with size=134217728 from 192.168.1.231:50010:DISK to 192.168.1.207:50010:DISK through 192.168.1.231:50010

Apr 8, 2016 2:35:01 PM            0            478.67 MB           816.01 GB              10 GB

16/04/08 14:35:10 INFO net.NetworkTopology: Adding a new node: /default-rack/192.168.1.213:50010

16/04/08 14:35:10 INFO net.NetworkTopology: Adding a new node: /default-rack/192.168.1.229:50010

16/04/08 14:35:10 INFO net.NetworkTopology: Adding a new node: /default-rack/192.168.1.232:50010

16/04/08 14:35:10 INFO net.NetworkTopology: Adding a new node: /default-rack/192.168.1.231:50010

16/04/08 14:35:10 INFO net.NetworkTopology: Adding a new node: /default-rack/192.168.1.208:50010

16/04/08 14:35:10 INFO net.NetworkTopology: Adding a new node: /default-rack/192.168.1.207:50010

16/04/08 14:35:10 INFO balancer.Balancer: 5 over-utilized: [192.168.1.213:50010:DISK, 192.168.1.229:50010:DISK, 192.168.1.232:50010:DISK, 192.168.1.231:50010:DISK, 192.168.1.208:50010:DISK]

16/04/08 14:35:10 INFO balancer.Balancer: 1 underutilized(未充分利用的): [192.168.1.207:50010:DISK]

16/04/08 14:35:10 INFO balancer.Balancer: Need to move 815.45 GB to make the cluster balanced.

16/04/08 14:35:10 INFO balancer.Balancer: Decided to move 10 GB bytes from 192.168.1.213:50010:DISK to 192.168.1.207:50010:DISK

16/04/08 14:35:10 INFO balancer.Balancer: Will move 10 GB in this iteration

16/04/08 14:41:18 INFO balancer.Dispatcher: Successfully moved blk_1073760371_19547 with size=77829046 from 192.168.1.213:50010:DISK to 192.168.1.207:50010:DISK through 192.168.1.213:50010

16/04/08 14:41:19 INFO balancer.Dispatcher: Successfully moved blk_1073760385_19561 with size=77829046 from 192.168.1.213:50010:DISK to 192.168.1.207:50010:DISK through 192.168.1.213:50010

16/04/08 14:41:22 INFO balancer.Dispatcher: Successfully moved blk_1073760393_19569 with size=77829046 from 192.168.1.213:50010:DISK to 192.168.1.207:50010:DISK through 192.168.1.213:50010

16/04/08 14:41:23 INFO balancer.Dispatcher: Successfully moved blk_1073760363_19539 with size=77829046 from 192.168.1.213:50010:DISK to 192.168.1.207:50010:DISK through 192.168.1.213:50010

找一台已有JournalNode節點,修改它的hdfs-site.xml,将新增的Journal包含進來,如在

qjournal://hadoop-030:8485;hadoop-031:8485;hadoop-032:8485/test

的基礎上新增hadoop-033和hadoop-034兩個JournalNode:

qjournal://hadoop-030:8485;hadoop-031:8485;hadoop-032:8485;hadoop-033:8485;hadoop-034:8485/test

然後将安裝目錄和資料目錄(hdfs-site.xml中的dfs.journalnode.edits.dir指定的目錄)都複制到新的節點。

如果不複制JournalNode的資料目錄,則新節點上的JournalNode會報錯“Journal Storage Directory /data/journal/test not formatted”,将來的版本可能會實作自動同步。

接下來,就可以在新節點上啟動好JournalNode(不需要做什麼初始化),并重新開機下NameNode。注意觀察JournalNode日志,檢視是否啟動成功,當日志顯示為以下這樣的INFO級别日志則表示啟動成功:

2016-04-26 10:31:11,160 INFO org.apache.hadoop.hdfs.server.namenode.FileJournalManager: Finalizing edits file /data/journal/test/current/edits_inprogress_0000000000000194269 -&gt; /data/journal/test/current/edits_0000000000000194269-0000000000000194270

2) 在主備兩台都執行:start-yarn.sh,即開始啟動YARN

若啟動成功,則在Master節點執行jps,可以看到ResourceManager:

&gt; jps

24689 NameNode

30156 Jps

28861 ResourceManager

在Slaves節點執行jps,可以看到NodeManager:

14019 NodeManager

23257 DataNode

15115 Jps

如果隻需要單獨啟動指定節點上的ResourceManager,這樣:

./yarn-daemon.sh start resourcemanager

對于NodeManager,則是這樣:

./yarn-daemon.sh start nodemanager

列舉YARN叢集中的所有NodeManager,如(注意參數間的空格,直接執行yarn可以看到使用幫助):

&gt; 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的狀态,如:

&gt; 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

檢視rm1的主備狀态,即檢視它是主(active)還是備(standby)。

将rm1從主切為備。

更多的yarn指令可以參考:

在安裝目錄的share/hadoop/mapreduce子目錄下,有現存的示例程式:

hadoop@VM-40-171-sles10-64:~/hadoop&gt; ls share/hadoop/mapreduce

hadoop-mapreduce-client-app-2.7.2.jar         hadoop-mapreduce-client-jobclient-2.7.2-tests.jar

hadoop-mapreduce-client-common-2.7.2.jar      hadoop-mapreduce-client-shuffle-2.7.2.jar

hadoop-mapreduce-client-core-2.7.2.jar        hadoop-mapreduce-examples-2.7.2.jar

hadoop-mapreduce-client-hs-2.7.2.jar          lib

hadoop-mapreduce-client-hs-plugins-2.7.2.jar  lib-examples

hadoop-mapreduce-client-jobclient-2.7.2.jar   sources

跑一個示例程式試試:

hdfs dfs -put /etc/hosts  hdfs://test/in/

hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount hdfs://test/in/ hdfs://test/out/

運作過程中,使用java的jps指令,可以看到yarn啟動了名為YarnChild的程序。

wordcount運作完成後,結果會儲存在out目錄下,儲存結果的檔案名類似于“part-r-00000”。另外,跑這個示例程式有兩個需求注意的點:

1) in目錄下要有文本檔案,或in即為被統計的文本檔案,可以為HDFS上的檔案或目錄,也可以為本地檔案或目錄

2) out目錄不能存在,程式會自動去建立它,如果已經存在則會報錯。

包hadoop-mapreduce-examples-2.7.2.jar中含有多個示例程式,不帶參數運作,即可看到用法:

&gt; hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount

Usage: wordcount  

&gt; hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.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.

修改日志級别為DEBBUG,并打屏:

export HADOOP_ROOT_LOGGER=DEBUG,console

dfs.permissions.enabled = true

dfs.permissions.superusergroup = supergroup

dfs.cluster.administrators = ACL-for-admins

dfs.namenode.acls.enabled = true

dfs.web.ugi = webuser,webgroup

fs.permissions.umask-mode = 022

hadoop.security.authentication = simple 安全驗證規則,可為simple或kerberos

// g++ -g -o x x.cpp -L$JAVA_HOME/lib/amd64/jli -ljli -L$JAVA_HOME/jre/lib/amd64/server -ljvm -I$HADOOP_HOME/include $HADOOP_HOME/lib/native/libhdfs.a -lpthread -ldl

#include "hdfs.h"

#include 

int main(int argc, char **argv)

{

#if 0

    hdfsFS fs = hdfsConnect("default", 0); // HA方式

    const char* writePath = "hdfs://mycluster/tmp/testfile.txt";

    hdfsFile writeFile = hdfsOpenFile(fs, writePath, O_WRONLY |O_CREAT, 0, 0, 0);

    if(!writeFile)

    {

          fprintf(stderr, "Failed to open %s for writing!\n", writePath);

          exit(-1);

    }

    const char* buffer = "Hello, World!\n";

    tSize num_written_bytes = hdfsWrite(fs, writeFile, (void*)buffer, strlen(buffer)+1);

    if (hdfsFlush(fs, writeFile))

           fprintf(stderr, "Failed to 'flush' %s\n", writePath);

    hdfsCloseFile(fs, writeFile);

#else

    struct hdfsBuilder* bld = hdfsNewBuilder();

    hdfsBuilderSetNameNode(bld, "default"); // HA方式

    hdfsFS fs = hdfsBuilderConnect(bld);

    if (NULL == fs)

          fprintf(stderr, "Failed to connect hdfs\n");

    int num_entries = 0;

    hdfsFileInfo* entries;

    if (argc 

        entries = hdfsListDirectory(fs, "/", &amp;num_entries);

    else

        entries = hdfsListDirectory(fs, argv[1], &amp;num_entries);

    fprintf(stdout, "num_entries: %d\n", num_entries);

    for (int i=0; i ; ++i)

        fprintf(stdout, "%s\n", entries[i].mName);

    } 

    hdfsFreeFileInfo(entries, num_entries);

    hdfsDisconnect(fs);

    //hdfsFreeBuilder(bld); 

#endif

    return 0;

}

運作之前需要設定好CLASSPATH,如果設定不當,可能會遇到不少困難,比如期望操作HDFS上的檔案和目錄,卻變成了本地的檔案和目錄,如者諸于“java.net.UnknownHostException”類的錯誤等。

為避免出現錯誤,強烈建議使用指令“hadoop classpath --glob”取得正确的CLASSPATH值。

另外還需要設定好libjli.so和libjvm.so兩個庫的LD_LIBRARY_PATH,如:

export LD_LIBRARY_PATH=$JAVA_HOME/lib/amd64/jli:$JAVA_HOME/jre/lib/amd64/server:$LD_LIBRARY_PATH

原因可能是指定的端口号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

可能是因為對NameNode做format之前,沒有清空DataNode的data目錄。

“Incompatible clusterIDs”的錯誤原因是在執行“hdfs namenode -format”之前,沒有清空DataNode節點的data目錄。

網上一些文章和文章說是tmp目錄,它本身也是沒問題的,但Hadoop 2.7.2是data目錄,實際上這個資訊已經由日志的“/data/hadoop/hadoop-2.7.2/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.7.2/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.7.2/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.

在core-site.xml中,當隻填寫了fs.defaultFS,而fs.default.name為預設的file:///時,會報此錯誤。解決方法是設定成相同的值。

該錯誤可能是因為hdfs-site.xml中沒有配置dfs.nameservices或dfs.ha.namenodes.mycluster。

隻需按日志中提示的,建立好相應的目錄。

問題原因是沒有配置yarn-site.xml中的“yarn.nodemanager.aux-services”,将它的值配置為mapreduce_shuffle,然後重新開機yarn問題即解決。記住所有yarn節點都需要修改,包括ResourceManager和NodeManager,如果NodeManager上的沒有修改,仍然會報這個錯誤。

該問題,有可能是因為NodeManager中的yarn-site.xml和ResourceManager上的不一緻,比如NodeManager沒有配置yarn.resourcemanager.ha.rm-ids。

Hadoop送出mapreduce任務時,卡在mapreduce.Job: Running job: job_1445931397013_0001處。

問題原因可能是因為yarn的NodeManager沒起來,可以用jdk的jps确認下。

該問題也有可能是因為NodeManager中的yarn-site.xml和ResourceManager上的不一緻,比如NodeManager沒有配置yarn.resourcemanager.ha.rm-ids。

執行“./hdfs namenode -format”時報“Could not format one or more JournalNodes”。

可能是hdfs-site.xml中的dfs.namenode.shared.edits.dir配置錯誤,比如重複了,如:

 qjournal://hadoop-168-254:8485;hadoop-168-254:8485;hadoop-168-253:8485;hadoop-168-252:8485;hadoop-168-251:8485/mycluster

修複後,重新開機JournalNode,問題可能就解決了。

遇到這個錯誤,可能是yarn-site.xml中的yarn.resourcemanager.webapp.address配置錯誤,比如配置成了兩個yarn.resourcemanager.webapp.address.rm1,實際應當是yarn.resourcemanager.webapp.address.rm1和yarn.resourcemanager.webapp.address.rm2。

如果是備NameNode,執行下“hdfs namenode -bootstrapStandby”再啟動。

2015-12-01 15:24:39,535 ERROR org.apache.hadoop.hdfs.server.namenode.NameNode: Failed to start namenode.

java.io.FileNotFoundException: No valid image files found

        at org.apache.hadoop.hdfs.server.namenode.FSImageTransactionalStorageInspector.getLatestImages(FSImageTransactionalStorageInspector.java:165)

        at org.apache.hadoop.hdfs.server.namenode.FSImage.loadFSImage(FSImage.java:623)

        at org.apache.hadoop.hdfs.server.namenode.FSImage.recoverTransitionRead(FSImage.java:294)

        at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.loadFSImage(FSNamesystem.java:975)

        at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.loadFromDisk(FSNamesystem.java:681)

        at org.apache.hadoop.hdfs.server.namenode.NameNode.loadNamesystem(NameNode.java:584)

        at org.apache.hadoop.hdfs.server.namenode.NameNode.initialize(NameNode.java:644)

        at org.apache.hadoop.hdfs.server.namenode.NameNode.(NameNode.java:811)

        at org.apache.hadoop.hdfs.server.namenode.NameNode.(NameNode.java:795)

        at org.apache.hadoop.hdfs.server.namenode.NameNode.createNameNode(NameNode.java:1488)

2015-12-01 15:24:39,536 INFO org.apache.hadoop.util.ExitUtil: Exiting with status 1

2015-12-01 15:24:39,539 INFO org.apache.hadoop.hdfs.server.namenode.NameNode: SHUTDOWN_MSG:

此錯誤的原因是hdfs-site.xml中的配置項“dfs.datanode.max.xcievers”值4096過小,需要改大一點。該錯誤會導緻hbase報“notservingregionexception”。

16/04/06 14:30:34 ERROR namenode.NameNode: Failed to start namenode.

執行“hdfs namenode -format”遇到上述錯誤時,是因為hdfs-site.xml中的配置dfs.namenode.shared.edits.dir配置錯誤,其中的hadoop-032省了“:8454”部分。

是因為配置hdfs-site.xml中的“dfs.namenode.shared.edits.dir”時,路徑少帶了cluster名。

檢查hdfs-site.xml中的“dfs.namenode.shared.edits.dir”值,JournalNode預設端口是8485,不是8454,确認是否有寫錯。JournalNode端口由hdfs-site.xml中的配置項dfs.journalnode.rpc-address決定。

執行“hdfs zkfc -formatZK”遇到上面這個錯誤,是因為還沒有執行“hdfs namenode -format”。NameNode ID是在“hdfs namenode -format”時生成的。

以非root使用者啟動DataNode,但啟動不了,在它的日志檔案中發現如下錯誤資訊:

2016-04-06 17:08:07,707 INFO org.apache.hadoop.hdfs.server.common.Storage: Analyzing storage directories for bpid BP-418073539-10.143.136.207-1459927327462

2016-04-06 17:08:07,707 WARN org.apache.hadoop.hdfs.server.common.Storage: Failed to analyze storage directories for block pool BP-418073539-10.143.136.207-1459927327462

java.io.IOException: BlockPoolSliceStorage.recoverTransitionRead: attempt to load an used block storage: /data3/datanode/data/current/BP-418073539-10.143.136.207-1459927327462

繼續尋找,會發現還存在如何錯誤提示:

Invalid dfs.datanode.data.dir /data3/datanode/data:

EPERM: Operation not permitted

使用指令“ls -l”檢查目錄/data3/datanode/data的權限設定,發現owner為root,原因是因為之前使用root啟動過DataNode,将owner改過來即可解決此問題。

DataNode的日志檔案不停地記錄如下日志,是因為DataNode将作為主NameNode,但實際上10.143.136.208并沒有啟動,主NameNode不是它。這個并不表示DataNode沒有起來,而是因為DataNode會同時和主NameNode和備NameNode建立心跳,當備NameNode沒有起來時,有這些日志是正常現象。

2016-04-06 18:00:32,940 INFO org.apache.hadoop.ipc.Client: Retrying connect to server: hadoop-031/10.143.136.208:8020. Already tried 0 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleepTime=1000 MILLISECONDS)

2016-04-06 17:55:44,555 INFO org.apache.hadoop.hdfs.server.datanode.DataNode: Namenode Block pool BP-418073539-10.143.136.207-1459927327462 (Datanode Uuid 2d115d45-fd48-4e86-97b1-e74a1f87e1ca) service to hadoop-030/10.143.136.207:8020 trying to claim ACTIVE state with txid=1

“trying to claim ACTIVE state”出自于hadoop/hdfs/server/datanode/BPOfferService.java中的updateActorStatesFromHeartbeat()。

2016-04-06 17:55:49,893 INFO org.apache.hadoop.ipc.Client: Retrying connect to server: hadoop-031/10.143.136.208:8020. Already tried 5 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleepTime=1000 MILLISECONDS)

“Retrying connect to server”出自于hadoop/ipc/Client.java中的handleConnectionTimeout()和handleConnectionFailure()。

如果遇到這個錯誤,請檢查NodeManager日志,如果發現有如下所示資訊:

WARN org.apache.hadoop.yarn.server.nodemanager.containermanager.monitor.ContainersMonitorImpl: Container [pid=26665,containerID=container_1461657380500_0020_02_000001] is running beyond virtual memory limits. Current usage: 345.0 MB of 1 GB physical memory used; 2.2 GB of 2.1 GB virtual memory used. Killing container.

則表示需要增大yarn-site.xmk的配置項yarn.nodemanager.vmem-pmem-ratio的值,該配置項預設值為2.1。

16/10/13 10:23:19 ERROR client.TransportClient: Failed to send RPC 7614640087981520382 to /10.143.136.231:34800: java.nio.channels.ClosedChannelException

java.nio.channels.ClosedChannelException

16/10/13 10:23:19 ERROR cluster.YarnSchedulerBackend$YarnSchedulerEndpoint: Sending RequestExecutors(0,0,Map()) to AM was unsuccessful

java.io.IOException: Failed to send RPC 7614640087981520382 to /10.143.136.231:34800: java.nio.channels.ClosedChannelException

        at org.apache.spark.network.client.TransportClient$3.operationComplete(TransportClient.java:249)

        at org.apache.spark.network.client.TransportClient$3.operationComplete(TransportClient.java:233)

        at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:680)

        at io.netty.util.concurrent.DefaultPromise$LateListeners.run(DefaultPromise.java:845)

        at io.netty.util.concurrent.DefaultPromise$LateListenerNotifier.run(DefaultPromise.java:873)

        at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:357)

        at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:357)

        at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:111)

        at java.lang.Thread.run(Thread.java:745)

《HBase-0.98.0分布式安裝指南》

《Hive 0.12.0安裝指南》

《ZooKeeper-3.4.6分布式安裝指南》

《Hadoop 2.3.0源碼反向工程》

《在Linux上編譯Hadoop-2.7.2》

《Accumulo-1.5.1安裝指南》

《Drill 1.0.0安裝指南》

《Shark 0.9.1安裝指南》