我想了解如何使用mapreduce处理日志文件。
例如,如果我有这样的文件传输日志:
Start_Datestamp,file_name,source, host,file_size,transfered_size
2012-11-18 T 16:05:00.000, FileA,SourceA, HostA,1Gb, 500Mb
2012-11-18 T 16:25:00.000, FileA,SourceA, HostB,1Gb, 500Mb
2012-11-18 T 16:33:00.000, FileB,SourceB, HostB,2Gb, 2GB
2012-11-18 T 17:07:00.000, FileC,SourceC, HostA,1Gb, 500Mb
2012-11-18 T 17:19:00.000, FileB,SourceC, HostA,1Gb, 500Mb
2012-11-18 T 17:23:00.000, FileA,SourceC, HostC,1Gb, 500Mb
我想这样汇总和输出:
Start_Datestamp,file_name,source, Total_transfered_size
2012-11-18 T 16:00, FileA,SourceA, 1000Mb
2012-11-18 T 16:30, FileB,SourceB, 2GB
2012-11-18 T 17:00, FileC,SourceC,500Mb
2012-11-18 T 17:00, FileB,SourceC, 500Mb
2012-11-18 T 17:00, FileA,SourceC, 500Mb
它应该以30分钟的间隔聚合文件传输,如上所示。
我使用下面的教程实现了30分钟的间隔聚合:http://www.informit.com/articles/article.aspx?p=2017061
但很简单:
Start_Datestamp,count
2012-11-18 T 16:00, 2
2012-11-18 T 16:30, 1
2012-11-18 T 17:00,3
但不知道如何使用其他字段。我尝试使用writablecomparable创建复合键来组合开始日期戳、文件名和源代码,但它不能正常工作。有人能给我指路吗?
更新!!
所以现在我用sudarshan建议打印了多个字段。然而,我遇到了另一个问题。
例如,让我们看一下上表中的示例数据:
Start_Datestamp,file_name,source, host,file_size,transfered_size
2012-11-18 T 16:05:00.000, FileA,SourceA, HostA,1Gb, 500Mb
2012-11-18 T 16:25:00.000, FileA,SourceA, HostB,1Gb, 500Mb
2012-11-18 T 16:28:00.000, FileA,SourceB, HostB,1Gb, 500Mb
我想做的是将数据按时间戳按30分钟间隔、源、和(传输的大小)分组
所以它是这样的:
Start_Datestamp,source, Total_transfered_size
2012-11-18 T 16:00,SourceA, 1000Mb <<==Please see those two records are now merged to '16:00' timestamp .
2012-11-18 T 16:00,SourceB, HostB,1Gb, 500Mb <<===this record should not be merged because different source, even though the timetamp is within '16:00' frame.
但在我的例子中,只打印每个间隔的第一条记录
e、 g.开始日期戳,来源,总转移大小2012-11-18 t 16:00,来源A,1000mb<<==仅打印此记录。另一个没有打印。
在map类中,我添加了以下spinets:
out = "," + src_loc + "," + dst_loc + "," + remote + ","
+ transfer + " " + activity + "," + read_bytes+ ","
+ write_bytes + "," + file_name + " "
+ total_time + "," + finished;
date.setDate(calendar.getTime());
output.collect(date, new Text(out));
然后在减速器中:
String newline = System.getProperty("line.separator");
while (values.hasNext()) {
out += values.next().toString() + newline;
}
output.collect(key, new Text(out));
我认为问题出在减速机迭代上。
我尝试在while循环中移动下面的代码,它似乎正在打印所有记录。但我不确定这是否是正确的方法。任何建议都将不胜感激。
output.collect(key, new Text(out));
1条答案
按热度按时间41zrol4v1#
你在这里走的是正确的道路,而不是在值中传递1。自定义\u键将以30分钟的间隔显示时间
您可以传递整个日志文本。
在reducer中,您将在iterable中接收整个日志文本。在reducer中解析它并使用相关字段。
答案有两个假设
不要介意多个输出文件
不关心输出的顺序