算法
例如:select * from score;sql
在這種狀況下,Hive能夠簡單地讀取employee對應的存儲目錄下的文件,而後輸出查詢結果到控制檯 apache
在hive-default.xml.template文件中 ==hive.fetch.task.conversion默認是more==,老版本hive默認是minimal,該屬性修改成more之後,app
在全局查找、字段查找、limit查找等都不走mapreduce。負載均衡
案例實操jvm
把 hive.fetch.task.conversion設置成==none==分佈式
set hive.fetch.task.conversion=none; select * from score; select s_id from score; select s_id from score limit 3;
ide
set hive.fetch.task.conversion=more; select * from score; select s_id from score; select s_id from score limit 3;
oop
Hive能夠經過本地模式在單臺機器上處理任務。對於小數據集,執行時間能夠明顯被縮短。性能
--開啓本地模式,並執行查詢語句 set hive.exec.mode.local.auto=true; //開啓本地mr --設置local mr的最大輸入數據量,當輸入數據量小於這個值時採用local mr的方式, --默認爲134217728,即128M set hive.exec.mode.local.auto.inputbytes.max=50000000; --設置local mr的最大輸入文件個數,當輸入文件個數小於這個值時採用local mr的方式, --默認爲4 set hive.exec.mode.local.auto.input.files.max=5; --執行查詢的sql語句 select * from student cluster by s_id;
--關閉本地運行模式 set hive.exec.mode.local.auto=false; select * from student cluster by s_id;
有時join超時是由於某些key對應的數據太多,而相同key對應的數據都會發送到相同的reducer上,從而致使內存不夠。
--開啓MapJoin參數設置 set hive.auto.convert.join = true;
並非全部的聚合操做都須要在Reduce端完成,不少聚合操做均可以先在Map端進行部分聚合,最後在Reduce端得出最終結果。
--是否在Map端進行聚合,默認爲True set hive.map.aggr = true; --在Map端進行聚合操做的條目數目 set hive.groupby.mapaggr.checkinterval = 100000; --有數據傾斜的時候進行負載均衡(默認是false) set 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中),最後完成最終的聚合操做。
列剪裁
只獲取須要的列的數據,減小數據輸入。
分區裁剪
分區在hive實質上是目錄,分區裁剪能夠方便直接地過濾掉大部分數據。
儘可能使用分區過濾
把一個sql語句中沒有相互依賴的階段並行去運行。提升集羣資源利用率
--開啓並行執行 set hive.exec.parallel=true; --同一個sql容許最大並行度,默認爲8。 set hive.exec.parallel.thread.number=16;
經過設置屬性hive.mapred.mode值爲默認是非嚴格模式nonstrict 。開啓嚴格模式須要修改hive.mapred.mode值爲strict
--設置非嚴格模式(默認) set hive.mapred.mode=nonstrict; --設置嚴格模式 set hive.mapred.mode=strict;
(1)對於分區表,除非where語句中含有分區字段過濾條件來限制範圍,不然不容許執行
--設置嚴格模式下 執行sql語句報錯; 非嚴格模式下是能夠的 select * from order_partition; 異常信息:Error: Error while compiling statement: FAILED: SemanticException [Error 10041]: No partition predicate found for Alias "order_partition" Table "order_partition"
(2)對於使用了order by語句的查詢,要求必須使用limit語句
--設置嚴格模式下 執行sql語句報錯; 非嚴格模式下是能夠的 select * from order_partition where month='2019-03' order by order_price; 異常信息:Error: Error while compiling statement: FAILED: SemanticException 1:61 In strict mode, if ORDER BY is specified, LIMIT must also be specified. Error encountered near token 'order_price'
(3)限制笛卡爾積的查詢,嚴格模式下,避免出現笛卡爾積的查詢
<property> <name>mapreduce.job.jvm.numtasks</name> <value>10</value> <description>How many tasks to run per jvm. If set to -1, there is no limit. </description> </property>
咱們也能夠在hive當中經過
set mapred.job.reuse.jvm.num.tasks=10;
<property> <name>mapreduce.map.speculative</name> <value>true</value> <description>If true, then multiple instances of some map tasks may be executed in parallel.</description> </property> <property> <name>mapreduce.reduce.speculative</name> <value>true</value> <description>If true, then multiple instances of some reduce tasks may be executed in parallel.</description> </property>
不過hive自己也提供了配置項來控制reduce-side的推測執行:
<property> <name>hive.mapred.reduce.tasks.speculative.execution</name> <value>true</value> <description>Whether speculative execution for reducers should be turned on. </description> </property>
關於調優這些推測執行變量,還很難給一個具體的建議。若是用戶對於運行時的誤差很是敏感的話,那麼能夠將這些功能關閉掉。若是用戶由於輸入數據量很大而須要執行長時間的map或者Reduce task的話,那麼啓動推測執行形成的浪費是很是巨大大。
Hive表中間數據壓縮
#設置爲true爲激活中間數據壓縮功能,默認是false,沒有開啓 set hive.exec.compress.intermediate=true; #設置中間數據的壓縮算法 set mapred.map.output.compression.codec= org.apache.hadoop.io.compress.SnappyCodec;
Hive表最終輸出結果壓縮
set hive.exec.compress.output=true; set mapred.output.compression.codec = org.apache.hadoop.io.compress.SnappyCodec;
more