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

Java 如何提高mapreduce分析日志文件的性能,java,performance,hadoop,mapreduce,Java,Performance,Hadoop,Mapreduce,我们必须使用hadoop分析日志文件,因为它可以轻松处理大数据。所以,我写了一个mapreduce程序。但即使是我的mapreduce程序也要花很多时间来获取数据 String keys[] = value.toString().split(" "); int keysLength = keys.length; if(keysLength > 4 && StringUtils.isNumeric(keys[keysLength-5])) {

我们必须使用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[服务客户][anhgv-63ac7ca63ac][[ACTIVE] 队列:“weblogic.kernel.Default(自调优)”的ExecuteThread:“0” INFO TempServerImplementation-| |服务器:loclhost 121.1.0.0| 服务类别:测试|服务方式:添加|应用Id:测试 |状态代码:200 |持续时间:594ms||

有人能帮我调整一下演出吗

谢谢
Sai

您可以尝试使用SPARK(我们可以认为这是内存中的map reduce),它比传统的map reduce快10到100倍。在使用之前,请检查hadoop map reduce和SPARK之间的权衡

您可以尝试使用SPARK(我们可以认为这是内存中的map reduce),它比传统的map reduce快10到100倍。在使用之前,请检查hadoop map reduce和SPARK之间的权衡

有两种主要的加速工作的方法,输入大小变量初始化

输入大小


gz
不是可拆分格式。这意味着,如果您有15个输入
gz
文件,那么您将只有15个映射器。我可以从评论中看到,每个
gz
文件都是50MB的,因此在10:1的压缩比下,每个映射器将处理500MB的数据。这需要时间,除非你有一个,否则有两种主要的方法可以加快你的工作,输入大小和变量初始化

输入大小


gz
不是可拆分格式。这意味着,如果您有15个输入
gz
文件,那么您将只有15个映射器。我可以从评论中看到,每个
gz
文件都是50MB的,因此在10:1的压缩比下,每个映射器将处理500MB的数据。这可能需要时间,除非你有一个文件,否则你可以同时处理这些文件。请给我额外的信息?每个.gz文件大小是否相等?如果是,有多少mb?@pckmn,每个.gz都是唯一的,大小大约为50MB。创建一个ExecutorService,比如说一个固定大小的服务,它是您拥有的CPU数量。为此池中的每个文件添加一个任务以处理该文件。通过这种方式,您可以同时处理多个文件。@PeterLawrey在其当前实现中,这些文件将被并发处理。问题是您不能拆分
gz
文件,因此每个文件的整个过程都必须在同一个过程中进行处理,无论是由映射程序还是
ExecutorService
。你不需要在MapReduce中实现你自己的线程等。你可以同时处理文件。请给我额外的信息?每个.gz文件大小是否相等?如果是,有多少mb?@pckmn,每个.gz都是唯一的,大小大约为50MB。创建一个ExecutorService,比如说一个固定大小的服务,它是您拥有的CPU数量。为此池中的每个文件添加一个任务以处理该文件。通过这种方式,您可以同时处理多个文件。@PeterLawrey在其当前实现中,这些文件将被并发处理。问题是您不能拆分
gz
文件,因此每个文件的整个过程都必须在同一个过程中进行处理,无论是由映射程序还是
ExecutorService
。你不需要在MapReduce中实现你自己的线程等。有个主意吧。但是仍然用例子来验证。有一个想法。但还是用例子来验证。谢谢Ben,实际上是我的错。我试着按你说的做了改变,但没有改变执行时间。谢谢本,实际上是我的错。我试过按你说的改变,但没有改变执行时间。
context.write(new IntWritable(1), keyWords);
private static final IntWritable ONE_WRITABLE = new IntWritable(1);
...
context.write(ONE_WRITABLE, keyWords);