hive中设置maptask和reducetask的数量

maptask个数取决于:split逻辑切片的个数有关, 在mapreduce中,split逻辑切片和表中文件大小和文件个数、blockSize等参数有关。

hive底层读取表默认使用的是CombineHiveInputFormat,会对小文件进行合并,

CombineHiveInputFormat底层逻辑切片计算的过程如下:

1. 如果文件大小大于split.maxsize的2倍,则形成一个独立的逻辑切片

2. 如果文件大小大于split.maxsize,但是小于split.maxsize的2倍,则拆分成两个平均大小的虚拟存储

3. 如果文件大小小于split.maxsize,则形成一个虚拟存储

4. 判断虚拟存储的文件大小是否大于split.maxSize,如果大于等于则形成一个逻辑切片 如果虚拟存储的文件大小小于split.maxSize,则和下一个虚拟文件进行合并,直到大于split.maxsize,共同形成一个切片。

例如有三个文件大小,当参数设置为4M时

set mapreduce.input.fileinputformat.split.maxsize=4M

文件切分情况:

文件1:2M

文件2:6M [3M + 3M]

文件3:9M [4M + 2.5M + 2.5M ]

reduceTask个数取决于自己设置的参数值set mapreduce.job.reduces

set mapreduce.job.reduces=3

当参数set mapreduce.job.reduces=-1时

根据此公式进行选择  N=min(参数2,总输入数据量/参数1)

参数1:每个Reduce处理的数据量默认是256MB

set hive.exec.reducers.bytes.per.reducer=256000000

参数2:每个任务最大的reduce数,默认为1009

set hive.exec.reducers.max=1009 

举例:假如数据量是512M 默认启动: 512/256= 2

<think>嗯,用户问的是Hive如何设置Map任务的数量。这个问题我得先回忆一下Hive的调优机制。首先,Hive任务的Map数量通常是由输入数据的大小决定的,每个Map处理一个块,默认是128M。所以如果数据量大,Map数量自然多。不过用户可能想知道如何手动调整这个数量,可能是为了优化性能或者适应特定的集群资源。 接下来,我需要考虑Hive中有哪些参数可以影响Map数量。记得有mapred.min.split.sizemapred.max.split.size这两个参数,或者Hive自己的版本hive.exec.mappers.bytes.per.mapper。调整这些参数可以改变每个Map处理的数据量,进而影响数量。比如,调小每个Mapper处理的数据量,就会增加Map数量,反之则减少。 然后,用户可能还会遇到文件数量的问题,比如小文件太多,导致Map任务过多。这时候需要合并小文件,可以通过参数设置输入合并,比如hive.input.formathive.merge.mapfiles,或者在任务前进行小文件合并。 另外,用户可能会提到动态分区导致大量小文件,这时候应该检查是否开启了合并参数,比如hive.merge.mapfileshive.merge.mapredfiles,以及设置合并后的文件大小。这些参数在动态分区插入数据时特别重要,避免生成过多小文件影响性能。 还需要考虑用户是否了解任务的具体执行情况,比如如何查看当前任务的Map数量,可能通过EXPLAIN命令或者日志中的Job信息。这时候可以建议用户在实际调整参数后,运行任务并观察日志中的Map数量变化,以验证参数设置是否有效。 此外,用户可能有不同的场景,比如有的需要减少Map数量以减少任务启动开销,有的需要增加Map数量以提高并行度。这时候需要分情况讨论,给出不同的参数调整策略。比如处理大量小文件时,可以调整max.split.size来合并处理,减少Map数;而处理压缩文件时,尤其是不可分割的格式如GZIP,可能需要先解压或者重新压缩为可分割的格式如BZip2,才能有效控制Map数量。 最后,需要提醒用户参数调优需要根据集群资源数据特点综合考虑,避免极端设置导致性能下降。比如过多的Map任务会增加调度开销,而过少则可能导致资源利用不足。建议用户逐步调整参数,观察效果,找到最适合当前情况的配置。</think>在 Hive 中,Map 任务数量的控制主要通过以下参数机制实现。以下是逐步说明: --- ### 一、Map 任务数量决定因素 HiveMap 数量主要由以下两点决定: 1. **输入数据量**:每个 Map 处理的数据量由 `mapred.max.split.size` 决定(默认与 HDFS 块大小一致,通常为 128MB)。 2. **输入文件数量**:如果文件数较多且每个文件小于 `mapred.min.split.size`,可能每个文件对应一个 Map。 --- ### 二、核心控制参数 #### 1. 调整单个 Map 处理的数据量 $$ \text{Map 数量} = \frac{\text{总输入数据量}}{\text{mapred.max.split.size}} $$ ```sql -- 设置单个 Map 处理的最大数据量(单位:字节) SET mapred.max.split.size=256000000; -- 256MB SET mapred.min.split.size=256000000; -- 确保合并小文件 ``` #### 2. Hive 专用参数 ```sql -- 直接指定每个 Mapper 处理的数据量(Hive 2.0+) SET hive.exec.mappers.bytes.per.mapper=256000000; ``` #### 3. 文件合并优化 ```sql -- 合并小文件作为输入(减少 Map 数量) SET hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat; ``` --- ### 三、特殊场景优化 #### 1. 动态分区插入小文件问题 ```sql -- 开启 Map-only 任务合并小文件 SET hive.merge.mapfiles=true; SET hive.merge.mapredfiles=true; -- 如果包含 Reduce 阶段 SET hive.merge.size.per.task=256000000; -- 合并后文件大小 SET hive.merge.smallfiles.avgsize=160000000; -- 平均文件小于此值时触发合并 ``` #### 2. 压缩文件处理 - 若使用不可分割压缩格式(如 GZIP),需先解压或改用可分割格式(如 BZip2)。 --- ### 四、验证 Map 数量 1. 通过 `EXPLAIN` 命令预判: ```sql EXPLAIN SELECT * FROM table; ``` 2. 运行任务后查看日志: ``` Hadoop job information: Number of mappers: 10; Number of reducers: 1 ``` --- ### 五、注意事项 1. **避免极端设置**:Map 数量过多会增加调度开销,过少会降低并行度。 2. **资源匹配**:需与 YARN 集群的 `yarn.scheduler.maximum-allocation-mb` CPU 核心数匹配。 通过调整以上参数,可有效控制 Hive 任务的 Map 数量。建议根据实际数据量集群资源进行逐步调优。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值