hadoop-HA集羣搭建,啓動DataNode,檢測啓動狀態,執行HDFS命令,啓動YARN,HD

hadoop-HA集羣搭建,啓動DataNode,檢測啓動狀態,執行HDFS命令,啓動YARN,HD

更新時間:2019-09-27 20:47:10  
 
 

原創,專業,圖文 hadoop-HA集羣搭建,啓動DataNode,檢測啓動狀態,執行HDFS命令,啓動YARN,HD - 集羣,搭建,啓動,DataNode,檢測,狀態,執行,HDFS,命令,YARN,權限,配置,客戶端, 今日頭條,最新,最好,最優秀,最靠譜,最有用,最好看,最有效,最熱,排行榜,最牛,怎麼辦,怎麼弄,解決方案,解決方法,怎麼處理,如何處理,如何解決html

<?xml version="1.0"?>java

<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>node

 

<configuration>git

    <property>程序員

        <name>mapreduce.framework.name</name>github

        <value>yarn</value>web

    </property>spring

</configuration>sql

 

詳細配置可參考:docker

http://hadoop.apache.org/docs/current/hadoop-mapreduce-client/hadoop-mapreduce-client-core/mapred-default.xml

8.10. 修改yarn-site.xml

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

屬性名

屬性值

涉及範圍

yarn.resourcemanager.hostname

0.0.0.0

ResourceManager

NodeManager

HA模式可不配置,但因爲其它配置項可能有引用它,建議保持值爲0.0.0.0,若是沒有被引用到,則可不配置。

yarn.nodemanager.hostname

0.0.0.0

 

yarn.nodemanager.aux-services

mapreduce_shuffle

 

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

yarn.resourcemanager.ha.enabled

true

啓用HA

yarn.resourcemanager.cluster-id

yarn-cluster

可不一樣於HDFS

yarn.resourcemanager.ha.rm-ids

rm1,rm2

注意NodeManager要和ResourceManager同樣配置

yarn.resourcemanager.hostname.rm1

hadoop1

 

yarn.resourcemanager.hostname.rm2

hadoop2

 

yarn.resourcemanager.webapp.address.rm1

hadoop1:8088

在瀏覽器上訪問:http://hadoop1:8088,能夠看到yarn的信息

yarn.resourcemanager.webapp.address.rm2

hadoop2:8088

在瀏覽器上訪問:http://hadoop2:8088,能夠看到yarn的信息

yarn.resourcemanager.zk-address

hadoop11:2181,hadoop12:2182,hadoop13:2181

 

yarn.resourcemanager.ha.automatic-failover.enable

true

可不配置,由於當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

 

單個容器可申請的最大內存

 

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

<?xml version="1.0"?>

 

<configuration>

    <!--啓用HA-->

    <property>

        <name>yarn.resourcemanager.ha.enabled</name>

        <value>true</value>

    </property>

   

    <!--指定RM的cluster id-->

    <property>

        <name>yarn.resourcemanager.cluster-id</name>

        <value>yarn-cluster</value>

    </property>

   

    <!-- 指定RM的名字 -->   

    <property>

        <name>yarn.resourcemanager.ha.rm-ids</name>

        <value>rm1,rm2</value>

    </property>  

   

    <!--分別指定RM的地址-->

    <property>

        <name>yarn.resourcemanager.hostname.rm1</name>

        <value>hadoop1</value>

    </property>

    <property>

        <name>yarn.resourcemanager.hostname.rm2</name>

        <value>hadoop2</value>

    </property>

    <property>

        <name>yarn.resourcemanager.webapp.address.rm1</name>

        <value>hadoop1:8088</value>

    </property>

    <property>

        <name>yarn.resourcemanager.webapp.address.rm2</name>

        <value>hadoop2:8088</value>

    </property>

    <!--指定zk集羣地址-->   

    <property>

        <name>yarn.resourcemanager.zk-address</name>

        <value>hadoop11:2181,hadoop12:2182,hadoop13:2181</value>

    </property>

   

    <!-- yarn中的nodemanager是否要提供一些輔助的服務 -->

    <property>

    <name>yarn.nodemanager.aux-services</name>

    <value>mapreduce_shuffle</value>

    </property>

 

</configuration>

 

yarn.nodemanager.hostname若是配置成具體的IP,則會致使每一個NodeManager的配置不一樣。詳細配置可參考:

http://hadoop.apache.org/docs/current/hadoop-yarn/hadoop-yarn-common/yarn-default.xml

Yarn HA的配置能夠參考:

https://hadoop.apache.org/docs/current/hadoop-yarn/hadoop-yarn-site/ResourceManagerHA.html

 

在hadoop1上配置完成後執行:

 

scp -r /home/toto/software/hadoop-2.8.0/etc/hadoop/* root@hadoop2:/home/tuzq/software/hadoop-2.8.0/etc/hadoop

scp -r /home/toto/software/hadoop-2.8.0/etc/hadoop/* root@hadoop3:/home/tuzq/software/hadoop-2.8.0/etc/hadoop

scp -r /home/toto/software/hadoop-2.8.0/etc/hadoop/* root@hadoop4:/home/tuzq/software/hadoop-2.8.0/etc/hadoop

scp -r /home/toto/software/hadoop-2.8.0/etc/hadoop/* root@hadoop5:/home/tuzq/software/hadoop-2.8.0/etc/hadoop


 

 

9. 啓動順序

Zookeeper -> JournalNode -> 格式化NameNode -> 初始化JournalNode

-> 建立命名空間(zkfc) -> NameNode -> DataNode -> ResourceManager -> NodeManager。

但請注意首次啓動NameNode以前,得先作format,也請注意備NameNode的啓動方法。

10. 啓動HDFS

在啓動HDFS以前,須要先完成對NameNode的格式化。

10.1. 建立好目錄

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

10.2. 啓動好zookeeper

./zkServer.sh start

注意在啓動其它以前先啓動zookeeper

10.3. 建立命名空間

在其中一個namenodehadoop1)上執行:

cd $HADOOP_HOME

bin/hdfs zkfc -formatZK    (第二次不用執行了)

 

10.4. 啓動全部JournalNode(hadoop1,hadoop2,hadoop3上執行)

NameNode將元數據操做日誌記錄在JournalNode上,主備NameNode經過記錄在JouralNode上的日誌完成元數據同步。

 

在全部JournalNode上執行:

cd $HADOOP_HOME

sbin/hadoop-daemon.sh start journalnode

 執行完成以後執行下面的命令進行查看:

[root@hadoop2 hadoop-2.8.0]# jps
3314 Jps
3267 JournalNode
[root@hadoop2 hadoop-2.8.0]#

 

注意,在執行「hdfs namenode -format」以前,必須先啓動好JournalNode,而format又必須在啓動namenode以前。

 

10.5初始化namenode

進入hadoop1接着執行下面的命令(初始化namenode,若是以前已經初始化過了,此時不須要再次從新初始化namenode):

hdfs namenode -format    (第二次不用執行了)

 

10.6.初始化JournalNode

若是是非HA轉HA才須要這一步,在其中一個JournalNode(在hadoop1)上執行:

bin/hdfs namenode -initializeSharedEdits   (第二次不用執行了):

此命令默認是交互式的,加上參數-force轉成非交互式。

 

在全部JournalNode建立以下目錄(第二次不用執行了):

mkdir -p /home/tuzq/software/hadoop-2.8.0/journal/mycluster/current

10.7. 啓動主NameNode

下面進入的是hadoop1這臺機器。關於啓動hadoop2上的namenode在下面的博文中有介紹

1) 進入$HADOOP_HOME目錄

2) 啓動主NameNode

sbin/hadoop-daemon.sh start namenode

 

啓動時,遇到以下所示的錯誤,則表示NameNode不能免密碼登陸本身。若是以前使用IP能夠免密碼登陸本身,則緣由通常是由於沒有使用主機名登陸過本身,所以解決辦法是使用主機名SSH一下

10.8. 啓動備NameNode

進入hadoop2,執行如下命令

bin/hdfs namenode -bootstrapStandby

出現:Re-format的都選擇N

sbin/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.

10.9. 啓動主備切換進程

在全部NameNode(即hadoop1和hadoop2上都執行命令)上啓動主備切換進程:

sbin/hadoop-daemon.sh start zkfc

只有啓動了DFSZKFailoverController進程,HDFS才能自動切換主備。

 

注:zkfc是zookeeper failover controller的縮寫。

10.10. 啓動全部DataNode

在各個DataNode上分別執行(即hadoop3,hadoop4,hadoop5上)

sbin/hadoop-daemon.sh start datanode

 

若是有發現DataNode進程並無起來,能夠試試刪除logs目錄下的DataNode日誌,再得啓看看。

10.11. 檢查啓動是否成功

1) 使用JDK提供的jps命令,查看相應的進程是否已啓動

2) 檢查$HADOOP_HOME/logs目錄下的log和out文件,看看是否有異常信息。

 

啓動後nn1和nn2都處於備機狀態,將nn1切換爲主機(下面的命令在hadoop1上執行):

bin/hdfs haadmin -transitionToActive nn1

 

 

 

10.11.1. DataNode

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

$ jps

18669 DataNode

24542 Jps

10.11.2. NameNode

執行jps命令,可看到NameNode進程:

$ jps

18669 NameNode

24542 Jps

10.12. 執行HDFS命令

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

10.12.1. 查看DataNode是否正常啓動

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,hadoop2上分別執行)

進入hadoop1機器,執行命令:

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

 cd $HADOOP_HOME

# sbin/start-yarn.sh      (注意:hadoop1和hadoop2都啓動)

   

在瀏覽器上訪問:http://hadoop1:50070/,界面以下:

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

  

    再在瀏覽器上訪問:http://hadoop2:50070/


   經過上面,發現hadoop2是一種備用狀態。

 

訪問yarn(訪問地址能夠在yarn-site.xml中查找到),訪問以後的效果以下http://hadoop1:8088/cluster:

 

10.12.2. 查看NameNode的主備狀態

如查看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。示例:

> hdfs dfs -ls hdfs://hadoop1:8020/

 

 

 

8020後面的斜槓/是和必須的,不然被看成文件。若是不指定端口號8020,則使用默認的8020,「hadoop1:8020」由hdfs-site.xml中「dfs.namenode.rpc-address」指定。

不難看出「hdfs dfs -ls」能夠操做不一樣的HDFS集羣,只須要指定不一樣的URI。

 

若是想經過hdfs協議查看文件列表或者文件,可使用以下方式:

 

文件上傳後,被存儲在DataNode的data目錄下(由DataNode的hdfs-site.xml中的屬性「dfs.datanode.data.dir」指定),

如:$HADOOP_HOME/data/data/current/BP-472842913-192.168.106.91-1497065109036/current/finalized/subdir0/subdir0/blk_1073741825

文件名中的「blk」是block,即塊的意思,默認狀況下blk_1073741825即爲文件的一個完整塊,Hadoop未對它進額外處理。

10.12.4. hdfs dfs -put

上傳文件命令,示例:

hdfs dfs -put /etc/SuSE-release hdfs://192.168.106.91/

10.12.5. hdfs dfs -rm

刪除文件命令,示例:

hdfs dfs -rm hdfs://192.168.106.91/SuSE-release

Deleted hdfs://192.168.106.91/SuSE-release

10.12.6. 新NameNode如何加入?

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

1) bin/hdfs namenode -bootstrapStandby

2) sbin/hadoop-daemon.sh start namenode

 

10.12.7. HDFS只容許有一主一備兩個NameNode

若是試圖配置三個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)

10.12.8. 存儲均衡start-balancer.sh

示例: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

10.12.9. 新增JournalNode

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

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

 

的基礎上新增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 -> /data/journal/test/current/edits_0000000000000194269-0000000000000194270

11. 啓動YARN

11.1. 啓動YARN

1) 進入$HADOOP_HOME/sbin目錄

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

 

若啓動成功,則在Master節點執行jps,能夠看到ResourceManager:

> jps

24689 NameNode

30156 Jps

28861 ResourceManager

 

在Slaves節點執行jps,能夠看到NodeManager:

$ jps

14019 NodeManager

23257 DataNode

15115 Jps

 

若是隻須要單獨啓動指定節點上的ResourceManager,這樣:

sbin/yarn-daemon.sh start resourcemanager

 

對於NodeManager,則是這樣:

sbin/yarn-daemon.sh start nodemanager

11.2. 執行YARN命令

11.2.1. yarn node -list

列舉YARN集羣中的全部NodeManager,如(注意參數間的空格,直接執行yarn能夠看到使用幫助):

[root@hadoop1sbin]# yarn node –list

 

11.2.2. yarn node -status

查看指定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]# 

11.2.3. yarn rmadmin -getServiceState rm1

查看rm1的主備狀態,即查看它是主(active)仍是備(standby)。

 

11.2.4. yarn rmadmin -transitionToStandby rm1

將rm1從主切爲備。

更多的yarn命令能夠參考:

https://hadoop.apache.org/docs/current/hadoop-yarn/hadoop-yarn-site/YarnCommands.html

12. 運行MapReduce程序

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

hadoop@VM-40-171-sles10-64:~/hadoop> 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中含有多個示例程序,不帶參數運行,便可看到用法:

hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount

Usage: wordcount  

 

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權限配置

13.1. hdfs-site.xml

dfs.permissions.enabled = true

dfs.permissions.superusergroup = supergroup

dfs.cluster.administrators = ACL-for-admins

dfs.namenode.acls.enabled = true

dfs.web.ugi = webuser,webgroup

13.2. core-site.xml

fs.permissions.umask-mode = 022

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

14. C++客戶端編程

14.1. 示例代碼

// 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 

#include 

#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);

          exit(-1);

    }

    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");

          exit(-1);

    }

    int num_entries = 0;

    hdfsFileInfo* entries;

    if (argc < 2)

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

    else

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

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

    for (int i=0; i<num_entries; ++i) </num_entries; ++i)<>

    {

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

    } 

    hdfsFreeFileInfo(entries, num_entries);

    hdfsDisconnect(fs);

    //hdfsFreeBuilder(bld); 

#endif

    return 0;

}

14.2. 運行示例

運行以前須要設置好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

15. 常見錯誤

15.1. 執行「hdfs dfs -ls」時報ConnectException

緣由多是指定的端口號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

文件名中的「blk」是block,即塊的意思,默認狀況下blk_1073741825即爲文件的一個完整塊,Hadoop未對它進額外處理。

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.

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

15.2. Initialization failed for Block pool

多是由於對NameNode作format以前,沒有清空DataNode的data目錄。

15.3. Incompatible clusterIDs

 

「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)

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

2014-04-17 19:30:33,184 INFO org.apache.hadoop.hdfs.server.datanode.DataNode: Removed Block pool  (Datanode Uuid unassigned)

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.DataNode.shutdownBlockPool(DataNode.java:861)

        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)

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

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

************************************************************/

15.4. Inconsistent checkpoint fields

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)

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

 

另外,也請配置好SecondaryNameNodehdfs-site.xml中的「dfs.datanode.data.dir」爲合適的值:

  hadoop.tmp.dir

  /home/tuzq/software/current/tmp

  A base for other temporary directories.

15.5. fs.defaultFS is file:///

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

15.6. a shared edits dir must not be specified if HA is not enabled

該錯誤多是由於hdfs-site.xml中沒有配置dfs.nameservices或dfs.ha.namenodes.mycluster。

15.7. /tmp/dfs/name is in an inconsistent state: storage directory does not exist or is not accessible.

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

15.8. The auxService:mapreduce_shuffle does not exist

問題緣由是沒有配置yarn-site.xml中的「yarn.nodemanager.aux-services」,將它的值配置爲mapreduce_shuffle,而後重啓yarn問題即解決。記住全部yarn節點都須要修改,包括ResourceManager和NodeManager,若是NodeManager上的沒有修改,仍然會報這個錯誤。

15.9. org.apache.hadoop.ipc.Client: Retrying connect to server

該問題,有多是由於NodeManager中的yarn-site.xml和ResourceManager上的不一致,好比NodeManager沒有配置yarn.resourcemanager.ha.rm-ids。

15.10. mapreduce.Job: Running job: job_1445931397013_0001

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

問題緣由多是由於yarn的NodeManager沒起來,能夠用jdk的jps確認下。

 

該問題也有多是由於NodeManager中的yarn-site.xml和ResourceManager上的不一致,好比NodeManager沒有配置yarn.resourcemanager.ha.rm-ids。

15.11. Could not format one or more JournalNodes

執行「./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,問題可能就解決了。

15.12. org.apache.hadoop.yarn.server.resourcemanager.ResourceManager: Already in standby state

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

15.13. No valid image files found

若是是備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)

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

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:

15.14. xceivercount 4097 exceeds the limit of concurrent xcievers 4096

此錯誤的緣由是hdfs-site.xml中的配置項「dfs.datanode.max.xcievers」值4096太小,須要改大一點。該錯誤會致使hbase報「notservingregionexception」。

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

15.15. java.lang.IllegalArgumentException: Unable to construct journal, qjournal://hadoop-030:8485;hadoop-031:8454;hadoop-032

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

15.16. Bad URI 'qjournal://hadoop-030:8485;hadoop-031:8454;hadoop-032:8454': must identify journal in path component

是由於配置hdfs-site.xml中的「dfs.namenode.shared.edits.dir」時,路徑少帶了cluster名。

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)

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

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.

執行「hdfs zkfc -formatZK」遇到上面這個錯誤,是由於尚未執行「hdfs namenode -format」。NameNode ID是在「hdfs namenode -format」時生成的。

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.

以非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改過來便可解決此問題。

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

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()。

15.21. ERROR cluster.YarnClientSchedulerBackend: Yarn application has already exited with state FINISHED!

若是遇到這個錯誤,請檢查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)

.hadoop是什麼

Hadoop被公認是一套行業大數據標準開源軟件,在分佈式環境下提供了海量數據的處理能力。幾乎全部主流廠商都圍繞Hadoop開發工具、開源軟件、商業化工具和技術服務。今年大型IT公司,如EMC、Microsoft、Intel、Teradata、Cisco都明顯增長了Hadoop方面的投入。

 

二 .hadoop能幹什麼

hadoop擅長日誌分析,facebook就用Hive來進行日誌分析,2009年時facebook就有非編程人員的30%的人使用HiveQL進行數據分析;淘寶搜索中的自定義篩選也使用的Hive;利用Pig還能夠作高級的數據處理,包括Twitter、LinkedIn 上用於發現您可能認識的人,能夠實現相似Amazon.com的協同過濾的推薦效果。淘寶的商品推薦也是!在Yahoo!的40%的Hadoop做業是用pig運行的,包括垃圾郵件的識別和過濾,還有用戶特徵建模。(2012年8月25新更新,天貓的推薦系統是hive,少許嘗試mahout!)

 

三.hadoop的核心

1.HDFS: Hadoop Distributed File System  分佈式文件系統

2.YARN: Yet Another Resource Negotiator   資源管理調度系統

3.Mapreduce:分佈式運算框架

 

四.HDFS的架構

主從結構

       •主節點, namenode

        •從節點,有不少個: datanode

namenode負責:

         •接收用戶操做請求

         •維護文件系統的目錄結構

         •管理文件與block之間關係,block與datanode之間關係

datanode負責:

         •存儲文件

         •文件被分紅block存儲在磁盤上

         •爲保證數據安全,文件會有多個副本

 

Secondary NameNode負責:

           合併fsimage和edits文件來更新NameNode的metedata

 

五.Hadoop的特色

擴容能力(Scalable):能可靠地(reliably)存儲和處理千兆字節(PB)數據。

成本低(Economical):能夠經過普通機器組成的服務器羣來分發以及處理數據。這些服務器羣總計可達數千個節點。

高效率(Efficient):經過分發數據,hadoop能夠在數據所在的節點上並行地(parallel)處理它們,這使得處理很是的快速。

可靠性(Reliable):hadoop能自動地維護數據的多份副本,而且在任務失敗後能自動地從新部署(redeploy)計算任務。

 

六.NameNode

1.簡介

namenode是整個文件系統的管理節點。他維護着整個文件系統的文件目錄樹,文件/目錄的元信息和每一個文件對應的數據塊列表。接收用戶的操做請求。

文件包括:

fsimage:元數據鏡像文件。存儲某一時段NameNode內存元數據信息。

edits:操做日誌文件。

fstime:保存最近一次checkpoint的時間。

 

2.NameNode的工做特色

NameNode始終在內存中保存metedata,用於處理「讀請求」,到有「寫請求」到來時,NameNode首先會寫editlog到磁盤,即向edits文件中寫日誌,成功返回後,纔會修改內存,而且向客戶端返回。

Hadoop會維護一我的fsimage文件,也就是NameNode中metedata的鏡像,可是fsimage不會隨時與NameNode內存中的metedata保持一致,而是每隔一段時間經過合併edits文件來更新內容。Secondary NameNode就是用來合併fsimage和edits文件來更新NameNode的metedata的。

 

3.何時checkpoint

fs.checkpoint.period 指定兩次checkpoint的最大時間間隔,默認3600秒。 
fs.checkpoint.size    規定edits文件的最大值,一旦超過這個值則強制checkpoint,無論是否到達最大時間間隔。默認大小是64M。

 

 

七.SecondaryNameNode

1.簡介

HA的一個解決方案。但不支持熱備。配置便可。
執行過程:從NameNode上下載元數據信息(fsimage,edits),而後把兩者合併,生成新的fsimage,在本地保存,並將其推送到NameNode,替換舊的fsimage.
默認在安裝在NameNode節點上,但這樣...不安全!

2.工做流程

(1)secondary通知namenode切換edits文件;
(2)secondary從namenode得到fsimage和edits(經過http);
(3)secondary將fsimage載入內存,而後開始合併edits;
(4)secondary將新的fsimage發回給namenode;
(5)namenode用新的fsimage替換舊的fsimage;

 

八.DataNode

提供真實文件數據的存儲服務。
文件塊(block):最基本的存儲單位。對於文件內容而言,一個文件的長度大小是size,那麼從文件的0偏移開始,按照固定的大小,順序對文件進行劃分並編號,劃分好的每個塊稱一個Block。HDFS默認Block大小是128MB,以一個256MB文件,共有256/128=2個Block.
dfs.block.size
不一樣於普通文件系統的是,HDFS中,若是一個文件小於一個數據塊的大小,並不佔用整個數據塊存儲空間;
Replication:多複本。默認是三個。

 

九.HDFS

(1)讀過程

1.初始化FileSystem,而後客戶端(client)用FileSystem的open()函數打開文件

2.FileSystem用RPC調用元數據節點,獲得文件的數據塊信息,對於每個數據塊,元數據節點返回保存數據塊的數據節點的地址。

3.FileSystem返回FSDataInputStream給客戶端,用來讀取數據,客戶端調用stream的read()函數開始讀取數據。

4.DFSInputStream鏈接保存此文件第一個數據塊的最近的數據節點,data從數據節點讀到客戶端(client)

5.當此數據塊讀取完畢時,DFSInputStream關閉和此數據節點的鏈接,而後鏈接此文件下一個數據塊的最近的數據節點。

6.當客戶端讀取完畢數據的時候,調用FSDataInputStream的close函數。

7.在讀取數據的過程當中,若是客戶端在與數據節點通訊出現錯誤,則嘗試鏈接包含此數據塊的下一個數據節點。

8.失敗的數據節點將被記錄,之後再也不鏈接。

 

(2)寫過程

1.初始化FileSystem,客戶端調用create()來建立文件

2.FileSystem用RPC調用元數據節點,在文件系統的命名空間中建立一個新的文件,元數據節點首先肯定文件原來不存在,而且客戶端有建立文件的權限,而後建立新文件。

3.FileSystem返回DFSOutputStream,客戶端用於寫數據,客戶端開始寫入數據。

4.DFSOutputStream將數據分紅塊,寫入data queue。data queue由Data Streamer讀取,並通知元數據節點分配數據節點,用來存儲數據塊(每塊默認複製3塊)。分配的數據節點放在一個pipeline裏。Data Streamer將數據塊寫入pipeline中的第一個數據節點。第一個數據節點將數據塊發送給第二個數據節點。第二個數據節點將數據發送給第三個數據節點。

5.DFSOutputStream爲發出去的數據塊保存了ack queue,等待pipeline中的數據節點告知數據已經寫入成功。

6.當客戶端結束寫入數據,則調用stream的close函數。此操做將全部的數據塊寫入pipeline中的數據節點,並等待ack queue返回成功。最後通知元數據節點寫入完畢。

7.若是數據節點在寫入的過程當中失敗,關閉pipeline,將ack queue中的數據塊放入data queue的開始,當前的數據塊在已經寫入的數據節點中被元數據節點賦予新的標示,則錯誤節點重啓後可以察覺其數據塊是過期的,會被刪除。失敗的數據節點從pipeline中移除,另外的數據塊則寫入pipeline中的另外兩個數據節點。元數據節點則被通知此數據塊是複製塊數不足,未來會再建立第三份備份。

 

 

  Hadoop簡介
2018-09-04 18:20:00  qq_29721419  閱讀數 2638

Hadoop的架構

在其核心,Hadoop主要有兩個層次,即:

  • 加工/計算層(MapReduce)
  • 存儲層(Hadoop分佈式文件系統)

除了上面提到的兩個核心組件,Hadoop的框架還包括如下兩個模塊:

  • Hadoop通用:這是Java庫和其餘Hadoop組件所需的實用工具
  • Hadoop YARN :這是做業調度和集羣資源管理的框架

Hadoop Streaming 是一個實用程序,它容許用戶使用任何可執行文件(例如shell實用程序)做爲映射器和/或reducer建立和運行做業。

HDFS:

HDFS遵循主從架構,它具備如下元素。

一、名稱節點 -Namenode

名稱節點是包含GNU/Linux操做系統和軟件名稱節點的普通硬件。它是一個能夠在商品硬件上運行的軟件。具備名稱節點系統做爲主服務器,它執行如下任務: 
- 管理文件系統命名空間。 
- 規範客戶端對文件的訪問。 
- 它也執行文件系統操做,如重命名,關閉和打開的文件和目錄。

二、數據節點 - Datanode

Datanode具備GNU/Linux操做系統和軟件Datanode的普通硬件。對於集羣中的每一個節點(普通硬件/系統),有一個數據節點。這些節點管理數據存儲在它們的系統。 
- 數據節點上的文件系統執行的讀寫操做,根據客戶的請求。 
- 還根據名稱節點的指令執行操做,如塊的建立,刪除和複製。

三、塊 -block

通常用戶數據存儲在HDFS文件。在一個文件系統中的文件將被劃分爲一個或多個段和/或存儲在我的數據的節點。這些文件段被稱爲塊。換句話說,數據的HDFS能夠讀取或寫入的最小量被稱爲一個塊。缺省的塊大小爲64MB,但它能夠增長按須要在HDFS配置來改變

HDFS經常使用命令

  • 運行jar包:hadoop jar /Users/kexin/work/projects/Hadoop/target/hadoop-0.0.1-SNAPSHOT.jar com.kexin.hadoop.units.WordCount /test/test.txt /project/wordcount/output
  • 文件系統操做:hadoop fs -cat|ls|mkdir
  • 上傳文件:hadoop dfs -put ./testdata.txt /testdata
  • 遞歸刪除目錄及文件:hadoop fs -rmr /testdata
  • 刪除文件:hadoop fs -rm /testdata.txt

MapReduce

教程: 
http://www.javashuo.com/article/p-mlyyjuaz-hy.html 
http://hadoop.apache.org/docs/current/hadoop-mapreduce-client/hadoop-mapreduce-client-core/MapReduceTutorial.html#Example:_WordCount_v2.0

MapReduce計劃分三個階段執行,即映射階段,shuffle階段,並減小階段。

涉及到的角色:

一、客戶端(client):編寫mapreduce程序,配置做業,提交做業,這就是程序員完成的工做;

二、JobTracker:初始化做業,分配做業,與TaskTracker通訊,協調整個做業的執行;

三、TaskTracker:保持與JobTracker的通訊,在分配的數據片斷上執行Map或Reduce任務,TaskTracker和JobTracker的不一樣有個很重要的方面,就是在執行任務時候TaskTracker能夠有n多個,JobTracker則只會有一個(JobTracker只能有一個就和hdfs裏namenode同樣存在單點故障,我會在後面的mapreduce的相關問題裏講到這個問題的)

四、Hdfs:保存做業的數據、配置信息等等,最後的結果也是保存在hdfs上面

  • map階段:映射或映射器的工做是處理輸入數據。通常輸入數據以存儲在HDFS的文件或目錄的形式,輸入文件被傳遞到映射器功能線路,映射器處理該數據,並建立數據的若干小塊。

  • reduce階段:這個階段是Shuffle階段和Reduce階段的組合。減速器的工做是處理該來自映射器中的數據。處理以後,它產生一組新的輸出,這將被存儲在HDFS。

image

在一個MapReduce工做過程當中:

一、由Hadoop發送Map和Reduce任務到集羣的相應服務器

二、框架管理數據傳遞,例如發出任務的全部節點之間的集羣周圍的詳細信息,驗證任務完成,和複製數據

三、大部分的計算髮生在與在本地磁盤上,能夠減小網絡通訊量數據的節點

四、給定的任務完成後,將收集並減小了數據,以一個合適的結果發送回Hadoop服務器

應用程序一般實現Mapper和Reducer接口以提供map和reduce方法:

public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable> {

        private final static IntWritable one = new IntWritable(1);
        private Text word = new Text();

        public void map(Object key, Text value, Context context) throws IOException, InterruptedException {
            StringTokenizer itr = new StringTokenizer(value.toString());
            while (itr.hasMoreTokens()) {
                word.set(itr.nextToken());
                context.write(word, one);
            }
        }
    }

    public static class IntSumReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
        private IntWritable result = new IntWritable();

        public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
            int sum = 0;
            for (IntWritable val : values) {
                sum += val.get();
            }
            result.set(sum);
            context.write(key, result);
        }
    }

    public static void main(String[] args) throws Exception {
        Configuration conf = new Configuration();
        Job job = Job.getInstance(conf, "word count");
        job.setJarByClass(WordCount.class);
        job.setMapperClass(TokenizerMapper.class);
        job.setCombinerClass(IntSumReducer.class);
        job.setReducerClass(IntSumReducer.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);
        FileInputFormat.addInputPath(job, new Path(args[0]));
        FileOutputFormat.setOutputPath(job, new Path(args[1]));
        System.exit(job.waitForCompletion(true) ? 0 : 1);
    }

在idea中遠程調試程序

System.setProperty("hadoop.home.dir", "/Users/kexin/work/app/hadoop/hadoop-2.6.5");

    Configuration conf = new Configuration();
    String uri = "hdfs://localhost:9000";
    Job job = null;
    try {
        job = Job.getInstance(conf);
    } catch (IOException e) {
        e.printStackTrace();
    }
    job.setJarByClass(WordCount.class);
    job.setMapperClass(TokenizerMapper.class);
    job.setReducerClass(IntSumReducer.class);
    job.setOutputKeyClass(Text.class);
    job.setOutputValueClass(IntWritable.class);

    FileSystem fs = FileSystem.get(URI.create(uri), conf);

    try {
        FileInputFormat.addInputPath(job, new Path("hdfs://localhost:9000/test/test.txt"));
        Path outpath = new Path("hdfs://localhost:9000/project/wordcount/output");
        if (fs.exists(outpath)) {
            fs.delete(outpath, true);
        }
        FileOutputFormat.setOutputPath(job, outpath);
    } catch (IllegalArgumentException | IOException e) {
        e.printStackTrace();
    }

    try {
        job.submit();
    } catch (ClassNotFoundException | IOException | InterruptedException e) {
        e.printStackTrace();
    }

在idea中本地調試程序

System.setProperty("hadoop.home.dir", "/Users/kexin/work/app/hadoop/hadoop-2.6.5");

    Configuration config = new Configuration();

    try {
        FileSystem fs = FileSystem.get(config);

        Job job = Job.getInstance(config);
        job.setJarByClass(WordCount.class);

        job.setJobName("word count");

        job.setMapperClass(TokenizerMapper.class);
        job.setReducerClass(IntSumReducer.class);

        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(IntWritable.class);

        FileInputFormat.addInputPath(job, new Path("/Users/kexin/work/projects/Hadoop/src/main/resources/input"));
        Path outpath = new Path("/Users/kexin/work/projects/Hadoop/src/main/resources/output");
        if (fs.exists(outpath)) {
            fs.delete(outpath, true);
        }
        FileOutputFormat.setOutputPath(job, outpath);

        boolean f = job.waitForCompletion(true);
        if (f) {
            System.out.println("job任務執行成功");
        }
    } catch (Exception e) {
        e.printStackTrace();
    }

一、映射器

映射器將輸入k/v對映射到一組中間k/v對。轉換後的中間記錄不須要與輸入記錄的類型相同。給定的輸入對能夠映射到零個或多個輸出對。經過調用context.write(WritableComparable,Writable)來收集輸出對。

Hadoop MapReduce框架爲做業的InputFormat生成的每一個InputSplit生成一個map任務。

總的來講,映射器實現經過Job.setMapperClass(Class)方法傳遞給做業。而後,框架爲InputSplit中的每一個k/v對調用該任務的map。

映射的數量一般由輸入的總大小驅動,即輸入文件的塊總數。也可使用Configuration.set(MRJobConfig.NUM_MAPS,int)來設置映射數量。

隨後將與給定輸出鍵關聯的全部中間值按框架分組,並傳遞給Reducer以肯定最終輸出。用戶能夠經過Job.setGroupingComparatorClass(Class)指定Comparator來控制分組。

對Mapper輸出進行排序,而後根據Reducer進行分區。分區總數與做業的reduce任務數相同。用戶能夠經過實現自定義分區程序來控制哪些鍵(以及記錄)轉到哪一個Reducer。

用戶能夠選擇經過Job.setCombinerClass(Class)指定組合器來執行中間輸出的本地聚合,好比合並重復的key,這有助於減小從Mapper傳輸到Reducer的數據量。

二、Reducer

Reducer有3個主要階段:shuffle,sort和reduce

一、shuffle

Reducer的輸入是映射器的排序輸出。在此階段,框架經過HTTP獲取全部映射器的輸出的相關分區

二、sort

框架在此階段按鍵(由於不一樣的映射器可能輸出相同的鍵)對Reducer輸入進行分組。在獲取map輸出結果時,shuffle和sort階段同時進行。

若是要求對中間密鑰進行分組的等價規則與在減小以前對密鑰進行分組的等價規則不一樣,則能夠經過Job.setSortComparatorClass(Class)指定比較器。因爲Job.setGroupingComparatorClass(Class)可用於控制中間鍵的分組方式,所以能夠結合使用這些鍵來模擬值的二級排序。

三、reduce

在此階段,爲分組輸入中的每一個

2017-08-07 18:04:02  wenwenxiong  閱讀數 1226

下載或構建hadoop docker鏡像

下載hadoop docker鏡像

$ docker pull krejcmat/hadoop-master:latest
$ docker pull krejcmat/hadoop-slave:latest

構建hadoop docker鏡像

$ git clone https://github.com/krejcmat/hadoop-docker.git
$ cd hadoop-docker
$ ./build-image.sh hadoop-dnsmasq
$ docker images

REPOSITORY                TAG                 IMAGE ID            CREATED             SIZE
krejcmat/hadoop-slave     latest              81cddf669d42        42 minutes ago      670.9 MB
krejcmat/hadoop-master    latest              ed91c813b86f        42 minutes ago      670.9 MB
krejcmat/hadoop-base      latest              cae006d1c427        50 minutes ago      670.9 MB
krejcmat/hadoop-dnsmasq   latest              89f0052d964c        53 minutes ago      156.9 MB
philcryer/min-wheezy      latest              214c501b67fa        14 months ago       50.74 MB

其中,philcryer/min-wheezy, krejcmat/hadoop-dnsmasq, krejcmat/hadoop-base是臨時產生的中間docker鏡像,能夠刪除掉

$ docker rmi c4c4000322cf e148f587cc4f d196b785d987

運行hadoop容器集羣

在git項目的目錄下

$ ./start-container.sh latest 2 start master container... start slave1 container...

檢查集羣成員

$ serf members

master.krejcmat.com  172.17.0.2:7946  alive
slave1.krejcmat.com  172.17.0.3:7946  alive
$ cd ~
$ ./configure-members.sh

Warning: Permanently added 'slave1.krejcmat.com,172.17.0.3' (ECDSA) to the list of known hosts.slaves
..........
$ ./start-hadoop.sh 
 #For stop Hadoop ./stop-hadoop.sh

Starting namenodes on [master.krejcmat.com] .......... $ jps 342 NameNode 460 DataNode 1156 Jps 615 SecondaryNameNode 769 ResourceManager 862 NodeManager $ hdfs dfsadmin -report Name: 172.17.0.2:50010 (master.krejcmat.com) Hostname: master.krejcmat.com ..........

經過web瀏覽器訪問http://IP:8088 hadoop集羣頁面

2017-09-03 13:52:25  u013595419  閱讀數 2466

什麼是Hadoop?

Hadoop是Apache的一款開源框架,使用java語言編寫,能夠經過編寫簡單的程序來實現大規模數據集合的分佈式計算。工做在Hadoop框架上的應用能夠工做在分佈式存儲和計算機集羣計算的環境上面。Hadoop具備高擴展性,其集羣可以從單臺機器擴展到數千臺機器。 
Hadoop 採用的是Apache v2協議,Hadoop基於Google發佈的MapReduce論文實現,而且應用了函數式編程的思想。

Hadoop 架構

Hadoop框架包括下述三個個模塊

HDFSMapReduceYARN

HDFS

Hadoop Distributed File System (HDFS) 是Hadoop集羣中最根本的文件系統,它提供了高擴展,高容錯,機架感知數據存儲等特性,能夠很是方便的部署在機器上面。HDFS除過度布式文件系統所通有的特色以外,還有些僅屬本身的特色:

  • 對硬件故障的考慮設計
  • 更大的數據單元,默認的塊大小爲128M
  • 對序列操做的優化
  • 機架感知
  • 支持異構集羣和跨平臺

Hadoop集羣中的數據被劃分紅更小的單元(一般被稱爲),而且將其分佈式存儲在集羣中,每一個塊有兩個副本,這個兩個副本被存儲在集羣的的一個機架上。這樣數據包含自身便有三個副本,具備極高的可用性和容錯性,若是一個副本丟失,HDFS將會自動的從新複製一份,以確保集羣中一共包含三個數據副本(包含自身)。

HDFS也能夠有多種形式,這個取決於Hadoop版本及所需功能。

HDFS是Leader/Follower架構實現的,每一個集羣都必須包含一個NameNode節點,和一個可選的SecondaryName節點,以及任意數量的DataNodes。

除了管理文件系統命名空間和管理元數據以外,NameNode對clients而言,還扮演着master和brokers的角色(雖然clients是直接與DataNode進行通訊的)。NameNode徹底存在於內存中,但它仍然會將自身狀態寫入磁盤。

HDFS 的替代文件系統

HDFS是Hadoop中經典的文件系統,可是Hadoop並不只僅支持HDFS,它還支持其餘的文件系統,好比Local file system, FTP, AWS S3, Azure’s file system, 和OpenStack’s Swift,這些文件系統能夠在使用時根據不一樣URI進行區分。好比:

file: for the local file system 
s3: for data stored on Amazon S3

MapReduce

MapReduce是爲可以在集羣上分佈式處理海量數據而量身訂作的框架,MapReduce job能夠分爲三次連續過程。

  • Map 將輸入數據劃分爲key-value集合
  • Shuffle 將Map產生的結果傳輸給Reduce
  • Reduce 則對接收到的key-value進一步處理

MapReduce的最大工做單元即是job,每一個job又會被分割成map task或reduce task。最經典的MapReduce job即是統計文檔中單詞出現的頻率,這個過程可使用下圖來描述

mapreduce

YARN

YARN (Yet Another Resource Negotiator) 是爲應用執行分配計算資源的一個框架。YARN主要包含下面三個核心組件

  • ResourceManager(一個集羣只有一個)
  • ApplicationMaster(每一個應用都有一個)
  • NodeManagers (每一個節點都有一個)

yarn

Note:

YARN 使用了一些容易讓人誤解的名詞做爲術語,所以應該特別注意。好比在Hadoop ecosystem中,Container這個概念,日常咱們聽到Container時,咱們都認爲是與Docker相關。可是這裏倒是指Resource Container (RC),即表示物理資源的集合。一般被抽象的表示,將資源分配給到目標和可分配單元。 
Application也是一個熟詞僻義的用法,在YARN中,一個Application指的是被一併執行的task的集合,YARN中的Application的概念大概相似於MapReduce中的job這個概念。

ResourceManager

ResourceManager在YARN中是一個rack-aware master節點,它主要負責管理全部可用資源的集合和運行一些相當重要的服務,其中最重要的即是Scheduler

Scheduler組件是YARN Resourcemanager中向運行時應用分配資源的一個重要組件,它僅僅完成資源調度的功能,並不完成監控應用狀態和進度的功能,所以即便應用執行失敗,它也不會去重啓失敗的應用。

可是在Hadoop 2.7.2開始,YARN開始支持少數調度策略CapacitySchedulerFairScheduler,FIFO Scheduler。默認狀況下由Hadoop來負責決定使用哪一種調度策略,不管使用那種調度策略,Scheduler都會經過Continer來向請求的ApplicationMaster分配資源。

ApplicationMaster

每一個運行在Hadoop上面的應用都會有本身專用的ApplicationMaster實例。每一個實例進會存在於集羣中每一個節點僅屬於本身的單獨Container。每一個Application的ApplicationMaster都會週期性的向ResourceManager發送心跳消息,若是有須要的話,還會去向ResourceManger請求額外的資源,ResourceManager便會爲額外的資源劃分租期(代表該資源已被某NodeManager所持有)

ApplicationMaster會監控每一個application的整個生命週期,從向ResourceManager請求額外的資源到向NodeManager提交請求。

NodeManagers

NodeManager能夠認爲是監控每一個節點的Container的代理,會監控每一個Container的整個生命週期,包括Continer的資源使用狀況,與ResourceManager的週期性通訊。

從概念上來講,NodeManager更像是Hadoop早期版本的TaskTrackers,當時Taskrackers主要被用來解決調度map和reduce slots問題,NodeManager有一個動態建立的,任意大小的Resouce Containers(RCs),並不像MR1中的那種slots,RCs能夠被用在map tasks中,reduce tasks中,或者是其餘框架的tasks

爲了更好的描述YARN,這裏給出一個YARN application的執行過程。以下圖所示:

yarn

  1. client向ResourceManager提交一個MapReduce應用,和啓動指定應用的ApplicationMaster所須要的信息。
  2. ResourceManager 會爲ApplicationMaster分派一個Container,而且啓動Application
  3. ApplicationMaster啓動,接着向ResourceManager註冊本身,容許調用client直接與ApplicationMaster交互
  4. ApplicatoinMaster爲客戶端應用分配資源
  5. ApplicationMaster爲application啓動Container
  6. 在執行期間,clients向Applicationaster提交application狀態和進度
  7. apllication執行完成,ApplicationMaster向ResouceManager撤銷掉本身的註冊信息,而後關機,將本身所持有的Container歸還給資源池。

Reference

Hadoop architectural overview

2018-06-09 17:57:00  weixin_36250487  閱讀數 3732

格式:hadoop fs -命令

主要有以下的命令:

 

 

 

命令 說明
hadoop fs -mkdir 建立HDFS目錄
hadoop fs -ls 列出HDFS目錄
hadoop fs -copyFromLocal

使用-copyFromLocal複製本地文件(local)到HDFS

hadoop fs -put 使用-put複製本地(local)文件到HDFS
hadoop fs -copyToLocal 將HDFS上的文件複製到本地(local)
hadoop fs -get 將HDFS上的文件複製到本地(local)
hadoop fs -cp 複製HDFS文件
hadoop fs -rm 刪除HDFS文件
hadoop fs -cat 列出HDFS目錄下的文件的內容
【1、建立與查看HDFS目錄】
一、建立HDFS目錄:

二、查看以前建立的HDFS目錄

注意:由於登陸的用戶爲hduser,因此會顯示/user/hduser下的目錄。

三、查看HDFS完整目錄

由於hadoop fs -ls只能查看一級目錄,因此必須逐級查看:

四、查看全部的HDFS子目錄

HDFS提供了一個方便的選項 -R 能夠遞歸查看目錄

五、一次性建立全部HDFS子目錄

逐級建立很麻煩,可是能夠添加參數-p,來一次性建立多級目錄:

 

【2、從本地計算機複製文件到HDFS】

一、複製本地文件到HDFS:

二、列出文件內容:

可使用:hadoop fs -cat /user/hduser/test/test1.txt | more   進行分頁顯示

三、若是複製到HDFS的文件已經存在,會報錯,此時可使用-f 參數,強制複製重複文件到HDFS目錄:

四、從本地複製多個文件到HDFS,中間用空格分割便可。

五、從本地複製整個目錄到HDFS:

六、列出HDFS目錄下的全部文件(包括這個目錄下子目錄的文件)

七、使用put複製文件到HDFS,這個參數與copyFromLocal的不一樣之處在於:

 

-put更寬鬆,能夠把本地或者HDFS上的文件拷貝到HDFS中;而-copyFromLocal則更嚴格限制只能拷貝本地文件到HDFS中。若是本地和HDFS上都存在相同路徑,則-put跟趨於優先取HDFS的源。(不用太深究二者區別,更多用-put)

 

 

【3、從HDFS上覆制文件到本地】

一、參數 -copyToLocal

二、一樣的也能夠用參數-get完成上述操做:

 

【4、複製與刪除HDFS文件】

一、使用-cp參數,在HDFS上進行復制文件

二、使用-rm參數,刪除HDFS上的文件;添加-R參數,刪除目錄:

 

在http://master:50070上能夠瀏覽和操做HDFS的目錄和文件
相關文章
相關標籤/搜索