十年網(wǎng)站開發(fā)經(jīng)驗 + 多家企業(yè)客戶 + 靠譜的建站團隊
量身定制 + 運營維護+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
這篇文章主要介紹Hive中如何優(yōu)化配置參數(shù),文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
成都創(chuàng)新互聯(lián)主要從事網(wǎng)站設計、做網(wǎng)站、網(wǎng)頁設計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務。立足成都服務化隆,十余年網(wǎng)站建設經(jīng)驗,價格優(yōu)惠、服務專業(yè),歡迎來電咨詢建站服務:028-86922220
1. 創(chuàng)建一個普通表
table test_user1(id int, name string,code string,code_id string ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
2. 查看這張表的信息
DESCRIBE FORMATTED test_user1;
我們從該表的描述信息介紹建表時的一些可優(yōu)化點。
2.1 表的文件數(shù)
numFiles表示表中含有的文件數(shù),當文件數(shù)過多時可能意味著該表的小文件過多,這時候我們可以針對小文件的問題進行一些優(yōu)化,HDFS本身提供了解決方案:
(1)Hadoop Archive/HAR:將小文件打包成大文件。
(2)SEQUENCEFILE格式:將大量小文件壓縮成一個SEQUENCEFILE文件。
(3)CombineFileInputFormat:在map和reduce處理之前組合小文件。
(4)HDFS Federation:HDFS聯(lián)盟,使用多個namenode節(jié)點管理文件。
除此之外,我們還可以通過設置hive的參數(shù)來合并小文件。
(1)輸入階段合并
需要更改Hive的輸入文件格式,即參數(shù)hive.input.format,默認值是org.apache.hadoop.hive.ql.io.HiveInputFormat,我們改成org.apache.hadoop.hive.ql.io.CombineHiveInputFormat。這樣比起上面對mapper數(shù)的調(diào)整,會多出兩個參數(shù),分別是mapred.min.split.size.per.node和mapred.min.split.size.per.rack,含義是單節(jié)點和單機架上的最小split大小。如果發(fā)現(xiàn)有split大小小于這兩個值(默認都是100MB),則會進行合并。具體邏輯可以參看Hive源碼中的對應類。
(2)輸出階段合并
直接將hive.merge.mapfiles和hive.merge.mapredfiles都設為true即可,前者表示將map-only任務的輸出合并,后者表示將map-reduce任務的輸出合并,Hive會額外啟動一個mr作業(yè)將輸出的小文件合并成大文件。另外,hive.merge.size.per.task可以指定每個task輸出后合并文件大小的期望值,hive.merge.size.smallfiles.avgsize可以指定所有輸出文件大小的均值閾值,默認值都是1GB。如果平均大小不足的話,就會另外啟動一個任務來進行合并。
通過InputFormat和OutputFormat可以看出表的存儲格式是TEXT類型,Hive支持TEXTFILE, SEQUENCEFILE, AVRO, RCFILE, ORC,以及PARQUET文件格式,可以通過兩種方式指定表的文件格式:
(1)CREATE TABLE ... STORE AS
(2)ALTER TABLE ... [PARTITION partition_spec] SET FILEFORMAT
如果要改變創(chuàng)建表的默認文件格式,可以使用set hive.default.fileformat=
擴展:不同存儲方式的情況
TEXT, SEQUENCE和 AVRO文件是面向行的文件存儲格式,不是最佳的文件格式,因為即便只查詢一列數(shù)據(jù),使用這些存儲格式的表也需要讀取完整的一行數(shù)據(jù)。另一方面,面向列的存儲格式(RCFILE, ORC, PARQUET)可以很好地解決上面的問題。關于每種文件格式的說明,如下:
(1)TEXTFILE
創(chuàng)建表時的默認文件格式,數(shù)據(jù)被存儲成文本格式。文本文件可以被分割和并行處理,也可以使用壓縮,比如GZip、LZO或者Snappy。然而大部分的壓縮文件不支持分割和并行處理,會造成一個作業(yè)只有一個mapper去處理數(shù)據(jù),使用壓縮的文本文件要確保文件不要過大,一般接近兩個HDFS塊的大小。
(2)SEQUENCEFILE
key/value對的二進制存儲格式,sequence文件的優(yōu)勢是比文本格式更好壓縮,sequence文件可以被壓縮成塊級別的記錄,塊級別的壓縮是一個很好的壓縮比例。如果使用塊壓縮,需要使用下面的配置:set hive.exec.compress.output=true; set io.seqfile.compression.type=BLOCK
(3)AVRO
二進制格式文件,除此之外,avro也是一個序列化和反序列化的框架。avro提供了具體的數(shù)據(jù)schema。
(4)RCFILE
全稱是Record Columnar File,首先將表分為幾個行組,對每個行組內(nèi)的數(shù)據(jù)進行按列存儲,每一列的數(shù)據(jù)都是分開存儲,即先水平劃分,再垂直劃分。
(5)ORC
全稱是Optimized Row Columnar,從hive0.11版本開始支持,ORC格式是RCFILE格式的一種優(yōu)化的格式,提供了更大的默認塊(256M)
(6)PARQUET
另外一種列式存儲的文件格式,與ORC非常類似,與ORC相比,Parquet格式支持的生態(tài)更廣,比如低版本的impala不支持ORC格式。
配置同樣數(shù)據(jù)同樣字段的兩張表,以常見的TEXT行存儲和ORC列存儲兩種存儲方式為例,對比執(zhí)行速度。
TEXT存儲方式
總結:從上圖中可以看出列存儲在對指定列進行查詢時,速度更快,建議在建表時設置列存儲的存儲方式。
2.3 表的壓縮
對Hive表進行壓縮是常見的優(yōu)化手段,一些存儲方式自帶壓縮選擇,比如SEQUENCEFILE支持三種壓縮選擇:NONE,RECORD,BLOCK。Record壓縮率低,一般建議使用BLOCK壓縮;
ORC支持三種壓縮選擇:NONE,ZLIB,SNAPPY。我們以TEXT存儲方式和ORC存儲方式為例,查看表的壓縮情況。
配置同樣數(shù)據(jù)同樣字段的四張表,一張TEXT存儲方式,另外三張分別是默認壓縮方式的ORC存儲、SNAPPY壓縮方式的ORC存儲和NONE壓縮方式的ORC存儲,查看在hdfs上的存儲情況:
TEXT存儲方式
默認壓縮ORC存儲方式
SNAPPY壓縮的ORC存儲方式
NONE壓縮的ORC存儲方式
總結:可以看到ORC存儲方式將數(shù)據(jù)存放為兩個block,默認壓縮大小加起來134.69M,SNAPPY壓縮大小加起來196.67M,NONE壓縮大小加起來247.55M,TEXT存儲方式的文件大小為366.58M,且默認block兩種存儲方式分別為256M和128M,ORC默認的壓縮方式比SNAPPY壓縮得到的文件還小,原因是ORZ默認的ZLIB壓縮方式采用的是deflate壓縮算法,比Snappy壓縮算法得到的壓縮比高,壓縮的文件更小。ORC不同壓縮方式之間的執(zhí)行速度,經(jīng)過多次測試發(fā)現(xiàn)三種壓縮方式的執(zhí)行速度差不多,所以建議采用ORC默認的存儲方式進行存儲數(shù)據(jù)。
Num Buckets表示桶的數(shù)量,我們可以通過分桶和分區(qū)操作對Hive表進行優(yōu)化:
對于一張較大的表,可以將它設計成分區(qū)表,如果不設置成分區(qū)表,數(shù)據(jù)是全盤掃描的,設置成分區(qū)表后,查詢時只在指定的分區(qū)中進行數(shù)據(jù)掃描,提升查詢效率。要注意盡量避免多級分區(qū),一般二級分區(qū)足夠使用。常見的分區(qū)字段:
(1)日期或者時間,比如year、month、day或者hour,當表中存在時間或者日期字段時,可以使用些字段。
(2)地理位置,比如國家、省份、城市等
(3)業(yè)務邏輯,比如部門、銷售區(qū)域、客戶等等
與分區(qū)表類似,分桶表的組織方式是將HDFS上的一張大表文件分割成多個文件。分桶是相對分區(qū)進行更細粒度的劃分,分桶將整個數(shù)據(jù)內(nèi)容按照分桶字段屬性值得hash值進行區(qū)分,分桶可以加快數(shù)據(jù)采樣,也可以提升join的性能(join的字段是分桶字段),因為分桶可以確保某個key對應的數(shù)據(jù)在一個特定的桶內(nèi)(文件),所以巧妙地選擇分桶字段可以大幅度提升join的性能。通常情況下,分桶字段可以選擇經(jīng)常用在過濾操作或者join操作的字段。
創(chuàng)建分桶表
create table test_user_bucket(id int, name string,code string,code_id string ) clustered by(id) into 3 buckets ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
查看描述信息
DESCRIBE FORMATTED test_user_bucket
查看該表的hdfs
同樣的數(shù)據(jù)查看普通表和分桶表查詢效率
普通表
分桶表
普通表是全表掃描,分桶表在按照分桶字段的hash值分桶后,根據(jù)join字段或者where過濾字段在特定的桶中進行掃描,效率提升。
以上是“Hive中如何優(yōu)化配置參數(shù)”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關知識,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道!