我们必须使用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〕队列"weblogic.kernel.Default(自调优)"的ExecuteThread:"0"]INFO TempServer实现-||服务器:loclhost 121.1.0.0|服务类别:测试|服务方式:添加|应用程序Id:测试|状态代码:200 |持续时间:594ms ||
有人能帮我调整一下表演吗。
谢谢Sai
您可以尝试使用SPARK(我们可以认为这是内存中的映射减少),它比传统的映射减少快10到100倍。在使用之前,请检查hadoop-map-reduce和SPARK之间的权衡。
有两种主要方法可以加快工作速度,输入大小和变量初始化。
输入大小
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);
这同样适用于您使用的字符串-" "
和"-"
。将它们分配为静态变量,避免每次都创建新的变量。