Hadoop文件存儲的葵花寶典


文件存儲分行存儲和列存儲,每個存儲格式裏面又分不同的類型,在實際的應用中如何去使用?怎樣去使用?快來圍觀吧!

文件存儲格式,我們在什麼時候去指定呢?比如在Hve和Ipala中去創建表的時候,我們除了指定列和分隔符,在它的命令行結尾有STORED AS參數,這個參數默認是文本格式,但是文本不適合所有的場景,那麼在這裏我們就可以改變文本的信息。

wKiom1hl7VzS32exAACIcZ7sbpA038.png-wh_50

那麼到底我們應該選擇哪些格式呢?每種格式都有什麼樣的特點呢?我們爲什麼要去選擇這種格式呢?

一、文本文件:

文本文件是Hadoop裏面最基本的文件類型,可以從任何編程語言進行讀或寫,兼容逗號和tab分隔的文件以及其它很多的應用。而且文本文件直接可讀的,因爲都是字符串,所以在Debug的時候非常有用。然而,數據到達一定規模,這種格式是很低效的:(1)文本文件把數值表示爲string浪費了存儲空間;(2)很難表示二進制的數據,比如圖片,通常依靠其他技術,比如Base64編碼

所以文本文件格式總結起來就是:易操作,但性能低

二、序列文件

序列文件本質是基於key-value鍵值對的二進制容器格式,它比文本格式冗餘更少,更高效,適合存儲二進制數據,比如圖片。而且它是Java專有格式並且跟Hadoop緊密結合。

所以序列文件格式總結起來就是:性能好,但難操作

三、Avro數據文件

Avro數據文件是二進制編碼,存儲效率更好。它不僅可以在Hadoop生態系統得到廣泛支持,還可以在Hadoop之外使用。它是長期存儲重要數據的理想選擇,可以通過多種語言讀寫。

而且它內嵌schema文件,通過這個文件我們可以很輕鬆的像表一樣去定義數據的模式,可以靈活制定字段及字段類型。Schema演化可以適應各種變化,比如當前指定一個Schema類型,將來增加了一些數據結構、刪除了一些數據、類型發生了變更、長度發生了變更,都是可以應對的。

所以Avro數據文件格式總結起來就是:極好的操作性和性能,是Hadoop通用存儲的最佳選擇。

以上介紹的三種格式都是行存儲,但是Hadoop裏面還有一些列存儲格式。典型的OLTP以行的形式來存儲,就是以連續的行來存儲到連續的塊,當我們進行隨機的尋值訪問的時候,我們通常會去加一些條件,對於行存儲而言可以迅速定義到塊所在位置,然後提取行的數據。而列存儲以列爲單位進行存儲,如果將列存儲應用於OLTP我們要定義到特定行進行掃描的時候,它會掃描到所有的列。對於列存儲應用到在線事務場景處理就是一個很恐怖的事情,列存儲的意義在於應用於大數據分析場景,比如進行特徵值的抽取,變量的篩選,通常在大數據場景應用中我們會大量的應用寬表,可能對於某一業務分析而言,我們只需要使用其中一個或幾十個這樣的列,那麼就可去選擇一些列進行掃描,不會掃描到全表。行存儲與列存儲並沒有絕對的好壞之分,只是彼此適用的場景不一樣。

wKioL1hl7WvhHx9eAAF74ogZLZo115.png-wh_50

下面我們看一下列存儲重要的存儲方式:

一、Parquet文件

Parquet文件格式非常重要,在未來也將會被廣泛的使用。我們把HDFS稱作是大數據存儲事實標準的話,那麼Parquet文件就是文件存儲格式的事實標準。目前spark已經把它作爲默認的文件存儲格式,可見它的重要性。最初由cloudera和twitter開發的開源列存儲格式,在MapReduce、Hive、Pig、Impala、Spark、Crunch和其他項目中支持應用。它和Avro數據文件都有Schema元數據,區別只是Parquet文件是列存儲,Avro數據文件是行存儲。這裏必須要強調的是Parquet文件在編碼方面進行了一些額外優化,減少存儲空間,增加了性能。

所以Parquet文件總結起來就是:極好的操作性和性能,是基於列訪問模式的最佳選擇。

  文件存儲格式,需要重點去把握和學習,尤其是每種存儲格式優劣勢,必須熟練掌握,纔可以在使用中更好的去選擇使用。另外,我們在平常的工作中也要多去和別人分享交流,這樣纔會更好的完善自己的知識架構,提升自己的技術水平,友情推薦“大數據cn”微信公衆號,等你來交流!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章