【发布时间】:2015-05-21 08:31:32
【问题描述】:
我是新手。我很想知道如何将减速器设置为不同的配置单元数据集。它是基于处理的数据的大小吗?还是为所有人提供一组默认的减速器?
例如,5GB 的数据需要多少个 reducer?相同数量的 reducer 会设置为更小的数据集吗?
提前致谢!!干杯!
【问题讨论】:
我是新手。我很想知道如何将减速器设置为不同的配置单元数据集。它是基于处理的数据的大小吗?还是为所有人提供一组默认的减速器?
例如,5GB 的数据需要多少个 reducer?相同数量的 reducer 会设置为更小的数据集吗?
提前致谢!!干杯!
【问题讨论】:
在开源 hive 中(可能还有 EMR)
# reducers = (# bytes of input to mappers)
/ (hive.exec.reducers.bytes.per.reducer)
默认 hive.exec.reducers.bytes.per.reducer 为 1G。
reducer 的数量还取决于输入文件的大小 您可以通过设置属性 hive.exec.reducers.bytes.per.reducer 来更改它:
通过更改 hive-site.xml
hive.exec.reducers.bytes.per.reducer 1000000
或使用集合
hive -e "设置 hive.exec.reducers.bytes.per.reducer=100000
【讨论】:
在 MapReduce 程序中,reducer 是根据 reducer 输入中的 key 分配的。因此,对于分组输入中的每一对都会调用 reduce 方法。它与数据大小无关。
假设如果您要执行一个简单的字数统计程序并且文件大小为 1 MB,但映射器输出包含 5 个密钥,这些密钥将用于 reducer 进行归约,那么就有机会获得 5 个 reducer 来执行该任务。
但是假设如果你有 5GB 的数据并且 mapper 输出只包含一个键,那么只有一个 reducer 将被分配来将数据处理到 reducer 阶段。
hive 中 reducer 的数量也由以下配置控制:
mapred.reduce.tasks
Default Value: -1
每个作业的默认减少任务数。通常设置为接近可用主机数量的素数。当 mapred.job.tracker 为“本地”时忽略。 Hadoop 默认将此设置为 1,而 hive 使用 -1 作为其默认值。通过将此属性设置为 -1,Hive 将自动计算出减速器的数量。
hive.exec.reducers.bytes.per.reducer
Default Value: 1000000000
默认为1G,即如果输入大小为10G,则使用10个reducer。
hive.exec.reducers.max
Default Value: 999
将使用最大数量的减速器。如果配置参数 mapred.reduce.tasks 中指定的一个为负数,hive 在自动确定 reducer 数量时会使用这个作为最大 reducer 数量。
减少了多少?
reduce 的正确数量似乎是 0.95 or 1.75 乘以 (<no. of nodes> * mapred.tasktracker.reduce.tasks.maximum).
使用0.95,所有reduce 都可以立即启动并在映射完成时开始传输映射输出。使用1.75,更快的节点将完成第一轮reduce,并启动第二波reduce,从而更好地实现负载平衡。
增加reduce数量会增加框架开销,但会增加负载平衡并降低故障成本。上面的缩放因子略小于整数,以便在框架中为推测任务和失败任务保留一些reduce槽.
来源:http://hadoop.apache.org/docs/r1.2.1/mapred_tutorial.html
请查看以下链接以获取有关减速器的更多说明。
【讨论】:
hive.exec.reducers.bytes.per.reducer
Default Value: 1,000,000,000 prior to Hive 0.14.0; 256 MB (256,000,000) in Hive 0.14.0 and later
来源:https://cwiki.apache.org/confluence/display/Hive/Configuration+Properties
【讨论】: