Ⅰ 澶ф暟鎹涓甯歌佹暟鎹瀛樺偍鏍煎紡涓庡帇緙╂牸寮
鍦ㄥぇ鏁版嵁鐨勪笘鐣岄噷錛屾暟鎹瀛樺偍鍜屽帇緙╂妧宸ф槸鑷沖叧閲嶈佺殑涓鐜銆傚畠浠涓嶄粎鍏充箮絀洪棿鏁堢巼錛屾洿鐩存帴褰卞搷鐫鏁版嵁澶勭悊鐨勯熷害鍜屾ц兘銆傝╂垜浠娣卞叆鎺㈣ㄥ嚑縐嶅父瑙佺殑鏁版嵁瀛樺偍鏍煎紡浠ュ強鍘嬬緝鎶鏈錛屼互婊¤凍澶氭牱鍖栫殑鏌ヨ㈤渶奼傚拰浼樺寲璧勬簮鍒╃敤銆棣栧厛錛岃╂垜浠鐪嬬湅鏁版嵁瀛樺偍鐨勪笁縐嶄富瑕佹ā寮忥細
涓轟簡鍏奸【涓嶅悓鏌ヨ㈡ц兘錛屾垜浠榪樺紩鍏ヤ簡娣峰悎瀛樺偍錛屽閥濡欒瀺鍚堜簡涓よ呯殑浼樺娍錛屼互閫傚簲鍚勭嶆煡璇㈤渶奼傘
Ⅱ Hadoop 壓縮從理論到實戰
在大數據領域,無論上層計算引擎採用的是什麼,在存儲過程中,壓縮都是一個避不開的問題。合適的壓縮選擇可以降低存儲成本、減少網路傳輸I/O。而錯誤的壓縮選擇則可能讓 cpu 負荷達到瓶頸、降低並發度等等,所以是否選擇壓縮、選擇什麼壓縮格式在大數據存儲環節中都是一個至關重要的問題。
點評:壓縮時間和壓縮率之間的取捨本質上是 cpu 資源和存儲資源的取捨。是否需冊猛要支持分片也不是絕對的,如果單個文件大小均小於 splitSize,則沒必要支持分片。
點評:一階段考慮盡可能支持分片(單個文件大於 splitSize 時)。二階段考慮盡可能快的壓悄姿基縮速度。三階段根據是作為長期歸檔(幾乎不用)or 作為下一作業輸入,考慮盡可能高的壓縮能力 or 支持分片。
點評:有兩點需要注意,第一點:這里的速度和壓縮率沒有具體測試數據,而是給出了一個模糊的表達。因為即使具體測試了速度和壓縮率,也會因數據不同而結果有很大的差異。後面會給出測試的腳本,大家可以結合自己的表數據自行測試。第二點:有些壓縮格式性能參數很相似,為什麼 Hadoop 中要搞這么多種?較為直觀的一個原因是:不同存儲格式支持的壓縮是不一樣的,比如 orc 存儲格式只支持 zlib 和 snappy 兩種壓縮 [8] ,parquet 雖然支持很多壓縮格式,但是不支持 bzip2 [7]
以下摘自《Hadoop The Definitive Guide》
重點閱讀文中加粗片段。大致意思是:因為 gzip 壓縮格式使用的 DEFLATE 壓縮演算法沒辦法做到隨機任意讀取,必須同步順序讀取。也就意味著沒辦法為每一個 block 創建一個分片(split),然後為該分片啟一個 mapper 去讀取數據。所以即使 gzip 文件有很多 block,MR 程序也只會啟動一個 Mapper 去讀取所有的 block。也即 gzip 這種壓縮格式不支持分片。相反的,如果壓縮格式使用的演算法支持隨機任意讀取,那麼就可以為每一個 block 創建一個分片,同時啟動一個 mapper 去讀取數據,這樣有多少個 block 就有多少個分片,就有多少個 mapper ,這些 mapper 並行讀取數據,效率大大提升。上述涉及到幾個小概念,接下來分別進行詳述。
一句話總結: zlib、gzip 在大數據語境中都是一種 壓縮格式 ,他們使用相同的 壓縮演算法: DEFLATE,DefaultCodec 是 zlib 使用的 編解碼器 ,Gzip 使用的編解碼器是 GzipCodec
我們知道,Hadoop 在任務切分時,是按照文件的粒度進行的。即一個文件一個文件啟謹進行切分。而每一個文件切分成幾塊,取決於 splitSize 的大小。比如兩個文件,第一個文件 300M,第二個文件150M。分片大小是128M,那麼對於第一個文件將會切分成3片(128M,128M,44M),第二個文件會切分成2片(128M,22M)。共計5片。所以分片數量除了由文件數決定,另一個決定因素就是 splitSize 即分片大小。
splitSize 如何計算?
幾個前提:
影響參數:
接下來進行實際驗證:
經過了 2.4.2 中的一系列實驗,驗證了一個結論:當一個輸入格式支持分片時,mapper 數量是無限制的,反之 mapper 數量小於等於文件的數量。所以我們可以通過設置參數來試圖調小分片大小來增加 mapper 數量看其上限是否等於文件數量即可。假如輸入的文件個數只有一個,那麼當 mapper 數量大於1的時候,說明該輸入格式是支持分片的。
大家可以根據自己數據集和想測試的壓縮和存儲格式自行修改腳本。通過以上腳本跑出來的結果如下:
由 2.1 中評價壓縮的三項指標可知,壓縮率、壓縮/解壓速度、是否支持分片是衡量壓縮最重要的三項指標。3.1.1小節中只對壓縮率進行了測試。壓縮/解壓速度可以通過跑一些查詢語句進一步測試。這里就不展開測試了。業界中常用的存儲格式一般是 parquet, orc,所以上面測試除了純文本只測試了這兩種存儲格式。
我們可以通過 hive> set io.compression.codecs; 來查看當前Hadoop集群支持的壓縮,在公司的集群中查詢得到的結果是:
可以看到 lzo 有兩種編解碼器: LzoCodec 和 LzopCodec。他們之間有什麼區別呢?
如果你閱讀過關於 Hadoop 壓縮的文章,應該可以看到,絕大多數文章中對於 snappy 是否支持分片都是直接給出的否定的答案。 CDH 的文檔中也指出來 snappy 是不支持分片的。
看文中加粗片段,雖然 snappy 本身是不支持分片的,但是如果 snappy 存儲在一些特定的存儲格式比如 SequenceFile 或者 Avro 中,那麼是可以支持分片的。也就是說 snappy 是否支持分片是分情況討論的。不能說使用了 snappy 壓縮就一定不支持分片。前面提到了,業界中常用的存儲格式一般是 parquet 或者 orc,而上面 CDH 的文章中恰恰沒有提到 parquet 和 orc 是否支持,接下來以 parquet 為例,進行測試。測試內容即為 parquet + snappy 組合,是否支持分片。
首先准備數據,因為之前做壓縮率測試,已經有了 parquet + snappy 文件了,這里直接拿來用。
一共3個輸入文件,啟了6個mapper,說明輸入文件是可以分片的。即 parquet + snappy 的組合是支持分片的。在《Hadoop The Definitive Guide》中也對 parquet 是否支持分片有說明:
以 maprece.output.fileoutputformat.compress.codec 為例,這個參數可以在三個地方配置:
那麼當三者都設置時,以哪個為准呢?按照經驗來看,一定是粒度小的優先順序大於粒度大的優先順序。經過測試也驗證了這種猜測。即:表級別 > hive > hadoop
初學者往往容易混淆存儲格式和壓縮格式之間的關系,其實二者是完全獨立的。如果完整的閱讀了該篇文章,應該已經消除了這一塊理解對誤區。這里總結一下:比如 parquet, orc,他們都是常見的 存儲格式 。是否使用壓縮,使用何種壓縮都是可以設置的。而 zlib、gzip、lzo、lz4、snappy 等等這些都是常見的 壓縮格式 ,他們既可以依附於某些 存儲格式 ,比如之前提到的 parquet + snappy,orc + zlib 等等。也可以脫離特定的 存儲格式 ,比如純文本文件進行壓縮,text + parquet, text + bzip2 等等。
Ⅲ 「Hive進階篇」詳解存儲格式及壓縮方式
hive優化除了有hql語句邏輯優化,hql參數調優等等,還有一個不起眼的細節容易被忽視掉, 那便是hive數倉模型表的存儲格式和壓縮方式 ,hive底層數據是依託在hadoop,以HDFS文件存儲在集群上的, hive數倉模型表選擇一個合適的存儲格式和壓縮方式也是hive優化的一點 。
本篇就來聊一聊這塊知識點吧。😄
hive主要有textfile、sequencefile、orc、parquet 這四種存儲格式,其中sequencefile很少使用,常見的主要就是orc和parquet這兩種,往往也搭配著壓縮方式合理使用。
建表聲明語句是: stored as textfile/orc/parquet
行式存儲,這是hive表的默認存儲格式,默認不做數據壓縮,磁碟開銷大,數據解析開銷大,數據不支持分片(即代表著會帶來無法對數據進行並行操作)
行列式存儲,將數據按行分塊,每個塊按列存儲,其中每個塊都存儲著一個索引,支持none和zlib和snappy這3種壓縮方式,默認採用zlib壓縮方式,不支持切片,orc存儲格式能提高hive表的讀取寫入和處理的性能。
列式存儲,是一個面向列的二進制文件格式(不可直接讀取),文件中包含數據和元數據,所以該存儲格式是自解析的,在大型查詢時效率很快高效,parquet主要用在存儲多層嵌套式數據上提供良好的性能支持,默認採用uncompressed不壓縮方式。
行存儲引擎 :同一條數據的不同欄位都在相鄰位置,所以當要查找某一條記錄所有數據時行存儲查詢速度比較快
列存儲引擎 :以列來聚集數據,相同欄位的值聚集在一起,所以當查詢某一個指定列的所有數據時,列存儲查詢速度比較快
hive主要支持gzip、zlib、snappy、lzo 這四種壓縮方式。
壓縮不會改變元數據的分割性,即壓縮後原來的值不變。
建表聲明語句是: tblproperties("orc.compress"="SNAPPY")
壓縮方式的評判標准主要有以下幾點:
針對壓縮方式做一個小結對比:
Ⅳ 甯哥敤鐨勬暟鎹鍘嬬緝綆楁硶鏈夊摢浜涳紵
鍦ㄦ暟瀛楀寲鏃朵唬錛屾暟鎹鐨勫瓨鍌ㄥ拰浼犺緭鏁堢巼鏄懼緱灝や負閲嶈併備負浜嗗噺灝忓瓨鍌ㄧ┖闂村拰甯﹀介渶奼傦紝鍚勭嶆暟鎹鍘嬬緝綆楁硶濡傞洦鍚庢槬絎嬭埇娑岀幇銆傝繖浜涚畻娉曚緷鎹涓嶅悓鐨勫師鐞嗗拰閫傜敤鍦烘櫙錛屽垎涓哄彲閫嗗拰闈炲彲閫嗕袱縐嶇被鍨嬶紝鏃ㄥ湪鍦ㄤ繚璇佹暟鎹瀹屾暣鎬х殑鍓嶆彁涓嬶紝灝藉彲鑳藉湴鍘嬬緝鏁版嵁浣撶Н銆傝╂垜浠娣卞叆鎺㈣ㄤ竴涓嬭繖浜涘父鐢ㄧ殑鏁版嵁鍘嬬緝綆楁硶銆
棣栧厛錛屽彲閫嗗帇緙╃畻娉曪紝濡侶uffman緙栫爜錛屼互鍏舵棤鎹熺壒鎬ц屽彈鍒伴潚鐫愩傚畠閫氳繃瀵規暟鎹鐨勯戠巼鍒嗘瀽錛屼負姣忎釜瀛楃﹀垎閰嶆渶鐭鐨勭紪鐮侊紝浠庤屽疄鐜伴珮鏁堢殑鍘嬬緝銆傝繖縐嶇紪鐮佹柟寮忕『淇濅簡瑙e帇鍚庣殑鏁版嵁涓庡師濮嬫暟鎹涓鑷達紝閫傜敤浜庡規暟鎹鍑嗙『鎬ц佹眰鏋侀珮鐨勫満鏅銆
鎺ョ潃錛岄潪鍙閫嗗帇緙╃畻娉曞侸PEG錛屼互鐗虹壊涓瀹氱殑鏁版嵁綺劇『搴︽崲鍙栨洿楂樼殑鍘嬬緝姣斻傝繖綾葷畻娉曞湪鍥懼儚澶勭悊鍜岃嗛戝帇緙╀腑騫挎硾搴旂敤錛屽挨鍏舵槸鍦ㄥ硅嗚夎川閲忚佹眰鐩稿硅緝浣庣殑鎯呭喌涓嬶紝鑳芥樉钁楀噺灝忔暟鎹閲忋
鏁版嵁鍘嬬緝鐨勭瓥鐣ュ氱嶅氭牱錛屽寘鎷鍩轟簬鍐呭圭殑緙栫爜錛堝傚瓧絎︿覆涓棰戠箒瀛楃︾殑棰戠巼緙栫爜錛夈佽〃紺烘柟娉曪紙濡傞湇澶鏇肩紪鐮佸規椂搴忔暟鎹鐨勯珮鏁堝勭悊錛変互鍙婂規暟鎹嫻佽勫緥鎬х殑鍒╃敤錛堝傛父紼嬬紪鐮佸拰RLE錛岀敤浜庤繛緇閲嶅嶆暟鎹鐨勫帇緙╋級銆備緥濡傦紝"this is a example"閫氳繃棰戠巼緙栫爜鑳藉噺灝忓埌54姣旂壒錛屾瘮鍘熷136姣旂壒鑺傜渷綰2.5鍊嶇殑瀛樺偍絀洪棿銆
Delta鍜孌elta-of-Delta緙栫爜鍒欏湪澶勭悊鏂囦歡鍘嗗彶璁板綍鍜屽崟璋冨簭鍒楁椂琛ㄧ幇鍑鴻壊錛岄厤鍚圧LE絳夋妧鏈錛岃兘鏄捐憲闄嶄綆鏁版嵁澶у皬銆侱elta閫氳繃閫愪釜鍏冪礌鐨勫樊寮傛潵鍘嬬緝鏁版嵁錛岃屼簩闃跺樊鍒嗙紪鐮佸垯榪涗竴姝ュ垎鏋愬墠鍚庝袱涓鍏冪礌鐨勫樊寮傦紝涓よ呭湪鐗瑰畾鍦烘櫙涓嬮兘鑳芥彁渚涢珮鏁堝帇緙┿
Zig-zag緙栫爜鐗瑰埆閽堝硅礋鏁幫紝涓嶥elta緇撳悎鑳芥湁鏁堝勭悊灝忔暟錛屽疄鐜伴珮鏁堝瓨鍌ㄣ侴oogle寮婧愮殑Snappy浠ュ叾蹇閫熺殑鍘嬬緝閫熷害鍜屽悎鐞嗙殑鍘嬬緝鏁堟灉錛屽箍娉涘簲鐢ㄤ簬寮婧愰」鐩錛岃孡Z4鍒欎互鍏跺瓧鑺傜駭鐨勫揩閫熻В鍘嬫ц兘錛岀壒鍒閫傚悎瀹炴椂鏁版嵁浼犺緭銆
Simple8b綆楁硶綆鍗曢珮鏁堬紝涓撲負灝忔暣鏁拌捐★紝浣嗗帇緙╃巼鍙鑳借緝浣庛侺ZO鍒欎互蹇閫熷帇緙╄侀暱錛屼絾瑙e帇閫熷害鐣ラ婁簬LZ4錛屾洿閫傚悎澶勭悊澶у潡鏁版嵁銆侱EFLATE綆楁硶鏄痾ip鏂囦歡鐨勯粯璁ゅ帇緙╂柟寮忥紝瀹冪粨鍚堜簡LZ77鍜孒uffman緙栫爜錛屾彁渚涗簡涓縐嶅鉤琛$殑鍘嬬緝絳栫暐銆
榪戝勾鏉ワ紝Zstandard浠ュ叾楂樻晥鐨勫帇緙╁拰蹇閫熺殑瑙e帇鑳藉姏宕闇插ご瑙掞紝涓烘湭鏉ユ暟鎹鍘嬬緝鎶鏈鐨勫彂灞曟弿緇樹簡騫塊様鍓嶆櫙銆傝孊it-packing鍒欓氳繃鍘婚櫎涓嶅繀瑕佺殑浣嶏紝榪涗竴姝ヨ妭鐪佸瓨鍌ㄧ┖闂達紝浣嗗彲鑳藉獎鍝嶆暟鎹鐨勮誨彇閫熷害銆
TDengine鏁版嵁搴撻噰鐢ㄤ簡涓闃舵靛帇緙╋紙鍖呮嫭Delta銆丼imple8b銆亃ig-zag鍜孡Z4錛夊拰浜岄樁孌甸氱敤鍘嬬緝絳栫暐錛屼互閫傚簲涓嶅悓鍦烘櫙鐨勯渶奼傘傞夋嫨鍘嬬緝綆楁硶鏃訛紝闇瑕佺患鍚堣冭檻鍘嬬緝鏁堢巼銆佽В鍘嬮熷害浠ュ強鏁版嵁鐨勫師濮嬬簿搴︼紝浠ユ壘鍒版渶閫傚悎鐨勮В鍐蟲柟妗堛
鍦ㄦ暟瀛楀寲涓栫晫涓錛屾暟鎹鍘嬬緝綆楁硶鏄鎻愬崌瀛樺偍鍜屼紶杈撴晥鐜囩殑鍏抽敭宸ュ叿銆傛瘡涓縐嶇畻娉曢兘鏈夊叾鐙鐗圭殑浼樺娍鍜岄傜敤鑼冨洿錛屼簡瑙e苟鐏墊椿榪愮敤榪欎簺宸ュ叿錛岃兘甯鍔╂垜浠鏇村ソ鍦扮$悊鏁版嵁錛岄檷浣庡瓨鍌ㄦ垚鏈錛屾彁楂樻暟鎹澶勭悊閫熷害銆