hadoop文件格式和壓縮算法

關(guān)鍵詞: 文件格式 壓縮效率 文件可分片

需要考慮的因素

文件格式對存儲空間利用率, 程序性能都有很大的影響. 具體表現(xiàn)在:

  • 文件和壓縮算法的組合是否支持可分片, MapReduce在讀取數(shù)據(jù)的時候需要并行, 這就要求壓縮后的文件可以分片讀取.

在考慮如何壓縮那些將由MapReduce處理的數(shù)據(jù)時岛抄,考慮壓縮格式是否支持分割是很重要的竣况《绕考慮存儲在HDFS中的未壓縮的文件扰柠,其大小為1GB抗悍,HDFS的塊大小為64MB桑李,所以該文件將被存儲為16塊嘲叔,將此文件用作輸入的MapReduce作業(yè)會創(chuàng)建1個輸人分片(split姐扮,也稱為“分塊”。對于block子巾,我們統(tǒng)一稱為“塊”帆赢。)每個分片都被作為一個獨立map任務(wù)的輸入單獨進行處理。

  • io讀取性能, 讀取相同信息量的信息, 壓縮后的文件不僅占用的存儲空間低, 而且還會提高磁盤io的讀取效率. 提高程序的運行速度
  • CPU資源也是啟用何種壓縮算法不得不考慮的因素, 一般來說壓縮效率越高的算法對io效率和存儲利用率的提升越有促進作用, 但另一方面也會更高的消耗CPU資源. 所以我們需要在這中間尋求一個平衡點.
  • 共通性, 文件格式是否支持多種語言, 服務(wù)的讀取. 比如Hadoop主要的序列化格式為Writables, 但是Writables只支持Java, 所以后面衍生出了Avro, Thrift等格式. 還如OrcFile是對Hive設(shè)計的一種列式存儲格式, 但是他不支持Impala, 數(shù)據(jù)的共用性受到了制約.
  • 錯誤處理能力, 有的文件的某一部分壞掉之后會影響整個表, 有的只會影響其后的數(shù)據(jù), 有的只會影響壞掉數(shù)據(jù)塊本身(Avro).
  • 讀取和載入效率, RCFile的載入速度慢, 但是查詢相應(yīng)速度快, 相對更適合數(shù)據(jù)倉庫一次插入多次讀取的特性.

文件格式

hadoop存儲上沒有既定的標(biāo)準(zhǔn)文件格式和壓縮算法, 它和標(biāo)準(zhǔn)文件系統(tǒng)相同, 可以存儲各種各樣類型的文件, 也支持多種壓縮算法. 使用什么格式和壓縮算法的主動權(quán)在使用者手里. 我們可以根據(jù)具體需求來權(quán)衡使用哪種組合.

標(biāo)準(zhǔn)文件格式

標(biāo)準(zhǔn)文件格式可以分為文本文件(如 CSV, XML, JSON 等)和二進制文件(圖像, 視頻等).

文本數(shù)據(jù)格式

txt, csv等純文本格式是很常見的, 比如日志的存儲和分析. 一般來說, 在大多數(shù)場景中, 使用容器格式(如SequenceFile, Avro)都會帶來很多好處. 后面會介紹容器格式. 文本數(shù)據(jù)有一些不可避免的缺點:

  • 存儲空間利用率低
  • 會有額外的序列化反序列化開銷: 比如1234存儲在文件中是字符串的形式, 轉(zhuǎn)入程序中又是數(shù)字型的話讀取和寫入都會有額外的不必要的性能開銷, 數(shù)量大的話性能影響就會更加顯著.

結(jié)構(gòu)化文本格式

我們常見的json, xml格式就屬于此類, 他們很難分片, 且沒有hadoop內(nèi)置提供的InputFormat. 使用他們的時候, 一般用第三方的提供的InputFormat, 或者是將數(shù)據(jù)轉(zhuǎn)化成Avro格式的數(shù)據(jù)再進行處理.

二進制數(shù)據(jù)

雖然Hadoop中存儲的大多都是文本, 但是我們也可以存儲圖像等二進制文件. 對于大多數(shù)應(yīng)用場景來說使用SequenceFile等容器格式都是很適用的.

Hadoop文件類型

為了配合MapReduce, 開發(fā)一些專門格式. 基于文件的SequenceFile, 序列化的Avro和列式存儲的RCFile和Parquet. 上面的這些雖然各有不同, 但是有些重要的特性是共有的, 這對MapReduce任務(wù)來說至關(guān)重要. 這些文件都支持通用的壓縮算法, 也支持分片.

基于文件的SequenceFile

以二進制鍵值對的形式存儲數(shù)據(jù), 支持三種記錄存儲方式.

  • 無壓縮, io效率較差. 相比壓縮, 不壓縮的情況下沒有什么優(yōu)勢.
  • 記錄級壓縮, 對每條記錄都壓縮. 這種壓縮效率比較一般.
  • 塊級壓縮, 這里的塊不同于hdfs中的塊的概念. 這種方式會將達(dá)到指定塊大小的二進制數(shù)據(jù)壓縮為一個塊. 相對記錄級壓縮, 塊級壓縮擁有更高的壓縮效率. 一般來說使用SequenceFile都會使用塊級壓縮.
    但是SequenceFile只支持Java, SequenceFile一般用來作為小文件的容器使用, 防止小文件占用過多的NameNode內(nèi)存空間來存儲其在DataNode位置的元數(shù)據(jù).

序列化存儲格式

序列化指的是數(shù)據(jù)格式轉(zhuǎn)化為字節(jié)流的過程, 主要用于遠(yuǎn)程傳輸或存儲. hadoop采用的序列化格式主要是Writables. 但是它只能支持Java語言, 所以后來就出現(xiàn)了Thrift, Avro等格式.

Thrift

Facebook開發(fā)的框架, 用于實現(xiàn)跨語言提供服務(wù)和接口, 滿足跨平臺通信. 但是Thrift不支持分片, 且缺少MapReduce的原生支持.

Avro

Avro是一個語言無關(guān)的數(shù)據(jù)序列化的系統(tǒng), 它的出現(xiàn)主要是為了解決Writables缺少跨語言移植的缺陷. Avro將模式存儲在文件頭中, 所以每個文件都是自描述的, 而且Avro還支持模式演進(schema evolution), 也就是說, 讀取文件的模式不需要與寫入文件的模式嚴(yán)格匹配, 當(dāng)有新需求時, 可以在模式中加入新的字段.

  • Avro支持分片, 即使是進行Gzip壓縮之后.
  • 支持跨語言的支持

列級存儲

https://www.iteblog.com/archives/1014.html

邏輯表, 行式存儲和列式存儲.png

ORCFile

ORCFile 可以理解為 Optimized RCFile, 就是RCFile的優(yōu)化版. 尤其是彌補了查詢和存儲效率方面的缺陷. 它同樣不喜歡小文件. 特性如下:

  • 支持所有的hive類型, 包括復(fù)合類型: structs, lists, maps 和 unions.
  • 支持分片
  • 可以僅返回查詢的列, 減少io消耗, 提升性能.
  • 可以與Zlib, LZO和Snappy結(jié)合進一步壓縮.
  • 不支持其他的查詢引擎, 比如impala.
  • 內(nèi)件索引: 其存儲了

壓縮

Snappy

Google開發(fā)的一種壓縮編解碼器, 用于實現(xiàn)高速壓縮, 適當(dāng)兼顧壓縮率, 平衡了壓縮速率和文件大小. 但是有一點, Snappy是不支持分片的, 所以它需要和容器格式相互聯(lián)合使用(如SequenceFile和Avro).

LZO

壓縮率和速度與Snappy相近, 由于許可協(xié)議的原因, LZO不能打包進hadoop中進行分發(fā), 需要單獨安裝. Snappy可以與Hadoop打包分發(fā). 它可以支持分割, 但是要求建立索引.

Gzip

壓縮速率非常好, 平均可以達(dá)到Snappy的2.5倍. 但是相應(yīng)的, 寫入相對較Snappy慢了一倍. Gzip同樣也是不支持分片的, 所以應(yīng)該與容器格式聯(lián)合使用. Gzip更適合將數(shù)據(jù)進行歸檔.

bzip2

壓縮性能比Gzip還要高9%, 但是要消耗更多的讀取, 寫入性能. 一般來說bzip2要比Gzip慢十倍. 所以bzip2應(yīng)該不是hadoop集群上理想的編解碼格式, 除非需求以為了減少空間占用為主. 比如將數(shù)據(jù)進行歸檔, 但是使用的時候也要考慮資源的消耗. 另外的, bzip2是支持?jǐn)?shù)據(jù)分割的.

幾種壓縮算法的簡單對比

壓縮方式 壓縮效率 壓縮速度 是否可分割
Gzip 中高
bzip2
Snappy
LZO 是(但是要求建立索引)
Zlib

Hive數(shù)據(jù)格式和壓縮

textfile, sequencefile, rcfile, orc

Snappy與Zlib的對比

Execution Time in Sec.png

Disk Usage Comparison:


Disk Usage Comparison.png

Hive列式存儲ORC和行式存儲Text

如果經(jīng)常會對存儲的數(shù)據(jù)進行少量列的聚合查詢, 那么使用列式存儲會降低在查詢時所需的磁盤空間, 減少I/O消耗, 更快的得到查詢結(jié)果. 這篇文章里面測試的是列式存儲格式ORC相對行式存儲Text, 在大量列中查詢聚合少量列的情況下的性能提升情況.

  • 原始測試數(shù)據(jù)為2200萬條頁面點擊記錄.
  • 每行有40列
  • 數(shù)據(jù)文件沒有壓縮
  • 使用ORC格式時, 減少了52%的空間.


    image.png
  • 減少了97%的I/O消耗


    image.png

    image.png
  • 提升了21%的查詢時間


    image.png
  • 聚合結(jié)果如下:


    image.png
  • 相對基于Text文件的大量文件的聚合查詢, 使用ORC文件格式并不總是總是顯著的減少內(nèi)存和CPU的消耗. 事實上, 使用ORC文件可能會引起更多的內(nèi)存占用, 你可以通過使用壓縮(例如Zlib或Snappy)來優(yōu)化, 然而, 壓縮和解壓縮會增加CPU的使用時間.

配置

#影響非托管表的建表語句:
hive.default.fileformat=[textfile, sequencefile, rcfile, orc]
#影響托管表的建表語句, 如果不填則繼承hive.default.fileformat的值.
hive.default.fileformat.managed=[textfile, sequencefile, rcfile, orc]

以O(shè)RC文件為例

格式可以指定到表級/分區(qū)級, 你可以通過形如下面的HiveQL語句指定ORCFile格式:

  • CREATE TABLE ... STORED AS ORC
  • ALTER TABLE ... [PARTITION partition_spec] SET FILEFORMAT ORC
  • SET hive.default.fileformat=Orc

參考:
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+ORC
《hadoop應(yīng)用架構(gòu)》
ORC with Zlib vs ORC with No Compression[大的數(shù)據(jù)更適合使用壓縮]
Performance Comparison b/w ORC SNAPPY and ZLib in hive/ORC files
Hive & Parquet
ORC Creation Best Practices
https://orc.apache.org/docs/indexes.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末线梗,一起剝皮案震驚了整個濱河市椰于,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌仪搔,老刑警劉巖瘾婿,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異烤咧,居然都是意外死亡偏陪,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門煮嫌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來笛谦,“玉大人,你說我怎么就攤上這事立膛【竞保” “怎么了梯码?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長好啰。 經(jīng)常有香客問我轩娶,道長,這世上最難降的妖魔是什么框往? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任鳄抒,我火速辦了婚禮,結(jié)果婚禮上椰弊,老公的妹妹穿的比我還像新娘许溅。我一直安慰自己,他們只是感情好秉版,可當(dāng)我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布贤重。 她就那樣靜靜地躺著,像睡著了一般清焕。 火紅的嫁衣襯著肌膚如雪并蝗。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天秸妥,我揣著相機與錄音滚停,去河邊找鬼。 笑死粥惧,一個胖子當(dāng)著我的面吹牛键畴,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播突雪,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼起惕,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了挂签?” 一聲冷哼從身側(cè)響起疤祭,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤盼产,失蹤者是張志新(化名)和其女友劉穎饵婆,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體戏售,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡侨核,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了灌灾。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片搓译。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖锋喜,靈堂內(nèi)的尸體忽然破棺而出些己,到底是詐尸還是另有隱情豌鸡,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布段标,位于F島的核電站涯冠,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏逼庞。R本人自食惡果不足惜蛇更,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望赛糟。 院中可真熱鬧派任,春花似錦、人聲如沸璧南。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽司倚。三九已至颤诀,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間对湃,已是汗流浹背崖叫。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留拍柒,地道東北人心傀。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像拆讯,于是被迫代替她去往敵國和親脂男。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容