Как отобразить набор текста в целом на узел? - PullRequest
0 голосов
/ 13 января 2011

Предположим, у меня есть простой текстовый файл со следующими данными:

DataSetOne <br />
content <br />
content <br />
content <br />


DataSetTwo <br />
content <br />
content <br />
content <br />
content <br />

... и так далее ...

Я хочу: посчитать, сколько содержимого в каждом наборе данных. Например, результат должен быть

<DataSetOne, 3>, <DataSetTwo, 4>

Я новичок в hadoop, мне интересно, есть ли способ отобразить кусок данных в целом на узел. например, установите весь DataSetOne для узла 1 и все DataSetTwo для узла 2.

Кто-нибудь может дать мне идею, как архивировать это?

Ответы [ 3 ]

2 голосов
/ 15 января 2011

Я думаю, что простым способом будет реализовать логику в маппере, где вы будете помнить, что такое текущий набор данных и генерировать такие пары:

(DataSetOne, content)
(DataSetOne,content)
(DataSetOne, content)

(DataSetTwo, content)
(DataSetTwo, content)

И тогда вы будете подсчитывать группы на этапе сокращения.*

Если производительность станет проблемой, я бы предложил рассмотреть комбинатор.

0 голосов
/ 15 января 2011

Прежде всего ваши наборы данных разделяются на несколько карт, если они находятся в отдельных файлах или превышают настроенный размер блока.Так что, если у вас есть один набор данных размером 128 МБ, а размер вашего блока составляет 64 МБ, hadoop 2-блок заблокирует этот файл и настроит 2 сопоставителя для каждого.Это похоже на пример wordcount в уроках hadoop.Как говорит Дэвид, вам нужно отобразить пары ключ / значение в HDFS, а затем сократить их.Я бы реализовал это так:

// field in the mapper class
int groupId = 0;

@Override
protected void map(K key, V value, Context context) throws IOException,
        InterruptedException {
    if(key != groupId)
        groupId = key;
    context.write(groupId, value);
}

@Override
protected void reduce(K key, Iterable<V> values,
        Context context)
        throws IOException, InterruptedException {
    int size = 0;
    for(Value v : values){
        size++;
    }
    context.write(key, size);
}

Как сказал Дэвид, вы можете использовать комбинатор.Комбинаторы - это простые редукторы, которые используются для сохранения ресурсов между картами и сокращения фаз.Они могут быть установлены в конфигурации.

0 голосов
/ 15 января 2011

Вы можете расширить класс FileInputFormat и реализовать интерфейс RecordReader (или, если вы используете более новый API, расширить абстрактный класс RecordReader), чтобы определить способ разделения данных.Вот ссылка, которая дает вам пример того, как реализовать эти классы, используя более старый API.

http://www.questionhub.com/StackOverflow/4235318

...