Hive文件存儲格式和hive數據壓縮

1、存儲格式行存儲和列存儲

  1. 行存儲能夠理解爲一條記錄存儲一行,經過條件可以查詢一整行數據。
  2. 列存儲,以字段彙集存儲,能夠理解爲相同的字段存儲在一塊兒。

2、Hive文件存儲格式

  1. TEXTFILE,
  • Hive數據表的默認格式,存儲方式:行存儲。
  • 可使用Gzip壓縮算法,但壓縮後的文件不支持split
  • 在反序列化過程當中,必須逐個字符判斷是否是分隔符和行結束符,所以反序列化開銷會比SequenceFile高几十倍。
  1. SEQUENCEFILE
  • 壓縮數據文件能夠節省磁盤空間,但Hadoop中有些原生壓縮文件的缺點之一就是不支持分割。支持分割的文件能夠並行的有多個mapper程序處理大數據文件,大多數文件不支持可分割是由於這些文件只能從頭開始讀。Sequence File是可分割的文件格式,支持Hadoop的block級壓縮。
  • Hadoop API提供的一種二進制文件,以key-value的形式序列化到文件中。存儲方式:行存儲。
  • sequencefile支持三種壓縮選擇:NONE,RECORD,BLOCK。Record壓縮率低,RECORD是默認選項,一般BLOCK會帶來較RECORD更好的壓縮性能。
  • 優點是文件和hadoop api中的MapFile是相互兼容的
  1. RCFILE
    存儲方式:數據按行分塊,每塊按列存儲。結合了行存儲和列存儲的優勢:
  • RCFile 保證同一行的數據位於同一節點,所以元組重構的開銷很低
  • 像列存儲同樣,RCFile 可以利用列維度的數據壓縮,而且能跳過沒必要要的列讀取
  • 數據追加:RCFile不支持任意方式的數據寫操做,僅提供一種追加接口,這是由於底層的 HDFS當前僅僅支持數據追加寫文件尾部。
  • 行組大小:行組變大有助於提升數據壓縮的效率,可是可能會損害數據的讀取性能,由於這樣增長了 Lazy 解壓性能的消耗。並且行組變大會佔用更多的內存,這會影響併發執行的其餘MR做業。 考慮到存儲空間和查詢效率兩個方面,Facebook 選擇 4MB 做爲默認的行組大小,固然也容許用戶自行選擇參數進行配置。
  1. ORCFILE
    存儲方式:數據按行分塊,每塊按照列存儲。
    壓縮快,快速列存取。效率比rcfile高,是rcfile的改良版本。

3、建立語句和壓縮

3.一、壓縮工具的對比:

image

Hadoop編碼/解碼器方式,以下表所示算法

壓縮格式 對應的編碼/解碼
DEFAULT org.apache.hadoop.io.compress.DefaultCodec
Gzip org.apache.hadoop.io.compress.GzipCodec
Bzip org.apache.hadoop.io.compress.BzipCodec
Snappy org.apache.hadoop.io.compress.SnappyCodec
Lzo org.apache.hadoop.io.compress.LzopCodec

3.二、壓縮設置

HiveQL語句最終都將轉換成爲hadoop中的MapReduce job,而MapReduce job能夠有對處理的數據進行壓縮。apache

Hive中間數據壓縮api

hive.exec.compress.intermediate:默認爲false,設置true爲激活中間數據壓縮功能,就是MapReduce的shuffle階段對mapper產生中間壓縮,在這個階段,優先選擇一個低CPU開銷:併發

set hive.exec.compress.intermediate=true
set mapred.map.output.compression.codec= org.apache.hadoop.io.compress.SnappyCodec
set mapred.map.output.compression.codec=com.hadoop.compression.lzo.LzoCodec

最終輸出結果壓縮
hive.exec.compress.output:用戶能夠對最終生成的Hive表的數據一般也須要壓縮。該參數控制這一功能的激活與禁用,設置爲true來聲明將結果文件進行壓縮。app

mapred.output.compression.codec:將hive.exec.compress.output參數設置成true後,而後選擇一個合適的編解碼器,如選擇SnappyCodec。設置以下(兩種壓縮的編寫方式是同樣的):工具

set hive.exec.compress.output=true 
set mapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec
或者
或者

set mapred.output.compress=true
set mapred.output.compression.codec=org.apache.hadoop.io.compress.LzopCodec

3.三、 四種格式的存儲和壓縮設置(客戶端設置壓縮格式)

1. TEXTFILEoop

create table if not exists textfile_table(
site string,
url  string,
pv   bigint,
label string)
row format delimited
fields terminated by '\t'
stored as textfile;
插入數據操做:
set hive.exec.compress.output=true; //輸出結果壓縮開啓  
set mapred.output.compress=true;  
set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec;  
set io.compression.codecs=org.apache.hadoop.io.compress.GzipCodec;  //壓縮和解壓縮編碼類列表,用逗號分隔,將所用到解壓和壓縮碼設置其中
insert overwrite table textfile_table select * from testfile_table;

2. SEQUENCEFILE性能

create table if not exists seqfile_table(
site string,
url  string,
pv   bigint,
label string)
row format delimited
fields terminated by '\t'
stored as sequencefile;
插入數據操做:
set hive.exec.compress.output=true;  
set mapred.output.compress=true;  
set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec;  
set io.compression.codecs=org.apache.hadoop.io.compress.GzipCodec;  
SET mapred.output.compression.type=BLOCK;
insert overwrite table seqfile_table select * from testfile_table;

3. RCFILE大數據

create table if not exists rcfile_table(
site string,
url  string,
pv   bigint,
label string)
row format delimited
fields terminated by '\t'
stored as rcfile;
插入數據操做:
set hive.exec.compress.output=true;  
set mapred.output.compress=true;  
set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec;  
set io.compression.codecs=org.apache.hadoop.io.compress.GzipCodec;  
insert overwrite table rcfile_table select * from testfile_table;

4. ORCFILE編碼

create table if not exists orcfile_table(
site string,
url  string,
pv   bigint,
label string)
row format delimited
fields terminated by '\t'
stored as orc;
插入數據操做:
set hive.exec.compress.output=true;  
set mapred.output.compress=true;  
set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec;  
set io.compression.codecs=org.apache.hadoop.io.compress.GzipCodec;  
insert overwrite table orcfile_table select * from testfile_table;

總結:

  1. TextFile默認格式,加載速度最快,能夠採用Gzip進行壓縮,壓縮後的文件沒法split,沒法並行處理了。

  2. SequenceFile壓縮率最低,查詢速度通常,將數據存放到sequenceFile格式的hive表中,這時數據就會壓縮存儲。三種壓縮格式NONE,RECORD,BLOCK。是可分割的文件格式。

  3. RCfile壓縮率最高,查詢速度最快,數據加載最慢。
  4. 相比TEXTFILE和SEQUENCEFILE,RCFILE因爲列式存儲方式,數據加載時性能消耗較大,可是具備較好的壓縮比和查詢響應。數據倉庫的特色是一次寫入、屢次讀取,所以,總體來看,RCFILE相比其他兩種格式具備較明顯的優點。

  5. 在hive中使用壓縮須要靈活的方式,若是是數據源的話,採用RCFile+bz或RCFile+gz的方式,這樣能夠很大程度上節省磁盤空間;而在計算的過程當中,爲了避免影響執行的速度,能夠浪費一點磁盤空間,建議採用RCFile+snappy的方式,這樣能夠總體提高hive的執行速度。至於lzo的方式,也能夠在計算過程當中使用,只不過綜合考慮(速度和壓縮比)仍是考慮snappy適宜。

相關文章
相關標籤/搜索