split和block的区别以及maptask和reducetask个数设定

本文详细解析了Hadoop中Split与Block的概念差异及联系,Split属于MapReduce的范畴,而Block是HDFS文件切块的基础单位。通过介绍如何通过配置文件调整Split的大小,以及它与MapTask的关系,帮助读者深入理解这两个核心概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • split和block的区别:

很多人可能认为在hadoop中的split和block是一样的,可能是因为hadoop在默认情况下split的大小和hdfs文件分块大小是一样而被误导吧。

下面来谈谈他们的区别和联系:
1.split是mapreduce中的概念,而block是hdfs中切块的大小。

2.split的大小时默认和hdfs的block块大小一致,但是可以通过配置文件自己设置:
其中有俩个配置文件(如下):

--minsize   默认大小为1
mapreduce.input.fileinputformat.split.minsize  

--maxsize   默认大小为Long.MAXValue 
mapreduce.input.fileinputformat.split.maxsize

在mapreduce的FileInputFormat类中有个getSplits() 方法对文件进行split,算法如下:

Math.max(minSize, Math.min(maxSize, blockSize));

1.如果blockSize小于maxSize && blockSize 大于 minSize之间,那么split就是blockSize;

2.如果blockSize小于maxSize && blockSize 小于 minSize之间,那么split就是minSize;

3.如果blockSize大于maxSize && blockSize 大于 minSize之间,那么split就是maxSize;


maptask和reducetask个数设定:

  • 列表内容

1.在hadoop中一个split对应一个maptask,需要改变maptask的个数就需要改变上面所描述的配置。

2.而reducetask的个数可以又自己设定

job.setNumReduceTasks(10);
### 合理设置 Hive 中 Map 数 Reduce 数的最佳实践 在 Hive 中,合理设置 Map Reduce 的数量对于任务性能至关重要。以下是关于如何根据数据量集群资源进行优化的具体说明: #### 1. **Map 数的设置** Map 数的主要决定因素包括输入文件的数量、大小以及集群中块的大小。以下是一些关键点: - 输入文件的总个数会影响 Map 数。如果存在大量小文件(远小于 HDFS 块大小,默认为 128MB),每个小文件会被当作一个单独的任务分配给一个 Map[^5]。 - 如果一个小文件占用一个 Map 任务,而其处理时间较短,则会造成大量的启动开销资源浪费。因此,在这种情况下应考虑合并小文件。 ##### 解决方案:减少 Map 数 为了减少因小文件过多而导致的低效问题,可以启用 Hive 提供的小文件合并功能: ```sql SET hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat; SET hive.exec.reducers.bytes.per.reducer=<目标值>; ``` 这将允许多个小文件被组合到同一个 Map 任务中。 ##### 解决方案:增加 Map 数 当输入文件较大且任务逻辑复杂时,可以通过调整 `mapreduce.input.fileinputformat.split.maxsize` 参数来控制每个 Split 的最大尺寸,进而增加 Map 数。例如: ```sql SET mapreduce.input.fileinputformat.split.maxsize=67108864; -- 设置为 64MB ``` 这样可以让更多的 Map 并行运行,从而加速任务执行[^5]。 --- #### 2. **Reduce 数的设置** 合理的 Reduce 数取决于以下几个方面: - 默认情况下,每个 Reduce 处理的数据量由参数 `hive.exec.reducers.bytes.per.reducer` 控制,默认值为 256MB[^3]。 - 单个任务的最大 Reduce 数由参数 `hive.exec.reducers.max` 定义,默认为 1009。 ##### 计算公式 计算 Reduce 数的通用公式如下: \[ \text{N} = \min(\text{hive.exec.reducers.max}, \frac{\text{总输入数据量}}{\text{hive.exec.reducers.bytes.per.reducer}}) \] 其中: - 总输入数据量是指参与运算的所有数据总量; - `hive.exec.reducers.bytes.per.reducer` 表示每个 Reduce 应处理的理想数据量。 ##### 实际操作案例 假设总输入数据量为 1GB(约 \(10^9\) 字节),则可以根据上述公式得出: \[ \text{N} = \min(1009, \frac{10^9}{256 * 10^6}) = \min(1009, 4) = 4 \] 此时会生成 4 个 Reduce 任务。 ##### 动态设置 Reduce 数 也可以通过手动设置 `set mapreduce.job.reduces=N` 来覆盖默认行为。不过这种方式不推荐频繁使用,因为动态调整可能导致资源配置不合理[^2]。 --- #### 3. **注意事项** - **过少的 Reduce 数**:会导致单个 Reduce 负载过高,延长任务完成时间。 - **过多的 Reduce 数**:虽然能加快某些阶段的速度,但会产生额外的初始化成本,并可能引发下游任务中小文件过多的问题[^5]。 - 对于简单的聚合查询(无 Group By 或 Order By),尽量避免不必要的 Reduce 阶段。例如,将带 Group By 的语句重写为更高效的版本。 --- ### 示例代码 以下是一个完整的配置实例,展示如何针对不同场景调整 Map Reduce 参数: ```sql -- 减少小文件带来的影响 SET hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat; -- 设置每个 Reduce 处理的数据量为 128MB SET hive.exec.reducers.bytes.per.reducer=134217728; -- 设定最大 Reduce 数为 500 SET hive.exec.reducers.max=500; -- 测试查询 SELECT COUNT(*) FROM large_table WHERE condition='value'; ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值