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



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

好的,我们可以进入正题。我们正在开发一种软件,可以监控系统并定期捕获其CPU使用情况,例如每5秒,并且我们为一系列时间段的系统绘制使用情况图,例如,过去12小时的CPU使用情况,上周等。为此,我们使用预言机数据库。目前我们正计划迁移到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) ....

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

只需要一个作业。映射任务将输出 - 键:系统 ID,值:CPU 使用情况,日期。

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

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

您没有提供确切的示例,但是类似的东西:

地图:

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);
    //............
}

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

乔布先生:

MAP 相位输出 - 输出 {'系统 ID' , [CPU 使用率列表]}

减速器相位 - 计算平均值和其他信息。

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

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

相关内容

  • 没有找到相关文章

最新更新