如何使用mapreduce

时间:2015-12-01 11:34:12

标签: java performance hadoop 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]   ExecuteThread:' 0'对于队列:' weblogic.kernel.Default(自我调整)']   INFO TempServerImplementation - ||服务器:loclhost 121.1.0.0 |   服务类别:测试|服务方式:添加|应用程序ID:测试   |状态代码:200 |持续时间:594ms ||

有人可以帮助我如何调整表现。

由于 西

2 个答案:

答案 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);

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

相关问题