需求是把mongodb里的數(shù)據(jù)條目存入hdfs,用于離線統(tǒng)計(jì)分析。mongodump導(dǎo)出的文件格式為bson猴娩,每條記錄前用4字節(jié)來表示該記錄的長度抠藕,這是比較典型的非定長條目的文件存儲格式饿肺,優(yōu)點(diǎn)是簡單。由于只能從文件開始處一路讀下去才能理解整個文件盾似,所以當(dāng)給定部分文件內(nèi)容時敬辣,是沒法理解文件內(nèi)容的,這對mapreduce的分割很不友好零院。mongodb官方提供的方案溉跃,是對bson文件預(yù)處理一遍,生成split文件告抄,mapdeduce任務(wù)根據(jù)split文件進(jìn)行分割撰茎。但有如下缺點(diǎn):
- 初次使用時,需要生成split文件打洼,耗時較長
- hadoop生態(tài)鏈如hive pig龄糊,對bson支持不夠
調(diào)研了下avro格式,其文件組織方式如下:
相比于bson的文件格式拟蜻,最重要變化是多了個sync marker字段绎签,這是個邊界符,意義等同于TextInputFormat里的換行符酝锅,這樣就可以對文件正常進(jìn)行分割了诡必,讀取時從本區(qū)間第一個sync marker后開始讀,為了保證所有記錄讀且被讀了一次搔扁,讀到區(qū)間尾時爸舒,應(yīng)該繼續(xù)讀下去,直到讀完該block稿蹲。avro是有范式的扭勉,bson是無范式的,倘若能把mongodb里的數(shù)據(jù)以一定范式表達(dá)出來苛聘,avro只需要在文件頭儲存格式信息就可以了涂炎,而bson的每條記錄都必須存儲字段信息忠聚,這樣能節(jié)省大概百分20的空間。使用avro的成本是bson到avro的格式轉(zhuǎn)換唱捣,實(shí)踐下來两蟀,單cpu能達(dá)到30M/S,還是能接受的范圍震缭。