如果数据太大,需要1个减速器(RHadoop)怎么办?

问题描述 投票:0回答:1

我对大数据和Hadoop的事情很陌生。我试图用mapreduce找到中位数。据我所知,maper将数据传给1个reducer,然后1个reducer进行排序,并使用以下方法找到中间值 median() 函数。

R在memmory中运行,如果数据太大,无法存储在1个reducer中,而reducer是在1台电脑上运行的,怎么办?

下面是我用RHadoop找中位数的代码例子,我是大数据和Hadoop的新手。

map <- function(k,v) {
    key <- "median"
    keyval(key, v)
}
reduce <- function(k,v) {
    keyval(k, median(v))
}

medianMR <- mapreduce (
    input= random, output="/tmp/ex3",
    map = map, reduce = reduce
)
r hadoop mapreduce rhadoop
1个回答
0
投票

根据情况,如果我们将Reducer的数量设置为0(通过设置job.setNumreduceTasks(0)),那么就不会执行任何Redducer,也不会进行任何聚合。

在你的情况下,这也取决于你是否想在一个系列中找到中位数,这可能需要多个reducer。根据您的输入集中值的范围和唯一性,您可以引入一个组合器来输出每个值的频率--减少发送到您的单个减速器的映射输出数量。然后,你的减速器可以消耗排序值频率对来识别中值。

另一种方法,如果你认为你的数据对于一个减速器来说太笨重了,那就是自定义分区器。这将键按范围桶分布(0-1000到reducer 1,1001-2000到reducer 3,...reducer n)。这将需要一些辅助工作来分析减速器的输出,并执行最终的中值计算(例如,知道每个减速器中的键数,你就可以计算哪个减速器的输出将包含中值。

你可以看看这个答案,可能会有帮助------。MapReduce中1个任务的减速器数量

© www.soinside.com 2019 - 2024. All rights reserved.