Erasure coding in HDFS
????EC可以通俗的這樣理解(并不準確,只是方便理解):傳統(tǒng)的 HDFS Replication像RAID 0,數(shù)據(jù)被簡單的復(fù)制多份途乃;而EC像RAID5,采用數(shù)據(jù)+校驗碼的方式來確倍视可靠性盼铁。
EC的優(yōu)點
1.更節(jié)省存儲空間:RS(6+3)只需要1.5倍的磁盤空間就可以獲得相同的可靠性悄晃,相比傳統(tǒng)的Replication 3節(jié)省50%存儲空間凤价,刽虹;
2.并發(fā)讀寫多個DataNode酗捌,尤其對小文件的訪問更快;
3.數(shù)據(jù)直接一次性寫入(Replication是先寫入一個DataNode涌哲,再異步復(fù)制到其它DataNode中)胖缤;
EC缺點
1.數(shù)據(jù)恢復(fù)需要耗費更多的CPU、內(nèi)存和IO阀圾,也更耗時(想象一下RAID5磁盤壞掉后的恢復(fù)過程……)哪廓;
2.不(Wu)再(Fa)支持就近讀取的策略了(Hadoop:現(xiàn)在動不動就萬兆網(wǎng),就近沒那么重要了吧初烘?)
總結(jié)
????小于1 block(默認128M)的小文件多涡真,磁盤空間緊張,適合用EC肾筐;大文件多適合用Replication哆料。由于EC和Replication都是基于HDFS block的,所以它們并不沖突吗铐。Hadoop支持在同一個HDFS Cluster中對不同的文件或目錄指定不同的存儲策略东亦。
EC是如何解決數(shù)據(jù)可靠性的問題呢?
????EC本身就是糾偏碼的縮寫唬渗,糾刪碼技術(shù)主要將原始的數(shù)據(jù)進行編碼得到校驗典阵,并將數(shù)據(jù)和校驗一并存儲起來奋渔,以達到容錯的目的。其基本思想是將k塊原始的數(shù)據(jù)元素通過一定的編碼計算壮啊,得到m塊校驗元素嫉鲸。對于這k+m塊元素,當其中任意的m塊元素出錯(包括數(shù)據(jù)和校驗出錯)歹啼,均可以通過對應(yīng)的重構(gòu)算法恢復(fù)出原來的k塊數(shù)據(jù)充坑。Hadoop EC采用一種叫做RS(Reed-Solomon encoding)的糾偏碼,這種編碼方式之前廣泛用于通信數(shù)據(jù)傳輸中染突。一般采用6個數(shù)據(jù)單元+3個校驗單元捻爷,記為RS(6,3)。
EC數(shù)據(jù)存儲方式:
????HDFS存儲數(shù)據(jù)的最小物理單元是block份企,默認的block size是128M也榄。傳統(tǒng)的順序存儲方式是:將文件順序?qū)懭攵鄠€block中。
????例如司志,一個768M的文件甜紫,將被順序?qū)懭?個128M的block中,然后每個block再被異步復(fù)制2個副本到其它DataNode中:
????EC采用叫做文件存儲的最小物理單元依然是block骂远,但是在block基礎(chǔ)上增加了strip和cell的邏輯單元囚霸,其中cell就是RS碼中的"單元"。6個數(shù)據(jù)單元(也就是6個cell)+3個校驗單元構(gòu)成一個條(strip)激才。
????例如拓型,同樣一個768M的文件將被分為768個1M大小的邏輯單元cell,每6個cell做RS encoding瘸恼,生成3個校驗cell劣挫,這樣9個cell構(gòu)成一個邏輯條(strip),然后依次循環(huán)將這些條寫入到block中东帅。
需要注意的是
1.client會直接并發(fā)讀寫這9個block所在的DataNode压固;
2.每個條(strip)中的cell必須分配到不同的block中。也就意味著靠闭,在RS(6,3)中即使文件再小帐我,也至少占用9個block;
參考
http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/HDFSErasureCoding.html
https://blog.cloudera.com/blog/2015/09/introduction-to-hdfs-erasure-coding-in-apache-hadoop/
最低支持Java8愧膀,不再支持Java7
YARN Timeline Service v.2(early preview,并不能用)
????相比v.1改進:
1.擴展性增強:讀寫存儲從單實例變?yōu)榉植际讲⑶覍⒆x寫分開拦键;
2.增加Flow的概念:我理解類似DAG(有向無環(huán)圖);
其他改進
重寫shell script扇调;
Shaded client jars:屏蔽client jar包矿咕,避免client jar與Application classpath中的jar沖突(怎么做到的?);
增加Opportunistic Containers:低優(yōu)先的container狼钮,即使沒有資源也可以提交碳柱,等待資源空閑下來執(zhí)行,主要目的是提高yarn集群利用率熬芜。
mapreduce性能優(yōu)化:增加了一個map output collector的本地實現(xiàn)莲镣,對于shuffle-intensive jobs可以提升30%以上的性能;
默認端口變更:為了避免和linux臨時端口范圍 (32768-61000)沖突涎拉,修改了部分默認端口號瑞侮;
增加Microsoft Azure Data Lake和阿里云OSS支持;
Intra-datanode balancer:解決DataNode內(nèi)部增減磁盤導(dǎo)致的數(shù)據(jù)傾斜問題鼓拧,我理解DataNode內(nèi)部rebalance不用整個集群rebalance了半火。
YARN 支持自定義擴展Resource Types,比如你可以定義GPU季俩、軟件licenses等資源钮糖;
HDFS Router-Based Federation增加了a RPC routing layer,多個子集群的超大型集群才用得上酌住,有時間再研究店归。
Capacity Scheduler queue增加讀寫Configuration的API;
S3Guard:用不到酪我,懶得看了消痛。