螞蟻絆倒大象,不起眼的小文件竟拖了Hadoop大數(shù)據(jù)的后

我是創(chuàng)始人李巖:很抱歉!給自己產(chǎn)品做個廣告,點擊進(jìn)來看看。  

HDFS作為Hadoop生態(tài)系統(tǒng)的分布式文件系統(tǒng),它被設(shè)計用來存儲海量數(shù)據(jù),特別是TB、PB量級別的數(shù)據(jù)。它的設(shè)計的初衷也是存儲大文件,而如果HDFS上存在大量的小文件,會對系統(tǒng)性能帶來嚴(yán)重的問題。本文想跟大家聊下小文件的處理。

本文的小文件是指那些大小比HDFS的block (Hadoop 2.x的默認(rèn)大小128MB)小的多的文件。在HDFS中,文件元信息,例如位置、大小、分塊信息等這些存儲在Namenode的內(nèi)存中,每一個object占用150 bytes的內(nèi)存。文件個數(shù)越多相應(yīng)的也會占用Namenode更多的內(nèi)存。何況HDFS主要是為了流式的訪問大文件而設(shè)計的,讀取眾多的小文件顯然也是非常低效的。

▌Hadoop小文件的3類常見情況的處理

1、HDFS中存儲包含了大量小文件

現(xiàn)象:在HDFS上已經(jīng)存在了大量的小文件和目錄。

方案:通過調(diào)用HDFS的sync()方法和append()方法,將小文件和目錄每隔一定時間生成一個大文件,或者可以通過寫程序來合并這些小文件。

2、MapReduce的輸入包含大量小文件

現(xiàn)象:輸入文件中存在大量的小文件

MapReduce程序的Map任務(wù)(task)一次可以處理一個塊(block)大小的輸入數(shù)據(jù)(默認(rèn)使用FileInputFormat)。如果一個輸入文件的大小大于block,那么會拆成兩個或多個task進(jìn)行處理;如果小于block,也會用一個task處理該文件。需要處理的數(shù)據(jù)如果分散存儲在許多小文件中,就會產(chǎn)生大量的map task,如果小文件個數(shù)非常多,這會使處理時間變的很慢。

方案:有3種

1)Hadoop Archive:

Hadoop Archive是一個高效地將小文件放入HDFS塊中的文件存檔工具,它能夠?qū)⒃S多小文件打包成一個HAR文件,這樣會同時減少Namenode的內(nèi)存使用。

2)Sequence File:

Sequence File由一系列的二進(jìn)制key/value組成,如果key為小文件名,value為文件內(nèi)容,則可以將大批小文件合并成一個大文件。

1)和2)這里不做介紹,可以參考 ??

http://blog.cloudera.com/blog/2009/02/the-small-files-problem

3)CombineFileInputFormat:

Hadoop有一個專門的類CombineFileInputFormat?來處理小文件,它根據(jù)一定的規(guī)則,將HDFS上多個小文件合并到一個InputSplit中,同時啟動適量的Map來處理這里面的文件,以減少MR整體作業(yè)的運行時間。CombineFileInputFormat類繼承FileInputFormat,主要重寫了ListgetSplits(JobContext var1)方法,我們可以設(shè)置mapreduce.input.fileinputformat.split.minsize.per.node、mapreduce.input.fileinputformat.split.minsize.per.rack和mapreduce.input.fileinputformat.split.maxsize?參數(shù)的設(shè)置來合并小文件。其中mapreduce.input.fileinputformat.split.maxsize參數(shù)至關(guān)重要,如果沒有設(shè)置這個參數(shù)(默認(rèn)沒設(shè)置),那么同一個機(jī)架上的所有小文件將組成一個InputSplit,最終由一個Map Task來處理。如果設(shè)置了這個參數(shù),那么同一個節(jié)點(node)上的文件將會組成一個InputSplit。

InputSplit包含的HDFS塊信息存儲在CombineFileSplit?類中。該類包含了每個塊文件的路徑、起始偏移量、相對于原始偏移量的大小和這個文件的存儲節(jié)點。CombineTextInputFormat告訴MR程序如何讀取組合的InputSplit,具體如何解析CombineFileSplit中的文件主要在CombineFileRecordReader中實現(xiàn)。該類封裝了TextInputFormat的RecordReader,并對CombineFileSplit中的多個文件循環(huán)遍歷并讀取其中的內(nèi)容。

樣例代碼如下: 螞蟻絆倒大象,不起眼的小文件竟拖了Hadoop大數(shù)據(jù)的后 日志輸出:
可以從日志中很清楚的看出input文件數(shù)為Total input paths to process : 152,通過CombineFileInputFormat處理后splits為mapreduce.JobSubmitter: number of splits:1,map數(shù)為Launched map tasks=1??梢孕薷膍apreduce.input.fileinputformat.split.maxsize參數(shù),觀察Map Task的個數(shù)變化。

3、Hive小文件問題

現(xiàn)象1:?hive輸入的文件過多

方案:設(shè)置mapper?輸入文件合并參數(shù)

螞蟻絆倒大象,不起眼的小文件竟拖了Hadoop大數(shù)據(jù)的后

現(xiàn)象2:hive執(zhí)行中間過程生成的文件過多

方案:設(shè)置中間過程合并參數(shù),盡量避免小文件 螞蟻絆倒大象,不起眼的小文件竟拖了Hadoop大數(shù)據(jù)的后

現(xiàn)象3:hive輸出結(jié)果生成的文件過多

方案:一種是調(diào)整reducer個數(shù),另一種是調(diào)整reducer大小 螞蟻絆倒大象,不起眼的小文件竟拖了Hadoop大數(shù)據(jù)的后

/ 參考文章 /

1、https://hadoop.apache.org/docs/r2.7.1/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html

2、https://cwiki.apache.org/confluence/display/Hive/Configuration+Properties

3、http://blog.cloudera.com/blog/2009/02/the-small-files-problem/

隨意打賞

大數(shù)據(jù)展示大數(shù)據(jù)采集
提交建議
微信掃一掃,分享給好友吧。
国产成人久久精品| 国产精品免费久久久久久久久| 亚洲伊人精品综合在合线| 久久九九精品国产av片国产| 91麻豆精品视频| 精品伦精品一区二区三区视频| 日本精品视频一区二区三区| 亚洲欧美精品午睡沙发| 国产精品入口麻豆免费观看| 久久久久精品国产亚洲AV无码| 日韩精品亚洲人成在线观看| 亚洲精品成人av在线| 日韩精品国产另类专区| 99久久人妻精品免费一区| 色欲精品国产一区二区三区AV | 亚洲精品国产国语| 亚洲av午夜精品无码专区| 亚洲国产精品成人久久久| 91大神精品视频| 精品人妻系列无码一区二区三区| 91精品国产高清| 精品女同一区二区三区免费站| 91在线手机精品免费观看| 亚洲精品国产专区91在线| 久クク成人精品中文字幕| 国产精品久久久久久福利69堂| 国产精品亚洲综合五月天| 99视频30精品视频在线观看| 欧美激情国产精品视频一区二区 | 日韩精品在线视频| 亚洲国产精品va在线播放| 久久99青青精品免费观看| 久久精品无码午夜福利理论片 | 精品综合一区二区三区| 一本一道久久a久久精品综合 | 中文字幕一区二区精品区| 亚洲精品福利网站| 中文字幕乱码亚洲精品一区| 日本一区二区三区精品视频| 男女男精品视频网站在线观看| 国产精品亚洲玖玖玖在线观看 |