Количество строк с использованием карты уменьшить - PullRequest
0 голосов
/ 27 июня 2018

У меня есть пара тысяч файлов, которые каждый день отправляются в каталог от других людей, каждый файл размером от 400 МБ до 1 ГБ.

Я хочу подсчитать общее количество строк в каталоге.

Я планировал уменьшить карту, как показано ниже

Mapper

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);
    }
}

1010 * Переходник *

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);
    }
}

Но, подумав об этом, я чувствую, что узлы редуктора будут перегружены, так как есть только 1 ключ.

Есть ли способ избежать этого?

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

Это может быть быстрее через Hive. Ниже изложен один из возможных подходов:

Создать каталог HDFS для хранения данных

$ hadoop fs -mkdir /hive-data
$ hadoop fs -mkdir /hive-data/linecount

Создание таблицы Hive

hive> CREATE EXTERNAL TABLE linecount
(
  line string
)
LOCATION
  'hdfs:///hive-data/linecount'

Загрузка файлов данных в HDFS

$ hadoop fs -put a.txt hdfs:///hive-data/linecount
$ hadoop fs -put b.txt hdfs:///hive-data/linecount
$ hadoop fs -put c.txt hdfs:///hive-data/linecount

Количество по запросу Hive

hive> select count(*) from linecount;
0 голосов
/ 28 июня 2018

Если вы хотите использовать mapreduce для этого, тогда лучше всего использовать счетчики. Измените ваш маппер на что-то вроде этого и установите число редукторов равным 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);
        }
}
...