Hive基礎
Hive簡介:(1)hql相對于MR程式沒有複雜的代碼,上手簡單,會寫sql的同學,hql也不在話下,差別不是很大。(2)Hive作為資料倉庫使用,工作中常用的就是資料的查詢(select)和加載(insert)
1、 内部表和外部表的差別:内部表删除中繼資料和真實資料,外部表隻删除中繼資料
2、 一般建立内部表的時候,不指定location的位置,一般放在預設的hive倉庫路 徑:/user/hive/warehouse/;外部表最好指定location
3、存儲格式:(1)、textfile:預設存儲格式,行存儲,磁盤和資料解析開銷大,壓縮的text檔案 hive無法進行合并和拆分。(2)、sequencefile:二進制鍵值對行存儲,可分割,壓縮,一般選擇block壓縮,優勢是檔案和hadoop api mapfile是互相相容的。(3)、rcfile:存儲方式:資料按行分塊,每塊按照列存儲,壓縮快,快速列存取,讀記錄盡量涉及到的block最少 ,讀取需要的列隻需要讀取每個row group的頭部定義,讀取全量資料的操作性能可能比sequencefile沒有明顯的優勢。(4)、orc:存儲方式:按行分塊,按列存儲,壓縮快,快速列存取,效率的rcfile高,改良版。(5)、自定義格式:可以通過實作inputformat來定義輸入輸出格式
4、常用語句(我就不分類了):(1)、查詢表結構: desc 表名; (2)、顯示庫:show databases; (3)、選擇庫:use 庫名; (4)、顯示庫下所有表:show tables; (5)、查詢創表語句:show create table 表名; (6)、查詢 select 字段 from 表名 (join 表名 on 表連接配接條件) where 條件 group by 字段 having 條件 order by 字段 limit 數字 (7)、加載:load data local inpath "/.txt" into table 表名 (8)、插入資料:insert (override) table 表名 partition(分區字段) select ......
5、cluster by 和sort by 不能連用,distribute by age sort by id ; 分桶;left semi join 隻顯示左面的表 半連接配接效率高
6、經典的視窗函數:select * from(select a.movietype,a.movieid,b.avgrate,row_number() over(distribute by movietype sort by avgrate desc) as rn from result_8_1 a join result_8_2 b on (a.movieid=b.movieid)) abwhere ab.rn<=5;
7、視窗函數(三種):row_number() over(distribute by sort by ) 12345 ;rank() over() 12335 ; dense_rank() over() 12334
8、執行順序:from->where ->group by ->having-> select->distinct-> 别名-> order by ->
9、hql中 select中的字段必須要在group中存在,否則報錯
10、hive -i 腳本 初始化指令; hive -e ""; hive -f 腳本 -hiveconf hive.exec.mode.local.auto=true ; hive -S 隻輸出結果
11、group by 和 join 容易資料傾斜,資料傾斜的原因: shuffle 階段 造成reduce 配置設定不均,資料傾斜直接結果:效率低,閑置資源多,任務錯誤指數上升
12、常用的日期函數,自行搜尋,網上很多,這個工作中使用特别多
13、一些常用函數:concat、concat_ws、instr、substr ,聚合函數max、count等等
14、寫腳本時可能和python 連用,需要加 add file *.py SELECT TRANSFORM(tmp.*)
USING 'python *.py'
Hive優化
1、多表連接配接join 會緩存左邊的表 小表寫前面
2、笛卡爾積優化:構造随機連接配接,有多少不同連接配接,就複制多少份小表緩存到記憶體中,在和大表join,隻要記憶體夠就可以進行mapjoin
3、set hive.exec.mode.local.auto=true; 本地模式
set hive.merge.mapfiles = true ## 在 map only 的任務結束時合并小檔案
set hive.merge.mapredfiles = false ## true 時在 MapReduce 的任務結束時合并小檔案
set hive.merge.size.per.task = 256000000 ## 合并檔案的大小
set mapred.max.split.size=256000000; ## 每個 Map 最大分割大小
set mapred.min.split.size.per.node=1; ## 一個節點上 split 的最少值
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;s## 執行 Map前合并小檔案
設定maptask數量
long splitSize = Math.max(minSize, Math.min(maxSize, blockSize))輸入的分片大小(取中)
1 、 減少 MapTask 數是通過 合并小檔案來實作 ,這一點主要是針對資料源
2 、 增加 MapTask 數可以通過控制上一個 job 的 reduceTask 個數set
set mapred.job.reuse.jvm.num.tasks=5 需要重用jvm,JVM的啟動時間會變成一個比較大的消耗
設定reduceTask 的 數量
1、hive.exec.reducers.bytes.per.reducer(預設為 256000000)
2、hive.exec.reducers.max(預設為 1009)
3、mapreduce.job.reduces=-1(設定一個常量 reducetask 數量)
依據 Hadoop 的經驗,可以将參數 2 設定為 0.95*( 叢集中 datanode 個數)
資料傾斜join優化
set hive.skewjoin.key=100000; // 這個是 join 的鍵對應的記錄條數超過這個值則會進行分拆,值根據具體資料量設定
set hive.optimize.skewjoin=true; // 如果是 join 過程出現傾斜應該設定為 true
group by 優化 (MapReduce 的 combiner 元件)
set hive.map.aggr = true 是否在 Map 端進行聚合,預設為 True
set hive.groupby.mapaggr.checkinterval = 100000 在 Map 端進行聚合操作的條目數目
set hive.groupby.skewindata = true政策就是把 MR 任務拆分成兩個:第一個先做預彙總,第二個再做 最終 彙總
并行化
set hive.exec.parallel=true;
set hive.exec.parallel.thread.number=8; // 同一個 sql允許并行任務的最大任務數
壓縮
set hive.exec.compress.output=true // 預設值是 false,不壓縮
set hive.exec.compress.intermediate=true // 預設值是 false,為 true 時 MR 設定的壓縮才啟用
作者:Reyn_93
連結:https://www.jianshu.com/p/c5a1c4662016