11.Hive壓縮蝗茁,文件格式及優(yōu)化

1. 日志文件加載案例:

需求描述:在日志文件目錄中,按天建文件夾寻咒,并且在每個天文件夾中哮翘,每小時有一個日志文件。程序自動每天將這些文件load到hive表對應(yīng)的天分區(qū)的小時分區(qū)內(nèi)毛秘。例如下面的目錄結(jié)構(gòu):


文件目錄結(jié)構(gòu).png

首先饭寺,需要根據(jù)實際文件的情況(查看分隔符)來確定我們建表的分隔符阻课。實際上,在顯示時艰匙,TAB和空格十分相似限煞,不好區(qū)分,可以使用UltraEdit工具的功能來查看员凝。使用方法:“視圖 -> 顯示空格/制表符”署驻。
下面是建表DDL:

CREATE TABLE `testdb.dw_web_log`(
  `id` string, 
  `url` string, 
  `referer` string, 
  `keyword` string, 
  `type` string, 
  `guid` string, 
  `pageid` string, 
  `moduleid` string, 
  `linkid` string, 
  `attachedinfo` string, 
  `sessionid` string, 
  `trackeru` string, 
  `trackertype` string, 
  `ip` string, 
  `trackersrc` string, 
  `cookie` string, 
  `ordercode` string, 
  `tracktime` string, 
  `enduserid` string, 
  `firstlink` string, 
  `sessionviewno` string, 
  `productid` string, 
  `curmerchantid` string, 
  `provinceid` string, 
  `cityid` string, 
  `fee` string, 
  `edmactivity` string, 
  `edmemail` string, 
  `edmjobid` string, 
  `ieversion` string, 
  `platform` string, 
  `internalkeyword` string, 
  `resultsum` string, 
  `currentpage` string, 
  `linkposition` string, 
  `buttonposition` string)
PARTITIONED BY ( 
  `date` string, 
  `hour` string)
ROW FORMAT DELIMITED 
  FIELDS TERMINATED BY '\t' 

下面使用兩種方式實現(xiàn), hive -e "sql" 和 hive --hiveconf -f 健霹。

1. hive -e方式:

通過shell腳本旺上,可以將變量拼接到sql語句中,并load數(shù)據(jù)到hive表中糖埋。下邊腳本供參考load_web_log.sh:

#!/bin/bash
#You must input one parameter;
if [ $# -ne 1 ]  ; then
echo "You must provide one parameter (date) unix timestamp !!"
exit 1
fi

date=`date -d @$1 +%Y%m%d`
logdir=/home/natty.ma/bigdata/hive/WebLog
HIVE_HOME=/spark/hive

log_num=`ls ${logdir}/${date}|wc -l`

if [ ${log_num} -lt 1 ]; then
  echo "There are no log files this day:"${date}
  exit 1 
else
  for i in `ls ${logdir}/${date}`; do
    # cut 2 characters from the 9th location  ;  get the hour of the file
    hour=${i:8:2}
    $HIVE_HOME/bin/hive -e "load data local inpath '${logdir}/${date}/${i}' overwrite into table testdb.dw_web_log partition(date='${date}',hour='${hour}')"
  done
fi

調(diào)用該腳本宣吱,需要傳入unix時間戳作為參數(shù):

$ ./load_web_log.sh `date -d "-1 days" +%s`

2. hive --hiveconf 方式傳參:

參考腳本load_web_log_1.sh :

#!/bin/bash
#You must input one parameter;
if [ $# -ne 1 ]  ; then
echo "You must provide one parameter (date) unix timestamp !!"
exit 1
fi

date=`date -d @$1 +%Y%m%d`
logdir=/home/natty.ma/bigdata/hive/WebLog
HIVE_HOME=/spark/hive/

log_num=`ls ${logdir}/${date}|wc -l`

if [ ${log_num} -lt 1 ]; then
  echo "There are no log files this day:"${date}
  exit 1 
else
  for i in `ls ${logdir}/${date}`; do
    # cut 2 characters from the 9th location  ;  get the hour of the file
    hour=${i:8:2}
    fileDir=${logdir}/${date}/${i}
    ${HIVE_HOME}/bin/hive --hiveconf fileDir=${fileDir} --hiveconf date=${date} --hiveconf hour=${hour} -f load_web_log.sql
  done
fi

這里使用了一個sql文件load_web_log.sql,該文件作用很簡單(只有一條load語句)瞳别,執(zhí)行SQL征候,并讀取變量即可。讀取變量時洒试,需要注意倍奢,在sql文件中,如果要讀取hiveconf傳過來的fileDir變量垒棋,需要使用${hiveconf:fileDir}

load data local inpath '${hiveconf:fileDir}' overwrite into table testdb.dw_web_log partition(date='${hiveconf:date}',hour='${hiveconf:hour}')

2. MapReduce和hive中的數(shù)據(jù)壓縮卒煞。

1.壓縮特點:

多數(shù)Hadoop作業(yè)在執(zhí)行時,都受限于I/O瓶頸叼架。對數(shù)據(jù)做壓縮畔裕,可以大量減少磁盤的存儲空間,同時壓縮后的文件在磁盤間傳輸和I/O也會大大減少;當(dāng)然壓縮和解壓縮也會帶來額外的CPU開銷乖订,但是卻可以節(jié)省更多的I/O和使用更少的內(nèi)存開銷扮饶。Job的性能可能會通過開啟壓縮而提高,但是必須要考慮到 Splittability乍构。

2.壓縮算法:

查看自己的hadoop版本支持的壓縮算法(庫):

$ bin/hadoop checknative

常見的壓縮算法包括:bzip2甜无,gzip,lzo哥遮,lz4岂丘,snappy等。一般地眠饮,評判一個壓縮算法好壞奥帘,需要綜合考慮“壓縮比”和“解壓速度”兩個指標。一般情況下仪召,壓縮比越大表明文件壓縮后占用空間越小寨蹋,但同時松蒜,需要的解壓時間也越多。所以已旧,需要綜合考慮秸苗。目前,lz4和snappy使用比較廣泛评姨。
壓縮比: bzip2 > gzip > lzo

MapReduce中的壓縮.png

從上圖發(fā)現(xiàn)难述,可以在3個過程使用壓縮:

  • Map階段前壓縮
  • Shuffle階段 { Compress Intermediate Data (Map Output) }
  • Reduce階段后 { Compress Reducer/Job Output (Reducer Output) }

一般情況下萤晴,可能會設(shè)置啟用 Shuffle階段壓縮 和 Reduce階段后 壓縮吐句。
(1)Shuffle階段壓縮:
Map輸出需要寫到磁盤,并且需要占用I/O在集群內(nèi)傳輸店读。壓縮可以減少寫入磁盤I/O和網(wǎng)絡(luò)傳輸I/O嗦枢,提高性能⊥投希可以使用Snappy文虏、LZO等壓縮算法。
(2)Reduce階段壓縮:
MapReduce輸出用來歸檔或者chaining Mapreduce作業(yè)殖演。Reduce階段使用壓縮可以節(jié)省磁盤空間氧秘。

在hadoop-common-xxx.jar中有定義壓縮算法的類,在包org.apache.hadoop.io.compress下趴久。例如以下幾個類:
org.apache.hadoop.io.compress.SnappyCodec
org.apache.hadoop.io.compress.GzipCodec
org.apache.hadoop.io.compress.Lz4Codec

3.壓縮配置:

在MapReduce和Hive中指定壓縮的方式不一樣丸相。
1.MapReduce指定壓縮:
(1)中間壓縮:

mapreduce.map.output.compress=true
mapreduce.map.output.compress.codec=org.apache.hadoop.io.compress.DefaultCodec

(2)Reduce結(jié)果壓縮:

mapreduce.output.fileoutputformat.compress=true
mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.DefaultCodec

如果需要永久配置,需要修改mapred-site.xml彼棍。
2.Hive指定壓縮:
(1)中間壓縮:

set hive.exec.compress.intermediate=true
set mapred.map.output.compression.codec=org.apache.hadoop.io.compress.DefaultCodec
set mapred.map.output.compression.type=(BLOCK/RECORD) 

(2)Reduce結(jié)果壓縮:

set hive.exec.compress.output=true
set mapred.output.compression.codec=org.apache.hadoop.io.compress.DefaultCodec
set mapred.output.compression.type=(BLOCK/RECORD) 

如果需要永久生效灭忠,需要配置hive-site.xml。

反序列化用來讀取數(shù)據(jù)座硕,序列化用來寫入數(shù)據(jù):
HDFS files --> InputFileFormat --> <key, value> --> Deserializer --> Row object
Row object --> Serializer --> <key, value> --> OutputFileFormat --> HDFS files
反序列化將一個String弛作,或者記錄的二級制表示轉(zhuǎn)化成一個Hive可以處理的java對象。DeSerializer通常用于讀數(shù)據(jù)华匾,例如SELECT語句映琳。
序列化是將一個Hive處理的java對象轉(zhuǎn)化成Hive可以寫入HDFS的對象。Serializer通常用于寫數(shù)據(jù)蜘拉,例如INSERT ... SELECT ...語句萨西。
Serde類中 的initialize() 只執(zhí)行一次,獲取表字段和字段類型信息诸尽。利用記錄的類型信息原杂,為記錄(row)實例化ObjectInspector對象。ObjectInspector是Hive對象您机,用來檢查和描述復(fù)雜類型的層次結(jié)構(gòu)穿肄。

http://blog.cloudera.com/blog/2012/12/how-to-use-a-serde-in-apache-hive/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末年局,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子咸产,更是在濱河造成了極大的恐慌矢否,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件脑溢,死亡現(xiàn)場離奇詭異僵朗,居然都是意外死亡,警方通過查閱死者的電腦和手機屑彻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門验庙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人粪薛,你說我怎么就攤上這事∥ナ伲” “怎么了熟空?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵藤巢,是天一觀的道長。 經(jīng)常有香客問我息罗,道長,這世上最難降的妖魔是什么阱当? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮弊添,結(jié)果婚禮上录淡,老公的妹妹穿的比我還像新娘。我一直安慰自己油坝,他們只是感情好嫉戚,可當(dāng)我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布澈圈。 她就那樣靜靜地躺著,像睡著了一般窍帝。 火紅的嫁衣襯著肌膚如雪诽偷。 梳的紋絲不亂的頭發(fā)上疯坤,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天深浮,我揣著相機與錄音压怠,去河邊找鬼飞苇。 笑死,一個胖子當(dāng)著我的面吹牛雨让,可吹牛的內(nèi)容都是我干的羽利。 我是一名探鬼主播,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼虚汛!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起卷哩,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤将谊,失蹤者是張志新(化名)和其女友劉穎冷溶,沒想到半個月后尊浓,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡栋齿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年瓦堵,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片菇用。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡惋鸥,死狀恐怖杂穷,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情扮休,我是刑警寧澤拴鸵,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站劲藐,受9級特大地震影響八堡,放射性物質(zhì)發(fā)生泄漏聘芜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一挂谍、第九天 我趴在偏房一處隱蔽的房頂上張望瞎饲。 院中可真熱鬧,春花似錦嗅战、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至苇倡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間晓褪,已是汗流浹背综慎。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人愉镰。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓钧汹,卻偏偏與公主長得像,于是被迫代替她去往敵國和親碗降。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,472評論 2 348

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