1

我是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) ....

可能吗。或者我们的想法是错误的..请帮助...

4

2 回答 2

1

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

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

映射输出值将是继承自 Writeable 的自定义类。

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

地图:

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);
    //............
}
于 2013-10-30T07:37:11.177 回答
0

不需要两个单独的 MR 任务。

工作先生:

MAP 相位输出 - 输出 {'system Id' , [List of CPU usage]}

Reducer Phase - 计算平均值和其他信息。

如果您可以提供示例输入数据,则可以提供更详细的键值对描述。

为什么不使用像 Nagios 这样的系统来完成这些监控工作?

于 2013-10-30T07:42:42.727 回答