天天看點

hadoop-HA叢集搭建,啟動DataNode,檢測啟動狀态,執行HDFS指令,啟動YARN,HDFS權限配置,C++用戶端程式設計,常見錯誤

本篇博文為整理網絡上hadoop-ha搭建後出來的部落格,參考網址為:http://blog.chinaunix.net/uid-196700-id-5751309.html

3. 部署

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

namenode

journalnode

datanode

zookeeper

192.168.106.91

192.168.106.92

192.168.106.93

192.168.106.94

192.168.106.95

192.168.106.101

192.168.106.102

192.168.106.103

機器ip

對應的主機名

hadoop1

hadoop2

hadoop3

hadoop4

hadoop5

hadoop11

hadoop12

hadoop13

3.2.2. 永久修改主機名(注意:這一步一定要做)

不同的linux發行版本,對應的系統配置檔案可能不同,centos6.7通過/etc/hosts:

[root@hadoop1 hadoop]# hostname

檢視主機配置資訊cat /etc/hosts:

[root@hadoop1 hadoop]# cat /etc/hosts

192.168.106.83      hadoop-father

192.168.106.91      hadoop1

192.168.106.92      hadoop2

192.168.106.93      hadoop3

192.168.106.94      hadoop4

192.168.106.95      hadoop5

192.168.106.96      hadoop6

192.168.106.97      hadoop7

192.168.106.98      hadoop8

192.168.106.100      hadoop10

192.168.106.101      hadoop11

192.168.106.102      hadoop12

192.168.106.103      hadoop13

關于虛拟機克隆,hostname修改,ip修改,參考博文:

<a target="_blank" href="http://blog.csdn.net/tototuzuoquan/article/details/53999173">http://blog.csdn.net/tototuzuoquan/article/details/53999173</a>

win10下虛拟機聯網問題,參考:

<a target="_blank" href="http://blog.csdn.net/tototuzuoquan/article/details/53900836">http://blog.csdn.net/tototuzuoquan/article/details/53900836</a>

3.3. 免密碼登入範圍

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

1) namenode能免密碼登入所有的datanode

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

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

4) datanode能免密碼登入自己

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

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

以下的免密登入方案是針對centos6.7上情況:

hadoop1下:

ssh-keygen -t rsa  (直接打enter,直到執行完畢)

然後執行:

ssh-copy-id hadoop1

ssh-copy-id hadoop2

ssh-copy-id hadoop3

ssh-copy-id hadoop4

ssh-copy-id hadoop5

通過上面的配置,可以在hadoop1上免密登入hadoop1、hadoop2、hadoop3、hadoop4、hadoop5

hadoop2下:

hadoop3下:

hadoop4下:

hadoop5下:

   下面是其它關于免密登入的資料

建議生成的私鑰和公鑰檔案名都帶上自己的ip,否則會有些混亂。

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

jdk

/usr/local/jdk1.8.0_73

hadoop

/home/tuzq/software/hadoop-2.8.0

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

為運作hadoop(hdfs、yarn和mapreduce)需要完成的工作詳單:

<a target="_blank" href="http://blog.chinaunix.net/uid-196700-id-5751309.html#_jdk%e5%ae%89%e8%a3%85">jdk安裝</a>

hadoop是java語言開發的,是以需要。

<a target="_blank" href="http://blog.chinaunix.net/uid-196700-id-5751309.html#_%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等的安裝。

本文安裝的jdk1.8.0_73版本。關于jdk的安裝,參考:http://blog.csdn.net/tototuzuoquan/article/details/18188109

此處略。

最後配置的java的環境變量是:

export java_home=/usr/local/jdk1.8.0_73

export classpath=$java_home/lib/tools.jar

export path=$java_home/bin:$path

完成這項操作之後,需要重新登入,或source一下profile檔案,以便環境變量生效,當然也可以手工運作一下,以即時生效。如果還不放心,可以運作下java或javac,看看指令是否可執行。如果在安裝jdk之前,已經可執行了,則表示不用安裝jdk。

本部分僅包括hdfs、mapreduce和yarn的安裝,不包括hbase、hive等的安裝。

   此處略,直接進入官網,下載下傳hadoop-2.8.0.tar.gz。關于源碼編譯的可以參考:

  源碼編譯:

 hadoop僞分布式叢集安裝:

1) 将下載下傳好的hadoop安裝包hadoop-2.8.0.tar.gz上傳到/home/tuzq/software目錄下

2) 進入/home/tuzq/software目錄

3) 在/home/tuzq/software目錄下,解壓安裝包hadoop-2.8.0.tar.gz:tar xzf hadoop-2.8.0.tar.gz,将自己在linux上編譯好的hadoop中的lib/native替換剛剛解壓好的hadoop-2.8.0/lib/native中的内容。

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

export hadoop_home=/home/tuzq/software/hadoop-2.8.0

export path=$path:$hadoop_home/bin

需要重新登入以生效,或者在終端上執行source /etc/profile,讓export hadoop_home=/home/tuzq/software/hadoop-2.8.0即時生效。

修改所有節點上的$hadoop_home/etc/hadoop/hadoop-env.sh檔案,在靠近檔案頭部分加入:export java_home=/usr/local/jdk1.8.0_73

特别說明一下:雖然在/etc/profile已經添加了java_home,但仍然得修改所有節點上的hadoop-env.sh,否則啟動時,報如下所示的錯誤:

ip: error: java_home is not set and could not be found.

除java_home之外,再添加:

export hadoop_conf_dir=${hadoop_home}/etc/hadoop

效果如下:

hadoop-HA叢集搭建,啟動DataNode,檢測啟動狀态,執行HDFS指令,啟動YARN,HDFS權限配置,C++用戶端程式設計,常見錯誤

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

export hadoop_conf_dir=$hadoop_home/etc/hadoop

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的配置參照的官方文檔:

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

屬性名

屬性值

說明

fs.defaultfs

hdfs://mycluster

fs.default.name

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

fs.defaultfs is file:///

hadoop.tmp.dir

/home/tuzq/software/hadoop-2.8.0/tmp

ha.zookeeper.quorum

hadoop11:2181,hadoop12:2181,hadoop13: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

   實際部署的時候的一個參考配置檔案如下:

&lt;?xml version="1.0" encoding="utf-8"?&gt;

&lt;?xml-stylesheet type="text/xsl" href="configuration.xsl"?&gt;

&lt;configuration&gt;

    &lt;property&gt;

        &lt;name&gt;fs.defaultfs&lt;/name&gt;

        &lt;value&gt;hdfs://mycluster&lt;/value&gt;

    &lt;/property&gt;

        &lt;name&gt;fs.default.name&lt;/name&gt;

        &lt;name&gt;hadoop.tmp.dir&lt;/name&gt;

        &lt;value&gt;/home/tuzq/software/hadoop-2.8.0/tmp&lt;/value&gt;

        &lt;name&gt;ha.zookeeper.quorum&lt;/name&gt;

        &lt;value&gt;hadoop11:2181,hadoop12:2181,hadoop13:2181&lt;/value&gt;

        &lt;name&gt;ha.zookeeper.parent-znode&lt;/name&gt;

        &lt;value&gt;/mycluster/hadoop-ha&lt;/value&gt;

&lt;/configuration&gt;

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

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

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

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

starting namenodes on []

改成“hadoop1:8020”後,則啟動時輸出為:

starting namenodes on [192.168.106.91]

8.8. 修改hdfs-site.xml

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

dfs.nameservices

mycluster

dfs.ha.namenodes.mycluster

nn1,nn2

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

dfs.namenode.rpc-address.mycluster.nn1

hadoop1:8020

dfs.namenode.rpc-address.mycluster.nn2

hadoop2:8020

dfs.namenode.http-address.mycluster.nn1

hadoop1:50070

dfs.namenode.http-address.mycluster.nn2

hadoop2:50070

dfs.namenode.shared.edits.dir

qjournal://hadoop1:8485;hadoop2:8485;hadoop3: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)

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

/root/.ssh/id_rsa

指定私鑰,如果是openssl,則值為/root/.ssh/id_rsa

dfs.ha.fencing.ssh.connect-timeout

30000

可選的配置

dfs.journalnode.edits.dir

/home/tuzq/software/hadoop-2.8.0/journal

journalnode存儲其本地狀态的位置,在journalnode機器上的絕對路徑,jns的edits和其它本地狀态被存儲在此處

dfs.datanode.data.dir

/home/tuzq/software/hadoop-2.8.0/data/data

dfs.namenode.name.dir

/home/tuzq/software/hadoop-2.8.0/data/name

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”。

dfs.journalnode.rpc-address

0.0.0.0:8485

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

詳細配置可參考:

實際部署的時候的一個參考配置檔案:

&lt;?xml-stylesheet type="text/xsl" href="configuration.xsl"?&gt;

        &lt;name&gt;dfs.nameservices&lt;/name&gt;

        &lt;value&gt;mycluster&lt;/value&gt;

    &lt;!--同一nameservice下,隻能配置一或兩個namenode,也就是說不能有nn3,分別是nn1,nn2--&gt;

        &lt;name&gt;dfs.ha.namenodes.mycluster&lt;/name&gt;

        &lt;value&gt;nn1,nn2&lt;/value&gt;

    &lt;!-- nn1的rpc通信位址 --&gt;

        &lt;name&gt;dfs.namenode.rpc-address.mycluster.nn1&lt;/name&gt;

        &lt;value&gt;hadoop1:8020&lt;/value&gt;

    &lt;!--nn1的http通信位址--&gt;

        &lt;name&gt;dfs.namenode.http-address.mycluster.nn1&lt;/name&gt;

        &lt;value&gt;hadoop1:50070&lt;/value&gt;

    &lt;!--nn2的rpc通信位址--&gt;

        &lt;name&gt;dfs.namenode.rpc-address.mycluster.nn2&lt;/name&gt;

        &lt;value&gt;hadoop2:8020&lt;/value&gt;

    &lt;!--nn2的http通信位址--&gt;

        &lt;name&gt;dfs.namenode.http-address.mycluster.nn2&lt;/name&gt;

        &lt;value&gt;hadoop2:50070&lt;/value&gt;

    &lt;!--指定namenode的edits中繼資料在journalnode上的存放位置,這也是一個叢集,至少3台quorum journal節點配置--&gt;

        &lt;name&gt;dfs.namenode.shared.edits.dir&lt;/name&gt;

        &lt;value&gt;qjournal://hadoop1:8485;hadoop2:8485;hadoop3:8485/mycluster&lt;/value&gt;

    &lt;!--

        journalnode存儲其本地狀态的位置,在journalnode機器上的絕對路徑,jns的edits

        和其他本地狀态将被存儲在此處

    --&gt;

        &lt;name&gt;dfs.journalnode.edits.dir&lt;/name&gt;

        &lt;value&gt;/home/tuzq/software/hadoop-2.8.0/journal&lt;/value&gt;

    &lt;!--配置journalnode的rpc端口号,預設為0.0.0.0:8485,可以不用修改--&gt;

        &lt;name&gt;dfs.journalnode.rpc-address&lt;/name&gt;

        &lt;property&gt;0.0.0.0:8485&lt;/property&gt;

    &lt;!--開啟namenode失敗自動切換,自動主備切換--&gt;

        &lt;name&gt;dfs.ha.automatic-failover.enabled&lt;/name&gt;

        &lt;value&gt;true&lt;/value&gt;

         配置失敗自動切換實作方式,切換的時候用哪種控制器,不同的名稱服務可以有不同的自動切換方式,

         用戶端通過它來找主namenode

        &lt;name&gt;dfs.client.failover.proxy.provider.mycluster&lt;/name&gt;

        &lt;value&gt;org.apache.hadoop.hdfs.server.namenode.ha.configuredfailoverproxyprovider&lt;/value&gt;

       配置隔離機制方法,多個機制用換行分割,即每個機制暫用一行

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

       上可以使用fuser;

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

       還可以為shell腳本,格式示例:shell(/bin/true),如果sshd不是預設的22端口時,就需要指定。

        &lt;name&gt;dfs.ha.fencing.methods&lt;/name&gt;

        &lt;value&gt;

              sshfence

              shell(/bin/true)

        &lt;/value&gt;

    &lt;!-- 使用sshfence隔離機制時需要ssh免登陸,指定私鑰,下面是openssl --&gt;

        &lt;name&gt;dfs.ha.fencing.ssh.private-key-files&lt;/name&gt;

        &lt;value&gt;/root/.ssh/id_rsa&lt;/value&gt;

    &lt;!-- 配置sshfence隔離機制逾時時間 --&gt;

        &lt;name&gt;dfs.ha.fencing.ssh.connect-timeout&lt;/name&gt;

        &lt;value&gt;30000&lt;/value&gt;

         namenode中繼資料存放目錄,預設值為file://${hadoop.tmp.dir}/dfs/name,

         也就是在臨時目錄下,可以考慮放到資料目錄下

        &lt;name&gt;dfs.datanode.data.dir&lt;/name&gt;

        &lt;value&gt;/home/tuzq/software/hadoop-2.8.0/data/data&lt;/value&gt;

        &lt;name&gt;dfs.namenode.name.dir&lt;/name&gt;

        &lt;value&gt;/home/tuzq/software/hadoop-2.8.0/data/name&lt;/value&gt;

       可選修改,類似于linux的最大可打開的檔案個數,預設為256,建議設定成大一點。同時,

       需要保證系統可打開的檔案個數足夠(可通過ulimit指令檢視),該錯誤會導緻hbase報

       "notservingregionexception"

        &lt;name&gt;dfs.datanode.max.xcievers&lt;/name&gt;

        &lt;value&gt;4096&lt;/value&gt;

8.9. 修改mapred-site.xml

涉及範圍

mapreduce.framework.name

yarn

所有mapreduce節點

實際部署中的一個參考配置如下:

&lt;?xml version="1.0"?&gt;

        &lt;name&gt;mapreduce.framework.name&lt;/name&gt;

        &lt;value&gt;yarn&lt;/value&gt;

對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

hadoop1:8088

yarn.resourcemanager.webapp.address.rm2

hadoop2:8088

yarn.resourcemanager.zk-address

hadoop11:2181,hadoop12:2182,hadoop13: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

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

   實際部署的時候一個參考配置:

    &lt;!--啟用ha--&gt;

        &lt;name&gt;yarn.resourcemanager.ha.enabled&lt;/name&gt;

    &lt;!--指定rm的cluster id--&gt;

        &lt;name&gt;yarn.resourcemanager.cluster-id&lt;/name&gt;

        &lt;value&gt;yarn-cluster&lt;/value&gt;

    &lt;!-- 指定rm的名字 --&gt;   

        &lt;name&gt;yarn.resourcemanager.ha.rm-ids&lt;/name&gt;

        &lt;value&gt;rm1,rm2&lt;/value&gt;

    &lt;/property&gt;  

    &lt;!--分别指定rm的位址--&gt;

        &lt;name&gt;yarn.resourcemanager.hostname.rm1&lt;/name&gt;

        &lt;value&gt;hadoop1&lt;/value&gt;

        &lt;name&gt;yarn.resourcemanager.hostname.rm2&lt;/name&gt;

        &lt;value&gt;hadoop2&lt;/value&gt;

        &lt;name&gt;yarn.resourcemanager.webapp.address.rm1&lt;/name&gt;

        &lt;value&gt;hadoop1:8088&lt;/value&gt;

        &lt;name&gt;yarn.resourcemanager.webapp.address.rm2&lt;/name&gt;

        &lt;value&gt;hadoop2:8088&lt;/value&gt;

    &lt;!--指定zk叢集位址--&gt;   

        &lt;name&gt;yarn.resourcemanager.zk-address&lt;/name&gt;

        &lt;value&gt;hadoop11:2181,hadoop12:2182,hadoop13:2181&lt;/value&gt;

    &lt;!-- yarn中的nodemanager是否要提供一些輔助的服務 --&gt;

    &lt;name&gt;yarn.nodemanager.aux-services&lt;/name&gt;

    &lt;value&gt;mapreduce_shuffle&lt;/value&gt;

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

yarn ha的配置可以參考:

在hadoop1上配置完成後執行:

zookeeper -&gt; journalnode -&gt; 格式化namenode -&gt; 初始化journalnode

-&gt; 建立命名空間(zkfc) -&gt; namenode -&gt; datanode -&gt; resourcemanager -&gt; nodemanager。

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

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

mkdir -p /home/tuzq/software/hadoop-2.8.0/tmp/dfs/name

./zkserver.sh start

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

在其中一個namenode(hadoop1)上執行:

bin/hdfs zkfc -formatzk

hadoop-HA叢集搭建,啟動DataNode,檢測啟動狀态,執行HDFS指令,啟動YARN,HDFS權限配置,C++用戶端程式設計,常見錯誤

namenode将中繼資料記錄檔記錄在journalnode上,主備namenode通過記錄在jouralnode上的日志完成中繼資料同步。

在所有journalnode上執行:

sbin/hadoop-daemon.sh start journalnode

hadoop-HA叢集搭建,啟動DataNode,檢測啟動狀态,執行HDFS指令,啟動YARN,HDFS權限配置,C++用戶端程式設計,常見錯誤

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

10.5初始化namenode

進入hadoop1接着執行下面的指令(初始化namenode,如果之前已經初始化過了,此時不需要再次重新初始化namenode):

hdfs namenode -format

如果是非ha轉ha才需要這一步,在其中一個journalnode(可以是在hadoop1)上執行:

bin/hdfs namenode -initializesharededits

hadoop-HA叢集搭建,啟動DataNode,檢測啟動狀态,執行HDFS指令,啟動YARN,HDFS權限配置,C++用戶端程式設計,常見錯誤

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

在所有journalnode建立如下目錄:

10.7. 啟動主namenode

下面進入的是hadoop1這台機器。關于啟動hadoop2上的namenode在下面的博文中有介紹。

1) 進入$hadoop_home/sbin目錄

2) 啟動主namenode:

sbin/hadoop-daemon.sh start namenode

hadoop-HA叢集搭建,啟動DataNode,檢測啟動狀态,執行HDFS指令,啟動YARN,HDFS權限配置,C++用戶端程式設計,常見錯誤

10.8. 啟動備namenode

進入hadoop2,執行以下指令

1)   bin/hdfs namenode –bootstrapstandby

hadoop-HA叢集搭建,啟動DataNode,檢測啟動狀态,執行HDFS指令,啟動YARN,HDFS權限配置,C++用戶端程式設計,常見錯誤

2) sbin/hadoop-daemon.sh start namenode

hadoop-HA叢集搭建,啟動DataNode,檢測啟動狀态,執行HDFS指令,啟動YARN,HDFS權限配置,C++用戶端程式設計,常見錯誤

如果沒有執行第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(即hadoop1和hadoop2上都執行指令)上啟動主備切換程序:

sbin/hadoop-daemon.sh start zkfc

hadoop-HA叢集搭建,啟動DataNode,檢測啟動狀态,執行HDFS指令,啟動YARN,HDFS權限配置,C++用戶端程式設計,常見錯誤

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

注:zkfc是zookeeper failover controller的縮寫。

在各個datanode上分别執行(即hadoop3,hadoop4,hadoop5上):

sbin/hadoop-daemon.sh start datanode

hadoop-HA叢集搭建,啟動DataNode,檢測啟動狀态,執行HDFS指令,啟動YARN,HDFS權限配置,C++用戶端程式設計,常見錯誤

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

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

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

啟動後nn1和nn2都處于備機狀态,将nn1切換為主機(下面的指令在hadoop1上執行):

bin/hdfs haadmin -transitiontoactive nn1

hadoop-HA叢集搭建,啟動DataNode,檢測啟動狀态,執行HDFS指令,啟動YARN,HDFS權限配置,C++用戶端程式設計,常見錯誤

執行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相同的值。

10.12.2啟動hdfs和yarn

進入hadoop1機器,執行指令:

[root@hadoop1sbin]# sbin/start-dfs.sh

hadoop-HA叢集搭建,啟動DataNode,檢測啟動狀态,執行HDFS指令,啟動YARN,HDFS權限配置,C++用戶端程式設計,常見錯誤

[root@hadoop1sbin]# ./start-yarn.sh

hadoop-HA叢集搭建,啟動DataNode,檢測啟動狀态,執行HDFS指令,啟動YARN,HDFS權限配置,C++用戶端程式設計,常見錯誤
hadoop-HA叢集搭建,啟動DataNode,檢測啟動狀态,執行HDFS指令,啟動YARN,HDFS權限配置,C++用戶端程式設計,常見錯誤

   上面顯示的是主的,是active狀态。

    再在浏覽器上通路:http://hadoop2:50070/

hadoop-HA叢集搭建,啟動DataNode,檢測啟動狀态,執行HDFS指令,啟動YARN,HDFS權限配置,C++用戶端程式設計,常見錯誤

   通過上面,發現hadoop2是一種備用狀态。

通路yarn(通路位址可以在yarn-site.xml中查找到),通路之後的效果如下http://hadoop1:8088/cluster:

hadoop-HA叢集搭建,啟動DataNode,檢測啟動狀态,執行HDFS指令,啟動YARN,HDFS權限配置,C++用戶端程式設計,常見錯誤

如檢視namenode1和namenode2分别是主還是備:

$ hdfs haadmin -getservicestate nn1

standby

$ hdfs haadmin -getservicestate nn2

active

10.12.3. hdfs dfs ls

注意:下面的指令隻有在啟動了yarn之後才會可用

“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://hadoop1:8020/

hadoop-HA叢集搭建,啟動DataNode,檢測啟動狀态,執行HDFS指令,啟動YARN,HDFS權限配置,C++用戶端程式設計,常見錯誤

8020後面的斜杠/是和必須的,否則被當作檔案。如果不指定端口号8020,則使用預設的8020,“hadoop1:8020”由hdfs-site.xml中“dfs.namenode.rpc-address”指定。

不難看出“hdfs dfs -ls”可以操作不同的hdfs叢集,隻需要指定不同的uri。

檔案上傳後,被存儲在datanode的data目錄下(由datanode的hdfs-site.xml中的屬性“dfs.datanode.data.dir”指定),

hadoop-HA叢集搭建,啟動DataNode,檢測啟動狀态,執行HDFS指令,啟動YARN,HDFS權限配置,C++用戶端程式設計,常見錯誤

如:$hadoop_home/data/data/current/bp-472842913-192.168.106.91-1497065109036/current/finalized/subdir0/subdir0/blk_1073741825

檔案名中的“blk”是block,即塊的意思,預設情況下blk_1073741825即為檔案的一個完整塊,hadoop未對它進額外處理。

上傳檔案指令,示例:

&gt; hdfs dfs -put /etc/suse-release hdfs://192.168.106.91/

删除檔案指令,示例:

&gt; hdfs dfs -rm hdfs://192.168.106.91/suse-release

deleted hdfs://192.168.106.91/suse-release

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

1) bin/hdfs namenode -bootstrapstandby

如果試圖配置三個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包含進來,如在

的基礎上新增hadoop6和hadoop7兩個journalnode:

qjournal://hadoop1:8485;hadoop2:8485;hadoop3:8485;hadoop6:8485;hadoop7:8485/mycluster

然後将安裝目錄和資料目錄(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

11. 啟動yarn

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,這樣:

sbin/yarn-daemon.sh start resourcemanager

對于nodemanager,則是這樣:

sbin/yarn-daemon.sh start nodemanager

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

[root@hadoop1sbin]# yarn node –list

hadoop-HA叢集搭建,啟動DataNode,檢測啟動狀态,執行HDFS指令,啟動YARN,HDFS權限配置,C++用戶端程式設計,常見錯誤

檢視指定nodemanager的狀态(通過上面查出來的結果進行查詢),如:

[root@hadoop1 hadoop]# yarn node -status hadoop5:59894

node report :

     node-id : hadoop5:59894

     rack : /default-rack

     node-state : running

     node-http-address : hadoop5:8042

     last-health-update : 星期六 10/六月/17 12:30:38:20cst

     health-report :

     containers : 0

     memory-used : 0mb

     memory-capacity : 8192mb

     cpu-used : 0 vcores

     cpu-capacity : 8 vcores

     node-labels :

     resource utilization by node : pmem:733 mb, vmem:733 mb, vcores:0.0

     resource utilization by containers : pmem:0 mb, vmem:0 mb, vcores:0.0

[root@hadoop1 hadoop]# 

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

hadoop-HA叢集搭建,啟動DataNode,檢測啟動狀态,執行HDFS指令,啟動YARN,HDFS權限配置,C++用戶端程式設計,常見錯誤

将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

13. hdfs權限配置

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 &lt; 2)

        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&lt;num_entries; ++i) &lt;/num_entries; ++i)&lt;&gt;

        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”指定)目錄下,如:

$hadoop_home/data/current/bp-139798373-192.168.106.91-1397735615751/current/finalized/blk_1073741825

hdfs dfs -ls hdfs://192.168.106.91: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.

java hotspot(tm) 64-bit server vm warning: you have loaded library /home/tuzq/software/hadoop-2.8.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'.

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/192.168.106.91 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目錄,實際上這個資訊已經由日志的“/home/tuzq/software/hadoop-2.8.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 /home/tuzq/software/hadoop-2.8.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 /192.168.106.91:9001

java.io.ioexception: incompatible clusterids in /home/tuzq/software/hadoop-2.8.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 /192.168.106.91: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-192.168.106.91-1397735061985.

expecting respectively: -56; 476845826; 0; cid-50401d89-a33e-47bf-9d14-914d8f1c4862; bp-2131387753-192.168.106.91-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

  /home/tuzq/software/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安裝指南》