一、内存设置
set mapreduce.map.memory.mb=4096;// 每个Map Task需要的内存量
set mapreduce.map.java.opts=-Xmx3276M; // 每个Map Task 的JVM最大使用内存
set mapreduce.reduce.memory.mb=4096; // 每个Reduce Task需要的内存量
set mapreduce.reduce.java.opts=-Xmx3276M; // 每个Reduce Task 的JVM最大使用内存
set mapred.child.java.opts=-Xms1024M -Xmx3584M;//此参数为全局参数,既对Map和Reduce统一设置,相当于mapreduce.map.java.opts和mapreduce.reduce.java.opts的结合
memory.mb和java.opts的关系:
mapreduce.map.java.opts 其实就是启动 JVM 虚拟机时,传递给虚拟机的启动参数,而默认值 -Xmx200m 表示这个 Java 程序可以使用的最大堆内存数,一旦超过这个大小,JVM 就会抛出 Out of Memory 异常,并终止进程。而 mapreduce.map.memory.mb 设置的是 Container 的内存上限,这个参数由 NodeManager 读取并进行控制,当 Container 的内存大小超过了这个参数值,NodeManager 会负责 kill 掉 Container
二、本地模式
有时hive的输入数据量是非常小的。在这种情况下,为查询出发执行任务的时间消耗可能会比实际job的执行时间要多的多。对于大多数这种情况,hive可以通过本地模式在单台机器上处理所有的任务。
set hive.exec.mode.local.auto=true;
当一个job满足如下条件才能真正使用本地模式:
-
job的输入数据大小必须小于参数:hive.exec.mode.local.auto.inputbytes.max(默认128MB)
-
job的map数必须小于参数:hive.exec.mode.local.auto.tasks.max(默认4)
-
job的reduce数必须为0或者1
三、strict模式
对分区表进行查询,在where子句中没有加分区过滤的话,将禁止提交任务(默认:nonstrict)
set hive.mapred.mode=strict;
使用严格模式可以禁止3种类型的查询:
-
对于分区表,不加分区字段过滤条件,不能执行
-
对于order by语句,必须使用limit语句。
-
限制笛卡尔积的查询(join的时候不使用on,而使用where的)。
-
动态分区插入
四、reduce和map个数调整
SET mapreduce.job.reduces=5000; //hive on spark 和 mr都可以用
set mapreduce.input.fileinputformat.split.maxsize = 67108864; //调整 hive on mr的输入大小,以设置mr个数
set mapreduce.input.fileinputformat.split.minsize = 10485760;
set spark.hadoop.mapred.min.split.size = 268435456; //调整 spark 任务的输入大小
set spark.hadoop.mapred.max.split.size = 536870912;