溫馨提示:如果使用電腦查看圖片不清晰,可以使用手機打開文章單擊文中的圖片放大查看高清原圖。
Fayson的github: https://github.com/fayson/cdhproject
提示:代碼塊部分可以左右滑動查看噢
1
文章編寫目的
Fayson在前面的文章中對Hadoop3的新特性之一糾刪碼進行過介紹,參考《什麼是HDFS的糾刪碼》,後面又對糾刪碼的使用進行了實操,參考《如何在CDH6.0中使用糾刪碼》。但我們知道,在HDFS的三副本年代,Hadoop爲了最大限度保證數據可用性,HDFS本身還有一個機架感知策略。這裏先溫習一下:
“1.如果上傳本機不是一個datanode,而是一個客戶端,那麼就從所有slave機器中隨機選擇一臺datanode作爲第一個塊的寫入機器(datanode1)。而此時如果上傳機器本身就是一個datanode,那麼就將該datanode本身作爲第一個塊寫入機器(datanode1)。 2.隨後在datanode1所屬的機架以外的另外的機架上,隨機的選擇一臺,作爲第二個block的寫入datanode機器(datanode2)。 3.在寫第三個block前,先判斷是否前兩個datanode是否是在同一個機架上,如果是在同一個機架,那麼就嘗試在另外一個機架上選擇第三個datanode作爲寫入機器(datanode3)。而如果datanode1和datanode2沒有在同一個機架上,則在datanode2所在的機架上選擇一臺datanode作爲datanode3。 4.得到3個datanode的列表以後,從namenode返回該列表到DFSClient之前,會在namenode端首先根據該寫入客戶端跟datanode列表中每個datanode之間的“距離”由近到遠進行一個排序,客戶端根據這個順序有近到遠的進行數據塊的寫入。 5.當根據“距離”排好序的datanode節點列表返回給DFSClient以後,DFSClient便會創建Block OutputStream,並向這次block寫入pipeline中的第一個節點(最近的節點)開始寫入block數據。 6.寫完第一個block以後,依次按照datanode列表中的次遠的node進行寫入,直到最後一個block寫入成功,DFSClient返回成功,該block寫入操作結束。 通過以上策略,namenode在選擇數據塊的寫入datanode列表時,就充分考慮到了將block副本分散在不同機架下,並同時儘量地避免了之前描述的網絡開銷。 鏈接:https://www.jianshu.com/p/372d25352d3a”
那麼如果使用了糾刪碼機架感知策略會是怎樣呢。本文Fayson會以四組不同大小的數據基於三種EC策略實操分析block的位置,從而說明HDFS糾刪碼的機架感知策略。
- 內容概述
1.測試環境說明
2.block放置策略測試
3.總結
4.附錄:如何根據文件大小以及糾刪碼策略計算block group數量以及每個block的大小
- 測試版本
1.CM和CDH版本爲6.0
2.Redhat7.4
3.集羣已啓用Kerberos
2
測試環境說明
1.Fayson的集羣一共11個節點,包括1個管理節點和10個DataNode,然後將DataNode分配了4個機架rack1,rack2,rack3,rack4,每個機架下對應的節點數爲3 3 3 1。因爲Fayson只有10個DataNode,所以EC策略最高可以啓用RS-6-3-1024k,而RS-10-4-1024k則無法使用因爲至少需要14個DataNode,如下圖所示:
2.具體的節點,角色和機架表格示意如下:
節點IP | 角色 | 機架 |
---|---|---|
172.31.1.163 | DataNode | rack1 |
172.31.11.232 | DataNode | rack1 |
172.31.11.9 | DataNode | rack1 |
172.31.12.114 | DataNode | rack2 |
172.31.12.142 | DataNode | rack2 |
172.31.13.13 | DataNode | rack2 |
172.31.13.166 | DataNode | rack3 |
172.31.13.38 | DataNode | rack3 |
172.31.4.105 | DataNode | rack3 |
172.31.6.83 | Cloudera Manager/NameNode | default |
172.31.9.113 | DataNode | rack4 |
3.另外Fayson準備了4個文件,分別對應到不同的大小,如下表所示:
文件名 | 文件大小 | 備註 |
---|---|---|
100m.csv | 100MB | 1個block |
200m.csv | 200MB | 2個block |
300m.csv | 300MB | 3個block |
1211m.csv | 1.2GB | 10個block |
4.分別在HDFS中創建4個目錄,設置糾刪碼策略分別爲XOR-2-1-1024k,RS-3-2-1024k,RS-6-3-1024k和無策略。
hadoop fs -mkdir /ec_XOR-2-1-1024k hdfs ec -setPolicy -path /ec_XOR-2-1-1024k -policy XOR-2-1-1024k hadoop fs -mkdir /ec_RS-3-2-1024k hdfs ec -setPolicy -path /ec_RS-3-2-1024k -policy RS-3-2-1024k hadoop fs -mkdir /ec_RS-6-3-1024k hdfs ec -setPolicy -path /ec_RS-6-3-1024k -policy RS-6-3-1024k hadoop fs -mkdir /no_ec hdfs ec -getPolicy -path /ec_XOR-2-1-1024k hdfs ec -getPolicy -path /ec_RS-3-2-1024k hdfs ec -getPolicy -path /ec_RS-6-3-1024k hdfs ec -getPolicy -path /no_ec
(可左右滑動)
3
block放置策略測試
3.1
100MB文件
1.將準備好的100MB的文件分別put到在上章測試環境說明中的4個目錄。
[root@ip-172-31-6-83 generatedata]# hadoop fs -put 100m.csv /ec_XOR-2-1-1024k [root@ip-172-31-6-83 generatedata]# hadoop fs -put 100m.csv /ec_RS-3-2-1024k [root@ip-172-31-6-83 generatedata]# hadoop fs -put 100m.csv /ec_RS-6-3-1024k [root@ip-172-31-6-83 generatedata]# hadoop fs -put 100m.csv /no_ec [root@ip-172-31-6-83 generatedata]# hadoop fs -ls /ec_XOR-2-1-1024k /ec_RS-3-2-1024k /ec_RS-6-3-1024k /no_ec Found 1 items -rw-r--r-- 1 fayson supergroup 104094922 2018-11-22 11:50 /ec_XOR-2-1-1024k/100m.csv Found 1 items -rw-r--r-- 1 fayson supergroup 104094922 2018-11-22 11:51 /ec_RS-3-2-1024k/100m.csv Found 1 items -rw-r--r-- 1 fayson supergroup 104094922 2018-11-22 11:51 /ec_RS-6-3-1024k/100m.csv Found 1 items -rw-r--r-- 3 fayson supergroup 104094922 2018-11-22 11:51 /no_ec/100m.csv
(可左右滑動)
2.XOR-2-1-1024k目錄的副本放置情況爲:
[root@ip-172-31-6-83 shell]# hdfs fsck /ec_XOR-2-1-1024k -files -blocks -locations
(可左右滑動)
原始文件只有100MB,如果按照三副本策略,應該只有1個block(算上個3副本一共是3個),我們根據上圖可以發現有一個block group,同樣具有3個block文件,因爲糾刪碼策略是XOR-2-1,所以2個block是原始文件,1個block是校驗數據。以下再看看具體的block分佈:
172.31.11.232節點屬於rack1,放置第1份block,爲原始數據,大小爲50MB:
172.31.13.38節點屬於rack3,放置第2份block,爲原始數據,大小爲50MB:
172.31.9.113節點屬於rack4,放置第3份block,是校驗數據,大小爲50MB,直接cat查看爲亂碼:
彙總如下:
block | 節點IP | 大小 | Rack | 類型 |
---|---|---|---|---|
blk_-9223372036854775504 | 172.31.11.232 | 50MB | rack2 | 原始 |
blk_-9223372036854775503 | 172.31.13.38 | 50MB | rack3 | 原始 |
blk_-9223372036854775502 | 172.31.9.113 | 50MB | rack4 | 校驗 |
3.RS-3-2-1024k目錄的副本放置情況爲:
hdfs fsck /ec_RS-3-2-1024k -files -blocks -locations
(可左右滑動)
原始文件只有100MB,如果按照三副本策略,應該只有1個block(算上個3副本一共是3個),但是我們根據上圖可以發現有一個block group,卻有5個block文件,因爲糾刪碼策略是RS-3-2,所以3個block是原始文件,2個block是校驗數據。以下再看看具體的block分佈:
172.31.12.114節點屬於rack2,放置第1份block,爲原始數據,大小爲34MB:
172.31.12.142節點屬於rack2,放置第2份block,爲原始數據,大小爲34MB:
172.31.1.163節點屬於rack1,放置第3份block,爲原始數據,大小爲33MB:
172.31.9.113節點屬於rack4,放置第4份block,爲校驗數據,大小爲34MB,直接cat查看爲亂碼:
172.31.13.38節點屬於rack3,放置第5份block,爲校驗數據,大小爲34MB,直接cat查看爲亂碼:
彙總統計如下:
block | 節點IP | 大小 | Rack | 類型 |
---|---|---|---|---|
blk_-9223372036854775488 | 172.31.12.114 | 34MB | rack2 | 原始 |
blk_-9223372036854775487 | 172.31.12.142 | 34MB | rack2 | 原始 |
blk_-9223372036854775486 | 172.31.1.163 | 33MB | rack1 | 原始 |
blk_-9223372036854775485 | 172.31.9.113 | 34MB | rack4 | 校驗 |
blk_-9223372036854775484 | 172.31.13.38 | 34MB | rack3 | 校驗 |
4.RS-6-3-1024k目錄的副本放置情況爲:
hdfs fsck /ec_RS-6-3-1024k -files -blocks -locations
(可左右滑動)
原始文件只有100MB,如果按照三副本策略,應該只有1個block(算上個3副本一共是3個),但是我們根據上圖可以發現有一個block group,卻有9個block文件,因爲糾刪碼策略是RS-6-3,所以6個block是原始文件,3個block是校驗數據。爲了節省篇幅,具體的block分佈Fayson不再一臺一臺機器查看,直接看下錶:
block | 節點IP | 大小 | Rack | 類型 |
---|---|---|---|---|
blk_-9223372036854775472 | 172.31.12.142 | 17MB | rack2 | 原始 |
blk_-9223372036854775471 | 172.31.12.114 | 17MB | rack2 | 原始 |
blk_-9223372036854775470 | 172.31.13.13 | 17MB | rack2 | 原始 |
blk_-9223372036854775469 | 172.31.4.105 | 17MB | rack3 | 原始 |
blk_-9223372036854775468 | 172.31.13.38 | 16MB | rack3 | 原始 |
blk_-9223372036854775467 | 172.31.9.113 | 16MB | rack4 | 原始 |
blk_-9223372036854775466 | 172.31.11.232 | 17MB | rack1 | 校驗 |
blk_-9223372036854775465 | 172.31.1.163 | 17MB | rack1 | 校驗 |
blk_-9223372036854775464 | 172.31.11.9 | 17MB | rack1 | 校驗 |
5.三副本目錄的副本放置情況爲:
hdfs fsck /no_ec -files -blocks -locations
(可左右滑動)
block分佈情況如下表所示:
block | 節點IP | 大小 | Rack | 類型 |
---|---|---|---|---|
blk_1073753380 | 172.31.4.105 | 100MB | rack3 | 原始 |
blk_1073753380 | 172.31.1.163 | 100MB | rack1 | 原始 |
blk_1073753380 | 172.31.13.38 | 100MB | rack3 | 原始 |
3.2
200MB文件
1.將準備好的200MB的文件分別put到在上章測試環境說明中的4個目錄。
[root@ip-172-31-6-83 generatedata]# hadoop fs -put 200m.csv /ec_XOR-2-1-1024k [root@ip-172-31-6-83 generatedata]# hadoop fs -put 200m.csv /ec_RS-3-2-1024k [root@ip-172-31-6-83 generatedata]# hadoop fs -put 200m.csv /ec_RS-6-3-1024k [root@ip-172-31-6-83 generatedata]# hadoop fs -put 200m.csv /no_ec [root@ip-172-31-6-83 generatedata]# hadoop fs -ls /ec_XOR-2-1-1024k /ec_RS-3-2-1024k /ec_RS-6-3-1024k /no_ec Found 2 items -rw-r--r-- 1 fayson supergroup 104094922 2018-11-22 11:50 /ec_XOR-2-1-1024k/100m.csv -rw-r--r-- 1 fayson supergroup 208900504 2018-11-22 16:55 /ec_XOR-2-1-1024k/200m.csv Found 2 items -rw-r--r-- 1 fayson supergroup 104094922 2018-11-22 11:51 /ec_RS-3-2-1024k/100m.csv -rw-r--r-- 1 fayson supergroup 208900504 2018-11-22 16:57 /ec_RS-3-2-1024k/200m.csv Found 2 items -rw-r--r-- 1 fayson supergroup 104094922 2018-11-22 11:51 /ec_RS-6-3-1024k/100m.csv -rw-r--r-- 1 fayson supergroup 208900504 2018-11-22 16:57 /ec_RS-6-3-1024k/200m.csv Found 2 items -rw-r--r-- 3 fayson supergroup 104094922 2018-11-22 11:51 /no_ec/100m.csv -rw-r--r-- 3 fayson supergroup 208900504 2018-11-22 16:58 /no_ec/200m.csv [root@ip-172-31-6-83 generatedata]#
(可左右滑動)
2.XOR-2-1-1024k目錄的副本放置情況爲:
[root@ip-172-31-6-83 shell]# hdfs fsck /ec_XOR-2-1-1024k/200m.csv -files -blocks -locations
(可左右滑動)
原始文件只有200MB,如果按照三副本策略,應該只有2個block(算上個3副本一共是6個),但是我們根據上圖可以發現有一個block group,卻有3個block文件,因爲糾刪碼策略是XOR-2-1,所以2個block是原始文件,1個block是校驗數據。block的具體分佈爲:
block | 節點IP | 大小 | Rack | 類型 |
---|---|---|---|---|
blk_-9223372036854775456 | 172.31.13.13 | 100MB | rack2 | 原始 |
blk_-9223372036854775455 | 172.31.13.166 | 100MB | rack3 | 原始 |
blk_-9223372036854775454 | 172.31.9.113 | 100MB | rack4 | 校驗 |
3.RS-3-2-1024k目錄的副本放置情況爲:
[root@ip-172-31-6-83 shell]# hdfs fsck /ec_RS-3-2-1024k/200m.csv -files -blocks -locations
(可左右滑動)
原始文件只有200MB,如果按照三副本策略,應該只有2個block(算上個3副本一共是6個),但是我們根據上圖可以發現有一個block group,卻有5個block文件,因爲糾刪碼策略是RS-3-2,所以3個block是原始文件,2個block是校驗數據。block的具體分佈爲:
block | 節點IP | 大小 | Rack | 類型 |
---|---|---|---|---|
blk_-9223372036854775440 | 172.31.4.105 | 67MB | rack3 | 原始 |
blk_-9223372036854775439 | 172.31.13.166 | 67MB | rack3 | 原始 |
blk_-9223372036854775438 | 172.31.12.142 | 66MB | rack2 | 原始 |
blk_-9223372036854775437 | 172.31.9.113 | 67MB | rack4 | 校驗 |
blk_-9223372036854775436 | 172.31.11.9 | 67MB | rack1 | 校驗 |
4.RS-6-3-1024k目錄的副本放置情況爲:
[root@ip-172-31-6-83 shell]# hdfs fsck /ec_RS-6-3-1024k/200m.csv -files -blocks -locations
(可左右滑動)
原始文件只有200MB,如果按照三副本策略,應該只有2個block(算上個3副本一共是6個),但是我們根據上圖可以發現有一個block group,卻有9個block文件,因爲糾刪碼策略是RS-6-3,所以6個block是原始文件,3個block是校驗數據。block的具體分佈爲:
block | 節點IP | 大小 | Rack | 類型 |
---|---|---|---|---|
blk_-9223372036854775424 | 172.31.11.232 | 34MB | rack1 | 原始 |
blk_-9223372036854775423 | 172.31.1.163 | 34MB | rack1 | 原始 |
blk_-9223372036854775422 | 172.31.11.9 | 34MB | rack1 | 原始 |
blk_-9223372036854775421 | 172.31.13.166 | 34MB | rack3 | 原始 |
blk_-9223372036854775420 | 172.31.4.105 | 34MB | rack3 | 原始 |
blk_-9223372036854775419 | 172.31.9.113 | 34MB | rack4 | 原始 |
blk_-9223372036854775418 | 172.31.12.114 | 34MB | rack2 | 校驗 |
blk_-9223372036854775417 | 172.31.12.142 | 34MB | rack2 | 校驗 |
blk_-9223372036854775416 | 172.31.13.13 | 34MB | rack2 | 校驗 |
5.三副本目錄的副本放置情況爲:
hdfs fsck /no_ec/200m.csv -files -blocks -locations
(可左右滑動)
block分佈情況如下表所示:
block | 節點IP | 大小 | Rack | 類型 |
---|---|---|---|---|
blk_1073753684 | 172.31.13.38,172.31.4.105,172.31.12.142 | 128MB | rack3,rack3,rack2 | 原始 |
blk_ 1073753685 | 172.31.12.142,172.31.13.13,172.31.11.232 | 72MB | rack2,rack2,rack1 | 原始 |
3.3
300MB文件
1.將準備好的300MB的文件分別put到在上章測試環境說明中的4個目錄。
[root@ip-172-31-6-83 generatedata]# hadoop fs -put 300m.csv /ec_XOR-2-1-1024k [root@ip-172-31-6-83 generatedata]# hadoop fs -put 300m.csv /ec_RS-3-2-1024k [root@ip-172-31-6-83 generatedata]# hadoop fs -put 300m.csv /ec_RS-6-3-1024k [root@ip-172-31-6-83 generatedata]# hadoop fs -put 300m.csv /no_ec [root@ip-172-31-6-83 generatedata]# hadoop fs -ls /ec_XOR-2-1-1024k /ec_RS-3-2-1024k /ec_RS-6-3-1024k /no_ec Found 3 items -rw-r--r-- 1 fayson supergroup 104094922 2018-11-22 11:50 /ec_XOR-2-1-1024k/100m.csv -rw-r--r-- 1 fayson supergroup 208900504 2018-11-22 16:55 /ec_XOR-2-1-1024k/200m.csv -rw-r--r-- 1 fayson supergroup 313817537 2018-11-22 17:40 /ec_XOR-2-1-1024k/300m.csv Found 3 items -rw-r--r-- 1 fayson supergroup 104094922 2018-11-22 11:51 /ec_RS-3-2-1024k/100m.csv -rw-r--r-- 1 fayson supergroup 208900504 2018-11-22 16:57 /ec_RS-3-2-1024k/200m.csv -rw-r--r-- 1 fayson supergroup 313817537 2018-11-22 17:40 /ec_RS-3-2-1024k/300m.csv Found 3 items -rw-r--r-- 1 fayson supergroup 104094922 2018-11-22 11:51 /ec_RS-6-3-1024k/100m.csv -rw-r--r-- 1 fayson supergroup 208900504 2018-11-22 16:57 /ec_RS-6-3-1024k/200m.csv -rw-r--r-- 1 fayson supergroup 313817537 2018-11-22 17:40 /ec_RS-6-3-1024k/300m.csv Found 3 items -rw-r--r-- 3 fayson supergroup 104094922 2018-11-22 11:51 /no_ec/100m.csv -rw-r--r-- 3 fayson supergroup 208900504 2018-11-22 16:58 /no_ec/200m.csv -rw-r--r-- 3 fayson supergroup 313817537 2018-11-22 17:40 /no_ec/300m.csv
(可左右滑動)
2.XOR-2-1-1024k目錄的副本放置情況爲:
[root@ip-172-31-6-83 shell]# hdfs fsck /ec_XOR-2-1-1024k/300m.csv -files -blocks -locations
(可左右滑動)
原始文件只有300MB,如果按照三副本策略,應該只有3個block(算上個3副本一共是9個),但是我們根據上圖可以發現有2個block group,卻有6個block文件,因爲糾刪碼策略是XOR-2-1,所以在每個block group中,2個block是原始文件,1個block是校驗數據。block的具體分佈爲:
block group | block | 節點IP | 大小 | Rack | 類型 |
---|---|---|---|---|---|
0 | blk_-9223372036854775408 | 172.31.11.232 | 128MB | rack1 | 原始 |
blk_-9223372036854775407 | 172.31.9.113 | 128MB | rack4 | 原始 | |
blk_-9223372036854775406 | 172.31.12.114 | 128MB | rack2 | 校驗 | |
1 | blk_-9223372036854775392 | 172.31.13.38 | 22MB | rack3 | 原始 |
blk_-9223372036854775391 | 172.31.9.113 | 22MB | rack4 | 原始 | |
blk_-9223372036854775390 | 172.31.1.163 | 22MB | rack1 | 校驗 |
3.RS-3-2-1024k目錄的副本放置情況爲:
[root@ip-172-31-6-83 shell]# hdfs fsck /ec_RS-3-2-1024k/300m.csv -files -blocks -locations
(可左右滑動)
原始文件只有300MB,如果按照三副本策略,應該只有3個block(算上個3副本一共是9個),但是我們根據上圖可以發現有一個block group,卻有5個block文件,因爲糾刪碼策略是RS-3-2,所以3個block是原始文件,2個block是校驗數據。block的具體分佈爲:
block | 節點IP | 大小 | Rack | 類型 |
---|---|---|---|---|
blk_-9223372036854775376 | 172.31.9.113 | 100MB | rack4 | 原始 |
blk_-9223372036854775375 | 172.31.11.232 | 100MB | rack1 | 原始 |
blk_-9223372036854775374 | 172.31.11.9 | 100MB | rack1 | 原始 |
blk_-9223372036854775373 | 172.31.13.38 | 100MB | rack3 | 校驗 |
blk_-9223372036854775372 | 172.31.13.13 | 100MB | rack2 | 校驗 |
4.RS-6-3-1024k目錄的副本放置情況爲:
[root@ip-172-31-6-83 shell]# hdfs fsck /ec_RS-6-3-1024k/300m.csv -files -blocks -locations
(可左右滑動)
原始文件只有300MB,如果按照三副本策略,應該只有3個block(算上個3副本一共是9個),但是我們根據上圖可以發現有一個block group,卻有9個block文件,因爲糾刪碼策略是RS-6-3,所以6個block是原始文件,3個block是校驗數據。block的具體分佈爲:
block | 節點IP | 大小 | Rack | 類型 |
---|---|---|---|---|
blk_-9223372036854775360 | 172.31.13.13 | 50MB | rack2 | 原始 |
blk_-9223372036854775359 | 172.31.12.114 | 50MB | rack2 | 原始 |
blk_-9223372036854775358 | 172.31.12.142 | 50MB | rack2 | 原始 |
blk_-9223372036854775357 | 172.31.13.38 | 50MB | rack3 | 原始 |
blk_-9223372036854775356 | 172.31.4.105 | 50MB | rack3 | 原始 |
blk_-9223372036854775355 | 172.31.9.113 | 50MB | rack4 | 原始 |
blk_-9223372036854775354 | 172.31.1.163 | 50MB | rack1 | 校驗 |
blk_-9223372036854775353 | 172.31.11.232 | 50MB | rack1 | 校驗 |
blk_-9223372036854775352 | 172.31.11.9 | 50MB | rack1 | 校驗 |
6.三副本目錄的副本放置情況爲:
hdfs fsck /no_ec/300m.csv -files -blocks -locations
(可左右滑動)
block分佈情況如下表所示:
block | 節點IP | 大小 | Rack | 類型 |
---|---|---|---|---|
blk_1073753728 | 172.31.13.166, 172.31.4.105, 172.31.11.9 | 128MB | rack3,rack3,rack1 | 原始 |
blk_1073753729 | 172.31.9.113, 172.31.13.13, 172.31.12.142 | 128MB | rack4,rack2,rack2 | 原始 |
blk_1073753730 | 172.31.13.13,172.31.12.114,172.31.13.38 | 44MB | rack2,rack2,rack3 | 原始 |
3.4
1211MB文件
1.將準備好的1211MB的文件分別put到在上章測試環境說明中的4個目錄。
[root@ip-172-31-6-83 generatedata]# hadoop fs -put 1211m.csv /ec_XOR-2-1-1024k [root@ip-172-31-6-83 generatedata]# hadoop fs -put 1211m.csv /ec_RS-3-2-1024k [root@ip-172-31-6-83 generatedata]# hadoop fs -put 1211m.csv /ec_RS-6-3-1024k [root@ip-172-31-6-83 generatedata]# hadoop fs -put 1211m.csv /no_ec [root@ip-172-31-6-83 generatedata]# hadoop fs -ls /ec_XOR-2-1-1024k /ec_RS-3-2-1024k /ec_RS-6-3-1024k /no_ec
(可左右滑動)
2.XOR-2-1-1024k目錄的副本放置情況爲:
[root@ip-172-31-6-83 shell]# hdfs fsck /ec_XOR-2-1-1024k/1211m.csv -files -blocks -locations
(可左右滑動)
原始文件只有1211MB,如果按照三副本策略,應該只有10個block(算上3副本爲30個block),但是我們根據上圖可以發現有5個block group,每個group有3個block,一共15個block。因爲糾刪碼策略是XOR-2-1,所以在每個block group中,2個block是原始文件,1個block是校驗數據。block的具體分佈爲:
block group | block | 節點IP | 大小 | Rack | 類型 |
---|---|---|---|---|---|
0 | blk_-9223372036854775344 | 172.31.9.113 | 128MB | rack4 | 原始 |
blk_-9223372036854775343 | 172.31.12.114 | 128MB | rack2 | 原始 | |
blk_-9223372036854775342 | 172.31.4.105 | 128MB | rack3 | 校驗 | |
group123略 | |||||
4 | blk_-9223372036854775280 | 172.31.1.163 | 94MB | rack1 | 原始 |
blk_-9223372036854775279 | 172.31.13.166 | 94MB | rack3 | 原始 | |
blk_-9223372036854775278 | 172.31.12.114 | 94MB | rack2 | 校驗 |
3.RS-3-2-1024k目錄的副本放置情況爲:
[root@ip-172-31-6-83 shell]# hdfs fsck /ec_RS-3-2-1024k/1211m.csv -files -blocks -locations
(可左右滑動)
原始文件只有1211MB,如果按照三副本策略,應該只有10個block(算上3副本爲30個block),但是我們根據上圖可以發現有4個block group,每個group有5個block,一共20個block。因爲糾刪碼策略是RS-3-2,所以在每個block group中,3個block是原始文件,2個block是校驗數據。block的具體分佈爲:
block group | block | 節點IP | 大小 | Rack | 類型 |
---|---|---|---|---|---|
0 | blk_-9223372036854775264 | 172.31.4.105 | 128MB | rack3 | 原始 |
blk_-9223372036854775263 | 172.31.13.166 | 128MB | rack3 | 原始 | |
blk_-9223372036854775262 | 172.31.12.114 | 128MB | rack2 | 原始 | |
blk_-9223372036854775261 | 172.31.9.113 | 128MB | rack4 | 校驗 | |
blk_-9223372036854775260 | 172.31.11.232 | 128MB | rack1 | 校驗 | |
group12略 | |||||
3 | blk_-9223372036854775216 | 172.31.13.166 | 20MB | rack3 | 原始 |
blk_-9223372036854775215 | 172.31.4.105 | 20MB | rack3 | 原始 | |
blk_-9223372036854775214 | 172.31.13.13 | 20MB | rack2 | 原始 | |
blk_-9223372036854775213 | 172.31.9.113 | 20MB | rack4 | 校驗 | |
blk_-9223372036854775212 | 172.31.1.163 | 20MB | rack1 | 校驗 |
4.RS-6-3-1024k目錄的副本放置情況爲:
[root@ip-172-31-6-83 shell]# hdfs fsck /ec_RS-6-3-1024k/1211m.csv -files -blocks -locations
(可左右滑動)
原始文件只有1211MB,如果按照三副本策略,應該只有10個block(算上3副本爲30個block),但是我們根據上圖可以發現有2個block group,每個group有9個block,一共18個block。因爲糾刪碼策略是RS-6-3,所以在每個block group中,6個block是原始文件,3個block是校驗數據。block的具體分佈爲:
block group | block | 節點IP | 大小 | Rack | 類型 |
---|---|---|---|---|---|
0 | blk_-9223372036854775200 | 172.31.12.114 | 128MB | rack2 | 原始 |
blk_-9223372036854775199 | 172.31.12.142 | 128MB | rack2 | 原始 | |
blk_-9223372036854775198 | 172.31.13.13 | 128MB | rack2 | 原始 | |
blk_-9223372036854775197 | 172.31.11.9 | 128MB | rack1 | 原始 | |
blk_-9223372036854775196 | 172.31.11.232 | 128MB | rack1 | 原始 | |
blk_-9223372036854775195 | 172.31.1.163 | 128MB | rack1 | 原始 | |
blk_-9223372036854775194 | 172.31.13.166 | 128MB | rack3 | 校驗 | |
blk_-9223372036854775193 | 172.31.4.105 | 128MB | rack3 | 校驗 | |
blk_-9223372036854775192 | 172.31.9.113 | 128MB | rack4 | 校驗 | |
1 | blk_-9223372036854775184 | 172.31.9.113 | 74MB | rack4 | 原始 |
blk_-9223372036854775183 | 172.31.1.163 | 74MB | rack1 | 原始 | |
blk_-9223372036854775182 | 172.31.11.9 | 74MB | rack1 | 原始 | |
blk_-9223372036854775181 | 172.31.12.142 | 74MB | rack2 | 原始 | |
blk_-9223372036854775180 | 172.31.13.13 | 74MB | rack2 | 原始 | |
blk_-9223372036854775179 | 172.31.12.114 | 74MB | rack2 | 原始 | |
blk_-9223372036854775178 | 172.31.13.166 | 74MB | rack3 | 校驗 | |
blk_-9223372036854775177 | 172.31.13.38 | 74MB | rack3 | 校驗 | |
blk_-9223372036854775176 | 172.31.4.105 | 74MB | rack3 | 校驗 |
5.三副本目錄的副本放置情況爲:
hdfs fsck /no_ec/1211m.csv -files -blocks -locations
(可左右滑動)
block分佈情況如下表所示:
block | 節點IP | 大小 | Rack | 類型 |
---|---|---|---|---|
blk_1073753812 | 172.31.12.114, 172.31.12.142, 172.31.11.232 | 128MB | rack2,rack2,rack1 | 原始 |
blk_1073753813,blk_1073753814,blk_1073753815,blk_1073753816,blk_1073753817,blk_1073753818,blk_1073753819,blk_1073753820略 | ||||
blk_1073753821 | 172.31.1.163, 172.31.11.232, 172.31.13.166 | 60MB | rack1,rack1,rack3 | 原始 |
4
總結
以下數據基於CDH6.0.0的HDFS默認block size爲128MB,是對本文第三節的一個彙總。
1.三副本方式的每個block的副本放置策略與Hadoop2(CDH5.x)之前一致,即第一個副本在一個加價,第二個和第三個副本在另外的機架。
2.對於小文件比如本文測試環境的100MB,200MB,使用條帶寬度比較大的糾刪碼策略RS (6,3)最終保存的block數會比三副本方式還多,比如100MB和200MB的文件對於RS (6,3)均爲9個block,而三副本方式則分別爲3個和6個,在這種情況下,使用糾刪碼會帶NameNode帶來小文件過多的壓力,而當文件較大如本文測試所使用過的1211MB的文件,RS (6,3)爲18個block,而三副本方式則爲30個,大大減少了block的數量。所以放置集羣中block數過多,不建議對小文件使用糾刪碼策略,或者對小文件則使用條帶寬度較小的糾刪碼策略比如XOR(2,1)。Hadoop小文件問題參考Fayson之前的文章《如何在Hadoop中處理小文件》,《如何使用Impala合併小文件》和《如何在Hadoop中處理小文件-續》。
3.使用糾刪碼後,對集羣的CPU和網絡資源要求會更高。
4.編碼和解碼在HDFS客戶端和DataNode都會消耗額外的CPU。
5.糾刪碼要求集羣中的數據節點數最少與EC條帶寬度相同。比如RS (6,3),意味着至少需要9個DataNode,否則糾刪碼策略也無法應用成功,可以參考Fayson之前的文章《如何在CDH6.0中使用糾刪碼》。
6.糾刪碼文件包括原始數據文件和校驗數據會分佈在各個機架中,以實現機架容錯(rack fault-tolerance)。這意味着在讀取和寫入條帶文件時,大多數操作都需要跨機架訪問。所以對分帶寬(bisection bandwidth)非常重要。
7.對於機架容錯,機架的個數最好與EC條帶寬度一致,比如RS(6,3),你最少需要9個機架,理想情況下10個以上會更好,以預防意外停機。如果機架個數少於條帶寬度,HDFS無法保證機架容錯,但會盡量將條帶文件存儲在儘可能多的節點上以保證節點級別的容錯。參考本文第三章節,Fayson本次測試的無論是100MB,200MB,300MB還是1211MB文件,糾刪碼的每一個block group裏的每個block都儘可能分佈在不同的機架上,然後每個block必然是在不同的節點上。你若有興趣仔細分析上面的4個Excel表格也可以看出來。
8.假設你的集羣跨9個機架,則RS-10-4-1024k策略無法保證機架容錯,建議你選擇RS-6-3-1024k或RS-3-2-1024k可能更合適。如果管理員只關心節點級別容錯,則你的集羣只要有14個DataNode,則依舊可以選用RS-10-4-1024k。
參考:
https://hadoop.apache.org/docs/r3.1.1/hadoop-project-dist/hadoop-hdfs/HDFSErasureCoding.html
5
附錄:如何根據文件大小以及糾刪碼策略計算block group數量以及每個block的大小
假設HDFS的block size爲128MB,文件大小爲filesize(單位爲MB),糾刪碼策略爲RS(a,b),以下分幾種情況進行說明:
1.如果filesize小於等於默認條帶cell大小1MB,則不管你的糾刪碼策略a或b的值爲多少,原始數據block只有1個,校驗數據block則還是b個。這一點你依舊可以參考Fayson之前的文章《如何在CDH6.0中使用糾刪碼》,裏面有舉例使用一個幾KB的文件進行測試驗證。
2.如果1MB<filesize<a*1MB,block group只有一個,這個block group裏的block個數和大小參考以下公式:
#基於糾刪碼的策略R(a,b),在不同文件大小計算的情況下切分的Block數量 cellsize = 1MB; #糾刪碼底層定義每個Cell的默認大小 0 < filesize <= (a * cellsize) 的情況下Block數量及每個Block大小計算方式: #拆分的block梳理 blockcount = Math.ceil(filesize/cellsize), Math.ceil()爲向上取捨(如1.2取捨後爲2) #前blockcount-1個block,每個block的大小 block_file_size[1...(n-1)] = cellsize #最後一個block的大小 block_file_size[n] = filesize - (blockcount-1) * cellsize
(可左右滑動)
舉1個栗子幫助理解:
- 假設filesize=1.5MB,糾刪碼策略爲XOR(2,1),則block group只有一個,這個block group裏會有2個原始數據block,每個block的大小爲1MB,0.5MB,1個校驗數據block,每個block的大小也爲1MB。
3.如果a*1MB<=filesize<=a*128MB,block group只有一個,這個block group裏會有a個原始數據block,每個block的大小爲filesize/a,b個校驗數據block,每個block的大小也爲filesize/a,注意這裏每個block的大小其實已經違背了三副本方式默認block size的128MB的方式(即儘量會按照128MB拆分),糾刪碼的方式會先保證有足夠的原始數據block數,採用的是均分的方式。
舉幾個栗子幫助理解:
- 假設filesize=2.5MB,糾刪碼策略爲XOR(2,1),則block group只有一個,這個block group裏會有2個原始數據block,每個block的大小爲2.5MB/2=1.25MB,1個校驗數據block,每個block的大小也爲1.25MB。
- 假設filesize=2.5MB,糾刪碼策略爲RS(6,3),則block group只有一個,這個block group裏會有3個原始數據block,每個block的大小爲1MB,1MB,0.5MB(因爲2.5MB/6小於1MB,所以會以cell size進行拆分),1個校驗數據block,每個block的大小也爲1MB。
- 假設filesize=100MB,即本文測試的場景之一,糾刪碼策略爲XOR(2,1),則block group只有一個,這個block group裏會有2個原始數據block,每個block的大小爲100MB/2=50MB,1個校驗數據block,每個block的大小也爲50MB。具體參考第三章。
- 假設filesize=100MB,即本文測試的場景之一,如果糾刪碼策略RS(6,3),則block group只有一個,這個block group裏會有6個原始數據block,每個block的大小爲100MB/6=17MB,3個校驗數據block,每個block的大小也爲17MB。具體參考第三章。
- 假設filesize=200MB,即本文測試的場景之一,糾刪碼策略爲XOR(2,1),則block group只有一個,這個block group裏會有2個原始數據block,每個block的大小爲200MB/2=100MB,1個校驗數據block,每個block的大小也爲100MB。如果糾刪碼策略RS(6,3),則block group只有一個,這個block group裏會有6個原始數據block,每個block的大小爲200MB/6=34MB,3個校驗數據block,每個block的大小也爲34MB。具體參考第三章。
4.如果filesize>a*128MB,block group有n=filesize/(a*128MB)個(n的值向上取捨)。前n-1個block group每個group都會有a個原始數據block,每個block的大小爲128MB,b個校驗數據block,每個block的大小爲128MB。最後第n個block group裏的原始數據block會稍微複雜,具體多少個或多大又會進入前面1,2,3情況的判斷。
舉幾個栗子幫助理解:
- 假設filesize=300MB,即本文測試的場景之一,糾刪碼策略爲XOR(2,1),則block group有2個,第一個block group裏會有2個原始數據block,每個block的大小爲128MB,1個校驗數據block,每個block的大小也爲128MB。第二個block group裏會有2個原始數據block,每個block的大小爲22MB,1個校驗數據block,每個block的大小也爲22MB。如果糾刪碼策略RS(6,3),則block group只有一個,這個block group裏會有6個原始數據block,每個block的大小爲300MB/6=50MB,3個校驗數據block,每個block的大小也爲50MB。具體參考第三章。
- 假設filesize=257MB,即本文測試的場景之一,糾刪碼策略爲XOR(2,1),則block group有2個,第一個block group裏會有2個原始數據block,每個block的大小爲128MB,1個校驗數據block,每個block的大小也爲128MB。第二個block group裏會有1個原始數據block,block的大小爲1MB,1個校驗數據block,block的大小也爲1MB。如果糾刪碼策略RS(6,3),則block group只有一個,這個block group裏會有6個原始數據block,每個block的大小爲257MB/6=43MB,3個校驗數據block,每個block的大小也爲43M。
備註:對於上面1,2,3三種情況,都只有一個block group,也可以簡單點以Java語言的方式表示:
#基於糾刪碼的策略R(a,b),在不同文件大小計算的情況下切分的Block數量 cellsize = 1MB; #糾刪碼底層定義每個Cell的默認大小 0 < filesize <= (a * cellsize) 的情況下Block數量及每個Block大小計算方式: #拆分的block梳理 blockcount = Math.ceil(filesize/cellsize), Math.ceil()爲向上取捨(如1.2取捨後爲2) #前blockcount-1個block,每個block的大小 block_file_size[1...(n-1)] = cellsize #最後一個block的大小 block_file_size[n] = filesize - (blockcount-1) * cellsize a * cellsize < filesize < a * 128MB 的情況下Block數量及每個Block大小計算方式: #拆分的block數量即爲糾刪碼策略的a blockcount = a #每個block文件的大小平均分配 block_file_size = filesize / a
(可左右滑動)
提示:代碼塊部分可以左右滑動查看噢
爲天地立心,爲生民立命,爲往聖繼絕學,爲萬世開太平。 溫馨提示:如果使用電腦查看圖片不清晰,可以使用手機打開文章單擊文中的圖片放大查看高清原圖。