如何使用mapreduce处理日志文件

twh00eeo  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(336)

我想了解如何使用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));
41zrol4v

41zrol4v1#

你在这里走的是正确的道路,而不是在值中传递1。自定义\u键将以30分钟的间隔显示时间

output.collect(custom_key, one);

您可以传递整个日志文本。

output.collect(customkey, log_text);

在reducer中,您将在iterable中接收整个日志文本。在reducer中解析它并使用相关字段。

map<source,datatransferred>
for loop on iterable
   parse log text line
   extract file_name,source, Total_transffered_size
   store the sum of data into the map against the source
end loop

for loop on map
    output time,source,sum calculated in above step
end loop

答案有两个假设
不要介意多个输出文件
不关心输出的顺序

相关问题