gpt4 book ai didi

java - 如何将一个 mapreduce 作业的输出作为另一个 mapreduce 作业的输入?

转载 作者:可可西里 更新时间:2023-11-01 15:39:12 24 4
gpt4 key购买 nike

我是 mapreduce 和 hadoop 的新手。我阅读了 mapreduce 的示例和设计模式...

好的,我们可以进入正题了。我们正在开发一种软​​件,可以监控系统并定期捕获它们的 CPU 使用情况,比如每 5 秒一次。我们绘制了一系列时间段内系统的使用情况图,比如过去 12 小时、上周等的 CPU 使用情况。为此我们使用了 Oracle 数据库。目前我们正计划迁移到 hadoop。

我们讨论并提出了如下的mapreduce设计:

我们应该运行 2 个 mapreduce 作业

第一份工作:

为所有系统收集持久化数据并按系统 ID 对它们进行分组(归约)假设输出为,

pc-1 : [ list of recorded cpu useges (in every 5 sec) ]

然后这个会交给下一个工作

第二份工作:

输入是:[系统记录的 cpu 使用列表(每 5 秒)]

然后这个作业将把这些数据分组并简化为如下输出格式:


last 12 hrs : 20%(average)
last 24 hrs : 28%(average)
last week : 10%(average) ....

这可能吗?或者我们的想法是错误的..请帮忙...

最佳答案

只需要一份工作。 Map 任务将输出 - key: system-id, value: cpu-usage, date.

Reduce 任务将为每个系统 ID 输出每个请求时间范围的平均值。

Map 输出值将是一个继承自 Writeable 的自定义类。

你没有提供一个确切的例子,但是类似的东西:

map :

proctected void map(LongWritable key, Text value, Context context) {
String[] fields = value.split("\t");
output.set(Integer.parseInt(fields[1]));
context.write(new Text(fields[0]), new Details(fields[1],fields[2]));
}

减少:

DoubleWritable average = new DoubleWritable();
protected void reduce(Text key, Iterable<Details> values, Context context) {
int[] sums = new int{0,0,0........};
int[] counts = new int{0,0,0.........};
int sum = 0;
int count = 0;
for(IntWritable value : values) {
//for last 24 hours
//if value is of last day........
sums[0] += value.get();
counts[0]++;
//for last week
//if value is of last week........
sums[1] += value.get();
counts[1]++;
}
//for last 24 hours
average.set(sums[0] / (double) counts[0]);
context.Write(key, average);
//for last week
average.set(sums[1] / (double) counts[1]);
context.Write(key, average);
//............
}

关于java - 如何将一个 mapreduce 作业的输出作为另一个 mapreduce 作业的输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19675922/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com