在Hive中,MapReduce和MapJoin是两个重要的优化工具,能够显著提高查询性能,本文将详细介绍这些配置参数及其作用,并通过表格形式进行说明。
MapReduce相关配置参数
参数名称 | 默认值 | 描述 |
mapred.reduce.tasks | 1 | 设置每个job的reduce任务数。 |
mapreduce.job.reduces | 1 | 设置每个job的reduce任务数。 |
hive.exec.reducers.max | 1009 | 设置最大的reduce数限制。 |
hive.exec.reducers.bytes.per.reducer | 268435456 | 设置每个reduce任务处理的字节数。 |
hive.groupby.skewindata | false | 是否对倾斜数据进行负载均衡。 |
set hive.auto.convert.join | false | 是否自动将符合条件的join转换为mapjoin。 |
set mapreduce.input.fileinputformat.split.minsize | 0 | 设置HDFS文件切分的最小大小。 |
set mapreduce.input.fileinputformat.split.maxsize | 268435456 | 设置HDFS文件切分的最大大小。 |
Hive常用配置参数
参数名称 | 默认值 | 描述 |
hive.exec.dynamic.partition | false | 是否支持动态分区。 |
hive.exec.dynamic.partition.mode | strict | 动态分区模式,strict或nonstrict。 |
hive.exec.max.dynamic.partitions | 1000 | 最大动态分区数。 |
hive.exec.max.dynamic.partitions.pernode | 100 | 每个节点允许的最大动态分区数。 |
hive.exec.reduce.dynamic.partition | true | 是否在reduce阶段执行动态分区。 |
hive.optimize.sort.dynamic.partition | true | 是否优化动态分区时的排序操作。 |
hive.exec.mode.local.auto | false | 是否根据输入数据大小决定是否在本地运行MapReduce任务。 |
hive.exec.parallel | false | 是否并行执行MapReduce任务。 |
hive.merge.mapfiles | false | 是否合并Map输出的小文件。 |
hive.merge.mapredfiles | false | 是否合并MapReduce任务结束时的小文件。 |
hive.merge.size.per.task | 268435456 | 合并文件的大小。 |
hive.merge.smallfiles.avgsize | 16000000 | 当输出文件的平均大小小于该值时,启动一个独立的MapReduce任务进行文件合并。 |
hive.auto.convert.join | false | 是否自动将普通join转换为Map join。 |
hive.auto.convert.join.noconditionaltask | false | 是否将多个Map join合并成一个任务。 |
hive.auto.convert.join.noconditionaltask.size | 100000000 | 多个Map join合并后的总大小阈值。 |
hive.mapjoin.smalltable.filesize | 25000000 | 小表的最大文件大小,超过此大小的表将不会被转换为Map join。 |
hive.mapjoin.localtask.max.memory.usage | 0.90 | Local task可以使用的最大内存百分比。 |
hive.mapjoin.followby.gby.localtask.max.memory.usage | 0.55 | 如果Map join后面紧跟着group by任务,这种情况下local task的最大内存使用率。 |
hive.mapjoin.check.memory.rows | 100000 | Local task每处理多少行数据就进行一次内存检查。 |
Map Join原理与参数
参数名称 | 默认值 | 描述 |
hive.auto.convert.join | false | 是否自动将符合条件的join转换为Map join。 |
hive.mapjoin.smalltable.filesize | 25,000,000 (25MB) | 小表的最大文件大小,超过此大小的表将不会被转换为Map join。 |
hive.auto.convert.join.noconditionaltask | false | 是否将多个Map join合并成一个任务。 |
hive.auto.convert.join.noconditionaltask.size | 100,000,000 (100MB) | 多个Map join合并后的总大小阈值。 |
hive.mapjoin.localtask.max.memory.usage | 0.90 | Local task可以使用的最大内存百分比。 |
hive.mapjoin.followby.gby.localtask.max.memory.usage | 0.55 | 如果Map join后面紧跟着group by任务,这种情况下local task的最大内存使用率。 |
hive.mapjoin.check.memory.rows | 100,000 | Local task每处理多少行数据就进行一次内存检查。 |
FAQs常见问题解答
Q1: 什么时候使用MapJoin?
A1: MapJoin适用于一个小表和一个大表进行连接的场景,由于MapJoin是在Map阶段完成的,不需要进入Reduce阶段,因此可以节省大量数据传输时间,从而提高查询效率,通常用于一个很小的表和一个大表进行join的场景,具体小表有多小,由参数hive.mapjoin.smalltable.filesize
来决定,该参数表示小表的总大小,默认值为25M。
Q2: 如何优化Hive中的MapJoin?
A2: 要优化Hive中的MapJoin,可以通过以下几种方法:
1、调整小表的大小:确保小表的大小不超过hive.mapjoin.smalltable.filesize
参数的值(默认25M),如果小表太大,可以考虑将其分割成更小的表。
2、合并多个MapJoin:通过设置hive.auto.convert.join.noconditionaltask
为true,可以将多个符合条件的MapJoin合并成一个任务,减少多次读写数据的开销。
3、增加内存使用率:调整hive.mapjoin.localtask.max.memory.usage
和hive.mapjoin.followby.gby.localtask.max.memory.usage
参数,以充分利用内存资源。
4、监控内存使用情况:定期检查Local Task的内存使用情况,确保不会因为内存不足而导致任务失败,可以通过设置hive.mapjoin.check.memory.rows
参数来控制每次内存检查的行数。
合理配置和使用这些参数可以显著提升Hive查询的性能,特别是在处理大规模数据集时。
以上就是关于“mapreduce mapjoin_Hive常用配置参数”的问题,朋友们可以点击主页了解更多内容,希望可以够帮助大家!