1. Hive數據傾斜
緣由node
- key分佈不均勻
- 業務數據自己的特性
- SQL語句形成數據傾斜
解決方法sql
- hive設置hive.map.aggr=true和hive.groupby.skewindata=true
- 有數據傾斜的時候進行負載均衡,當選項設定爲true,生成的查詢計劃會有兩個MR Job。第一個MR Job中,Map的輸出結果集合會隨機分佈到Reduce中,每一個Reduce作部分聚合操做,並輸出結果,這樣處理的結果是相同Group By Key有可能被分發到不一樣的Reduce中,從而達到負載均衡的目的;第二個MR Job在根據預處理的數據結果按照 Group By Key 分佈到Reduce中(這個過程能夠保證相同的 Group By Key 被分佈到同一個Reduce中),最後完成最終的聚合操做。
SQL語句調整:shell
- 選用join key 分佈最均勻的表做爲驅動表。作好列裁剪和filter操做,以達到兩表join的時候,數據量相對變小的效果。
- 大小表Join: 使用map join讓小的維度表(1000條如下的記錄條數)先進內存。在Map端完成Reduce。
- 大表Join大表:把空值的Key變成一個字符串加上一個隨機數,把傾斜的數據分到不一樣的reduce上,因爲null值關聯不上,處理後並不影響最終的結果。
- count distinct大量相同特殊值:count distinct時,將值爲空的狀況單獨處理,若是是計算count distinct,能夠不用處理,直接過濾,在作後結果中加1。若是還有其餘計算,須要進行group by,能夠先將值爲空的記錄單獨處理,再和其餘計算結果進行union.
2. Hive中的排序關鍵字有哪些
sort by ,order by ,cluster by ,distribute byapache
- sort by :不是全局排序,其在數據進入reducer前完成排序
- order by :會對輸入作全局排序,所以只有一個reducer(多個reducer沒法保證全局有序).只有一個reducer,會致使當輸入規模較大時,須要較長的計算時間。
- cluster by : 當distribute by 和sort by的字段相同時,等同於cluster by.能夠看作特殊的distribute + sort
- distribute by :按照指定的字段對數據進行劃分輸出到不一樣的reduce中
3. 海量數據分佈在100臺電腦中,想個辦法高效統計出這批數據的TOP10
方案1:安全
- 在每臺電腦上求出TOP10,能夠採用包含10個元素的堆完成(TOP10小,用最大堆,TOP10大,用最小堆)。
- 好比求TOP10大,咱們首先取前10個元素調整成最小堆,若是發現,而後掃描後面的數據,並與堆頂元素比較,若是比堆頂元素大,那麼用該元素替換堆頂,而後再調整爲最小堆。
- 最後堆中的元素就是TOP10大。
方案2併發
- 求出每臺電腦上的TOP10後,而後把這100臺電腦上的TOP10組合起來,共1000個數據
- 再利用上面相似的方法求出TOP10就能夠了。
4. Hive中追加導入數據的4種方式是什麼?請寫出簡要語法app
- 從本地導入: load data local inpath ‘/home/1.txt’ (overwrite)into table student;
- 從Hdfs導入: load data inpath ‘/user/hive/warehouse/1.txt’ (overwrite)into table student;
- 查詢導入: create table student1 as select * from student;(也能夠具體查詢某項數據)
- 查詢結果導入:insert (overwrite)into table staff select * from track_log;
5. Hive導出數據有幾種方式?如何導出數據負載均衡
- 用insert overwrite導出方式
- 導出到本地:
- insert overwrite local directory ‘/home/robot/1/2’ rom format delimited fields terminated by ‘\t’ select * from staff;(遞歸建立目錄)
- 導出到HDFS
- insert overwrite directory ‘/user/hive/1/2’ rom format delimited fields terminated by ‘\t’ select * from staff;
- Bash shell覆蓋追加導出
- 例如:$ bin/hive -e 「select * from staff;」 > /home/z/backup.log
- Sqoop把hive數據導出到外部
6. hive 內部表和外部表區別函數
- 建立表時:建立內部表時,會將數據移動到數據倉庫指向的路徑;若建立外部表,僅記錄數據所在的路徑, 不對數據的位置作任何改變。
- 刪除表時:在刪除表的時候,內部表的元數據和數據會被一塊兒刪除, 而外部表只刪除元數據,不刪除數據。這樣外部表相對來講更加安全些,數據組織也更加靈活,方便共享源數據。
7. 分區和分桶的區別
分區oop
- 是指按照數據表的某列或某些列分爲多個區,區從形式上能夠理解爲文件夾,好比咱們要收集某個大型網站的日誌數據,一個網站天天的日誌數據存在同一張表上,因爲天天會生成大量的日誌,致使數據表的內容巨大,在查詢時進行全表掃描耗費的資源很是多。
- 那其實這個狀況下,咱們能夠按照日期對數據表進行分區,不一樣日期的數據存放在不一樣的分區,在查詢時只要指定分區字段的值就能夠直接從該分區查找。
分桶
- 分桶是相對分區進行更細粒度的劃分。
- 分桶將整個數據內容安裝某列屬性值得hash值進行區分,如要按照name屬性分爲3個桶,就是對name屬性值的hash值對3取摸,按照取模結果對數據分桶。
- 如取模結果爲0的數據記錄存放到一個文件,取模爲1的數據存放到一個文件,取模爲2的數據存放到一個文件。
8. Hive優化
通用設置
- hive.optimize.cp=true:列裁剪
- hive.optimize.prunner:分區裁剪
- hive.limit.optimize.enable=true:優化LIMIT n語句
- hive.limit.row.max.size=1000000:
- hive.limit.optimize.limit.file=10:最大文件數
本地模式(小任務)
- job的輸入數據大小必須小於參數:hive.exec.mode.local.auto.inputbytes.max(默認128MB)
- job的map數必須小於參數:hive.exec.mode.local.auto.tasks.max(默認4)
- job的reduce數必須爲0或者1
- hive.exec.mode.local.auto.inputbytes.max=134217728
- hive.exec.mode.local.auto.tasks.max=4
- hive.exec.mode.local.auto=true
- hive.mapred.local.mem:本地模式啓動的JVM內存大小
併發執行
- hive.exec.parallel=true ,默認爲false
- hive.exec.parallel.thread.number=8
- Strict Mode:
- hive.mapred.mode=true,嚴格模式不容許執行如下查詢:
- 分區表上沒有指定了分區
- 沒有limit限制的order by語句
- 笛卡爾積:JOIN時沒有ON語句
動態分區
- hive.exec.dynamic.partition.mode=strict:該模式下必須指定一個靜態分區
- hive.exec.max.dynamic.partitions=1000
- hive.exec.max.dynamic.partitions.pernode=100:在每個mapper/reducer節點容許建立的最大分區數
- DATANODE:dfs.datanode.max.xceivers=8192:容許DATANODE打開多少個文件
推測執行
- mapred.map.tasks.speculative.execution=true
- mapred.reduce.tasks.speculative.execution=true
- hive.mapred.reduce.tasks.speculative.execution=true;
多個group by合併
- hive.multigroupby.singlemar=true:當多個GROUP BY語句有相同的分組列,則會優化爲一個MR任務
虛擬列
- hive.exec.rowoffset:是否提供虛擬列
分組
- 兩個彙集函數不能有不一樣的DISTINCT列,如下表達式是錯誤的:INSERT OVERWRITE TABLE pv_gender_agg SELECT pv_users.gender, count(DISTINCT pv_users.userid), count(DISTINCT pv_users.ip) FROM pv_users GROUP BY pv_users.gender;
- SELECT語句中只能有GROUP BY的列或者彙集函數。
Combiner聚合
- hive.map.aggr=true;在map中會作部分彙集操做,效率更高但須要更多的內存。
- hive.groupby.mapaggr.checkinterval:在Map端進行聚合操做的條目數目
數據傾斜
- hive.groupby.skewindata=true:數據傾斜時負載均衡,當選項設定爲true,生成的查詢計劃會有兩個MRJob。
- 第一個MRJob 中,Map的輸出結果集合會隨機分佈到Reduce中,每一個Reduce作部分聚合操做,並輸出結果,這樣處理的結果是相同的GroupBy Key
- 有可能被分發到不一樣的Reduce中,從而達到負載均衡的目的;
- 第二個MRJob再根據預處理的數據結果按照GroupBy Key分佈到Reduce中(這個過程能夠保證相同的GroupBy Key被分佈到同一個Reduce中),最後完成最終的聚合操做。
排序
- ORDER BY colName ASC/DESC
- hive.mapred.mode=strict時須要跟limit子句
- hive.mapred.mode=nonstrict時使用單個reduce完成排序
- SORT BY colName ASC/DESC :每一個reduce內排序
- DISTRIBUTE BY(子查詢狀況下使用 ):控制特定行應該到哪一個reducer,並不保證reduce內數據的順序
- CLUSTER BY :當SORT BY 、DISTRIBUTE BY使用相同的列時。
合併小文件
- hive.merg.mapfiles=true:合併map輸出
- hive.merge.mapredfiles=false:合併reduce輸出
- hive.merge.size.per.task=256*1000*1000:合併文件的大小
- hive.mergejob.maponly=true:若是支持CombineHiveInputFormat則生成只有Map的任務執行merge
- hive.merge.smallfiles.avgsize=16000000:文件的平均大小小於該值時,會啓動一個MR任務執行merge。
自定義map/reduce數目
- 減小map數目:
- set mapred.max.split.size
- set mapred.min.split.size
- set mapred.min.split.size.per.node
- set mapred.min.split.size.per.rack
- set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat
2. 增長map數目:
- 當input的文件都很大,任務邏輯複雜,map執行很是慢的時候,能夠考慮增長Map數,來使得每一個map處理的數據量減小,從而提升任務的執行效率。
- 假設有這樣一個任務:select data_desc, count(1), count(distinct id),sum(case when …),sum(case when ...),sum(…) from a group by data_desc
若是表a只有一個文件,大小爲120M,但包含幾千萬的記錄,若是用1個map去完成這個任務,確定是比較耗時的,這種狀況下,咱們要考慮將這一個文件 合理的拆分紅多個,這樣就能夠用多個map任務去完成。
set mapred.reduce.tasks=10;
create table a_1 as select * from a distribute by rand(123);
3.這樣會將a表的記錄,隨機的分散到包含10個文件的a_1表中,再用a_1代替上面sql中的a表,則會用10個map任務去完成。每一個map任務處理大於12M(幾百 萬記錄)的數據,效率確定會好不少。
3.reduce數目設置:
- 參數1:hive.exec.reducers.bytes.per.reducer=1G:每一個reduce任務處理的數據量
- 參數2:hive.exec.reducers.max=999(0.95*TaskTracker數):每一個任務最大的reduce數目
- reducer數=min(參數2,總輸入數據量/參數1)
- set mapred.reduce.tasks:每一個任務默認的reduce數目。典型爲0.99*reduce槽數,hive將其設置爲-1,自動肯定reduce數目。
使用索引:
- hive.optimize.index.filter:自動使用索引
- hive.optimize.index.groupby:使用聚合索引優化GROUP BY操做
原文連接:https://blog.csdn.net/wxfghy/article/details/81361400