我们必须使用hadoop分析日志文件,因为它可以轻松处理大数据。所以,我写了一段mapreduce程序。但即使我的mapreduce程序也需要花费大量时间来获取数据。
String keys[] = value.toString().split(" ");
int keysLength = keys.length;
if(keysLength > 4 && StringUtils.isNumeric(keys[keysLength-5])) {
this.keyWords.set(keys[0]+"-"+keys[1]+" "+keys[2]+" "+keys[keysLength-5]+" "+keys[keysLength-2]);
context.write(new IntWritable(1), keyWords);
}
要求是,我们将有大多数10到15个.gz文件,每个.gz文件里面都有一个日志文件。我们必须从该日志文件中提取数据进行分析。
日志文件中的示例输入:
2015-09-12 03:39:45.201 [service_client] [anhgv-63ac7ca63ac] [[ACTIVE] ExecuteThread:' 0'对于队列:' weblogic.kernel.Default(自我调整)'] INFO TempServerImplementation - ||服务器:loclhost 121.1.0.0 | 服务类别:测试|服务方式:添加|应用程序ID:测试 |状态代码:200 |持续时间:594ms ||
有人可以帮助我如何调整表现。
由于 西
答案 0 :(得分:0)
您可以尝试使用SPARK(我们可以认为这在内存映射中减少),它比传统Map减少快10到100倍。请在使用前检查hadoop map-reduce和SPARK之间的权衡。
答案 1 :(得分:0)
有两种主要方法可以加快工作,输入大小和变量初始化。
输入尺寸
gz
不是可拆分格式。这意味着如果您有15个输入gz
个文件,那么您将只有15个映射器。我可以从评论中看到每个gz
文件都是50MB,因此在10:1的压缩率下,每个映射器将处理500MB。这可能需要一些时间,除非你有一个< 15节点集群,否则你将拥有什么都不做的节点。通过在MR作业之前解压缩数据,您可以拥有更多的映射器,从而减少运行时间。
变量初始化
在以下行中:
context.write(new IntWritable(1), keyWords);
通过为每个输出分配一个全新的IntWritable
,您将无意中听到。相反,为什么不把它分配到班级的顶端呢?它不会改变,所以每次都不需要分配。
例如:
private static final IntWritable ONE_WRITABLE = new IntWritable(1);
...
context.write(ONE_WRITABLE, keyWords);
这同样适用于您使用的字符串 - " "
和"-"
。将它们分配为静态变量,并再次避免每次都创建新的变量。