Hive執行的本地模式

Hive本地運行job老是報錯,由於雖然輸入文件很小,可是須要加載的文件很大,本地跑根本吃不消。因此想設置hive不在本地執行。一樣的問題遇到兩次了,仍是總結一下,具體的步驟以下:sql

 

(1)Hive支持任務執行選擇本地模式(local mode),對數據量比較小的操做,就能夠在本地執行,這樣要比提交任務到集羣執行效率要快不少。app

配置以下參數,能夠開啓Hive的本地模式:jvm

hive> set hive.exec.mode.local.auto=true;(默認爲false)jsp

當一個job知足以下條件才能真正使用本地模式:分佈式

1.job的輸入數據大小必須小於參數:hive.exec.mode.local.auto.inputbytes.max(默認128MB)oop

2.job的map數必須小於參數:hive.exec.mode.local.auto.tasks.max(默認4)性能

3.job的reduce數必須爲0或者1orm

可用參數hive.mapred.local.mem(默認0)控制child jvm使用的最大內存數。內存

 

具體操做:將hive配置中的hive.exec.mode.local.auto設置爲false,就能夠解決上面問題。hadoop

 

(2)在hive中運行的sql有不少是比較小的sql,數據量小,計算量小.這些比較小的sql若是也採用分佈式的方式來執行,那麼是得不償失的.由於sql真正執行的時間可能只有10秒,可是分佈式任務的生成得其餘過程的執行可能要1分鐘.這樣的小任務更適合採用lcoal mr的方式來執行.就是在本地來執行,經過把輸入數據拉回客戶端來執行.

拿select 1 from dual來看下,兩種執行方式的效率差距.

分佈式mr:

hive> select 1 from dual;
Total MapReduce jobs = 1
Launching Job 1 out of 1
Number of reduce tasks is set to 0 since there’s no reduce operator
Selecting distributed mode: Input Size (= 10) is larger than hive.exec.mode.local.auto.inputbytes.max (= -1)
Starting Job = job_201208241319_7711163, Tracking URL = http://hdpjt:50030/jobdetails.jsp?jobid=job_201208241319_7711163
Kill Command = /dhwdata/hadoop/bin/../bin/hadoop job  -Dmapred.job.tracker=hdpjt:9001 -kill job_201208241319_7711163
Hadoop job information for Stage-1: number of mappers: 1; number of reducers: 0
2012-10-15 13:16:29,825 Stage-1 map = 0%,  reduce = 0%
2012-10-15 13:16:38,044 Stage-1 map = 100%,  reduce = 0%
Ended Job = job_201208241319_7711163
OK
1
Time taken: 15.278 seconds

本地mr:

hive> select 1 from dual;
Automatically selecting local only mode for query
Total MapReduce jobs = 1
Launching Job 1 out of 1
Number of reduce tasks is set to 0 since there’s no reduce operator
Execution log at: /tmp/dwapp/dwapp_20121015131717_eb78662f-2ccd-497c-a7eb-ba9a2234e153.log
Job running in-process (local Hadoop)
Hadoop job information for null: number of mappers: 0; number of reducers: 0
2012-10-15 13:17:28,644 null map = 0%,  reduce = 0%
2012-10-15 13:17:29,646 null map = 100%,  reduce = 0%
Ended Job = job_local_0001
2012-10-15 01:17:29     End of local task; Time Taken: 6.411 sec.
OK
1
Time taken: 7.859 seconds

由於僅僅是換了執行方式,效率提升了一倍.這還不算是差距大的,還遇到過效率差4倍以上的狀況,若是jobtracker過忙,或者slots資源比較緊張的時候,這個差距會更大.

因此,合理的使用local mr對性能的提升有很是的提高.

 

具體操做:將hive配置中的hive.exec.mode.local.auto設置爲true,便可。

同時hive.exec.mode.local.auto.inputbytes.max和hive.exec.mode.local.auto.tasks.max

這個兩個條件是與的條件,必定要都知足才能夠。

相關文章
相關標籤/搜索