大資料學習筆記(十三)-Hive高階

狂暴棕熊發表於2017-12-20

1.Hive的後設資料表
TBLS:TBL_ID、DB_ID、SD_ID、TBL_NAME、TBL_TYPE
TABLE_PARAMS:儲存表/檢視的屬性資訊
TBL_PRIVS:儲存表/檢視的許可權資訊,一般不用HIVE的許可權,而是用sentry來進行許可權控制
SDS:儲存檔案儲存的基本資訊,比如INPUT_FORMAT、OUTPUT_FORMAT、是否壓縮
COLUMNS_V2:儲存表對應的欄位資訊
PARTITIONS:儲存分割槽表的基本資訊
PARTITION_KEYS:儲存分割槽表的欄位資訊
PARTITION_KEY_VALS:存放分割槽欄位值
FUNCS:使用者註冊的函式資訊

2.Hive的執行計劃
EXPLAIN [EXTENDED|DEPENDENCY|AUTHORIZATION] query
分析Hive的執行計劃有助於瞭解Hive具體是如何執行的,幫助對Hive進行效能調優。

3.Hive當中的join
例子

create table a(id int, name string) row format delimited fields terminated by '\t';
hive> create table b(id int, age int) row format delimited fields terminated by '\t';
hive> load data local inpath '/home/hadoop/data/a.txt' overwrite into table a;
hive> load data local inpath '/home/hadoop/data/b.txt' overwrite into table b;
hive> select * from a;
OK
1   zhangsan
2   lisi
3   wangwu
hive> select * from b;
OK
1   30
2   29
4   21

①inner join

hive> select a.id, a.name, b.age from a join b on a.id=b.id;

②left join

hive> select a.id, a.name, b.age from a left join b on a.id=b.id;

③right join

hive> select a.id, a.name, b.age from a right join b on a.id=b.id;

③full join

hive> select a.id, a.name, b.age from a full join b on a.id=b.id;

4.join的優化
普通的join可稱為common join/shuffle join/reduce join,這種操作會引起資料的網路傳輸,速度比較慢。
優化方法適用map join即spark當中利用broadcast的join優化,原理是將小表傳到每臺worker上,那麼相當於將join操作本地化了。

5.Hive後設資料升級方案
場景叢集機器名修改hodoop000=>new_name
解決方案:
①直接修改後設資料中DBS表中的相關欄位
②適用bin\metatool
-listFSRoot檢視檔案系統根目錄
-updateLocation更新location

-updateLocation hdfs://new_name:xxx hdfs://old_name:xxx

6.MapReduce和Hive如何支援遞迴目錄
MapReduce支援檔案遞迴修改mapreduce-site.xml檔案配置

<property>
    <name>mapreduce.input.fileinputformat.input.dir.recursive</name>
    <value>true</value>
</property>

Hive支援檔案遞迴修改hive-site.xml檔案配置

<property>
    <name>mapreduce.input.fileinputformat.input.dir.recursive</name>
    <value>true</value>
</property>
<property>
    <name>hive.mapred.supports.subdirectories</name>
    <value>true</value>
</property>

7.多行資料形成一行
相同編號的學生合成一行資料
使用concat_ws、collect_set函式實現

select
id
concat_ws(',',collect_set(name)) as name,
concat_ws(',',collect_set(url)) as url
from tt groupby id;

8.Hive的調優
①Hive的並行執行配置

hive.exec.parallel=false;//預設設定
hive.exec.parallel=true;//允許並行執行

②合理設定Reduce的數量
reduce數量決定了最終作業落地的個數
reduce決定的因素
1)hive.exec.reducers.bytes.per.reducer 預設值256000000
每個Reduce能夠處理的數量
2)hive.exec.reducers.max 預設值1009
每個作業最大的reduce數量
計算公式:reduce的實際數量N=min(引數二,總輸入資料量/引數一)

生產中實際會調整mapred.reduce.tasks=-1的引數,手工調整啟動reduce的數量。

③多個job之間共享中間結果集
建立臨時表,作為中間結果表
好處:減少磁碟IO,減少網路IO
缺點:依賴關係更加嚴重

9.資料傾斜
導致資料清洗的原因
①join
②groupBy
③count(distinct column)
join的資料傾斜問題:
大小表,使用mapjoin
兩個大表使用桶表

情形:大表與大表,但是分桶的判斷欄位0值或空值過多
後果:這些空值都由一個reduce處理,非常慢
大表Join大表:
把空值的key變成一個字串加上隨機數,把傾斜的資料分到不同的reduce上,由於null值關聯不上,處理後並不影響最終結果。

groupBy
雙層groupBy

count(disctinct column)
採用groupBy改造

10.Hive調優的其他手段
列裁剪
分割槽裁剪
壓縮
列式儲存
合併小檔案

相關文章