java - 使用 MapReduce 进行行计数

标签 java hadoop mapreduce

我每天都有几千个文件从其他人那里放到目录中,每个文件大约 400MB 到 1GB 大。

我想计算目录中的总行数。

我打算像下面这样进行 map 缩减

映射器

public static class LineMapper
        extends Mapper<Object, Text, Text, IntWritable>{

    private final static IntWritable one = new IntWritable(1);

    public void map(Object key, Text value, Context context
    ) throws IOException, InterruptedException {

        context.write("static_key", one);
    }
}

reducer

public static class IntSumReducer
        extends Reducer<Text,IntWritable,Text,IntWritable> {
    private IntWritable result = new IntWritable();

    public void reduce(Text key, Iterable<IntWritable> values,
                       Context context
    ) throws IOException, InterruptedException {
        int sum = 0;
        for (IntWritable val : values) {
            sum += val.get();
        }
        result.set(sum);
        context.write(key, result);
    }
}

但是经过思考,我觉得reducer节点将会不堪重负,因为只有1个key。

有办法避免这种情况吗?

最佳答案

如果你想为此使用mapreduce,那么最好的选择是使用计数器。将您的映射器更改为类似的内容并将 reducer 数量设置为 0。

public static class LineMapper extends Mapper<Object, Text, Text, IntWritable>{

        enum MyCounters {
            TOTAL_COUNT;
        }


        public void map(Object key, Text value, Context context) throws IOException, InterruptedException {
                 context.getCounter(MyCounters.TOTAL_COUNT).increment(1L);
        }
}

关于java - 使用 MapReduce 进行行计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51069818/

相关文章:

java - 无法在 Heroku 部署的应用程序上启用 COAP

java - 我可以在 String.format 中预编译格式字符串吗? (或者做任何其他事情来更快地格式化日志?)

csv - 在 Hue 中上传/导入 .csv - 指定正确的分隔符等

高内存机器上的Hadoop单节点配置

hadoop - 在MapReduce程序的reducer功能中比较来自同一文件的数据

java - 在 WAR 文件的 lib 目录中包含源 JAR(Web 应用程序的)

java - 如何在jar中包含静态文件

hadoop - 如何部署Spark,使其可以最大程度地利用资源

hadoop - 使用 MapReduce 的 Hive 表数据

java - Mapreduce 作业到 HBase 抛出 IOException : Pass a Delete or a Put