如何提高使用mapreduce分析日志文件的性能



我们必须使用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);

这同样适用于您使用的字符串-" ""-"。将它们分配为静态变量,避免每次都创建新的变量。

相关内容

  • 没有找到相关文章

最新更新