Hive 面試題整理

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,嚴格模式不容許執行如下查詢:
  1.  分區表上沒有指定了分區
  2.  沒有limit限制的order by語句
  3.  笛卡爾積: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數目

  1. 減小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數目:

  1. 當input的文件都很大,任務邏輯複雜,map執行很是慢的時候,能夠考慮增長Map數,來使得每一個map處理的數據量減小,從而提升任務的執行效率。
  2. 假設有這樣一個任務: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

相關文章
相關標籤/搜索