我是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这样的系统来做这些监控工作?