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
这个两个条件是与的条件,必定要都知足才能够。