Hadoop и MapReduce, Как отправить эквивалент массива строк, извлеченных из CSV-функции в функцию карты, где каждый массив содержит строки x - y; - PullRequest
0 голосов
/ 28 августа 2011

Хорошо, поэтому я много читал о Hadoop и MapReduce, и, возможно, это потому, что я не так хорошо знаком с итераторами, как большинство, но у меня есть вопрос, на который я тоже не могу найти прямой ответ. В принципе, насколько я понимаю, функция map выполняется параллельно многими машинами и / или ядрами. Таким образом, все, над чем вы работаете, не должно зависеть от того, какой предыдущий код выполняется программой, чтобы добиться какого-либо увеличения скорости. Это прекрасно работает для меня, но то, что я делаю, требует от меня тестирования информации небольшими партиями. В основном мне нужно отправлять пакеты строк в .csv в виде массивов по 32, 64, 128 или любой другой строки. Как строки 0–127 относятся к выполнению функции map1 в функции core1, строки 128–255 - к функциям core2 и т. Д., И так далее. Также мне нужно, чтобы содержимое каждой партии было доступно как целое внутри функции, как если бы я передал ей массив. Я немного читал о том, как новый Java-API допускает что-то, называемое push и pull, и что это позволяет отправлять вещи партиями, но я не смог найти пример кода. Я не знаю, я собираюсь продолжить исследования, и я опубликую все, что я найду, но если кто-нибудь знает, могли бы они опубликовать в этой теме. Я был бы очень признателен за любую помощь, которую я мог бы получить.

редактировать

Если бы вы могли просто убедиться, что чанки .csv отправляются в последовательности, вы могли бы сделать это заранее. Я предполагаю, что это также предполагает наличие глобалов в mapreduce.

//** concept not code **//

GLOBAL_COUNTER = 0;
GLOBAL_ARRAY = NEW ARRAY();

map()
{ 

GLOBAL_ARRAY[GLOBAL_COUNTER] = ITERATOR_VALUE;

GLOBAL_COUNTER++;
if(GLOBAL_COUNTER == 127)
{
//EXECUTE TEST WITH AN ARRAY OF 128 VALUES FOR COMPARISON
GLOBAL_COUNTER = 0;
}

}

Ответы [ 3 ]

1 голос
/ 30 августа 2011

Если вы пытаетесь получить часть строк из вашего CSV-файла в маппер, вы можете подумать о написании вашего собственного InputFormat / RecordReader и, возможно, вашего собственного объекта WritableComparable. С помощью пользовательского InputFormat / RecordReader вы сможете указать, как объекты создаются и передаются в маппер на основе полученного вами ввода.

Если преобразователь делает то, что вам нужно, но вам нужно, чтобы эти фрагменты строк отправлялись в редуктор, сделайте клавишу вывода для преобразователя одинаковой для каждой строки, которую вы хотите в той же функции сокращения.

По умолчанию TextInputFormat будет выдавать ваш маппер следующим образом (ключи / смещения в этом примере - просто случайные числа):

0    Hello World
123  My name is Sam
456  Foo bar bar foo

Каждая из этих строк будет считана в ваш маппер как пара ключ-значение. Просто измените ключ так, чтобы он был одинаковым для каждой нужной вам строки, и запишите его в вывод:

0    Hello World
0    My name is Sam
1    Foo bar bar foo

При первом чтении функции Reduce она получит пару ключ-значение, ключом будет "0", а значением будет Итерируемый объект, содержащий "Hello World" и "My name is Sam". Вы сможете получить доступ к обоим этим значениям в одном и том же вызове метода Reduce с помощью объекта Iterable.

Вот некоторый псевдокод:

int count = 0
map (key, value) {
      int newKey = count/2
      context.write(newKey,value)
      count++
}

reduce (key, values) {
    for value in values
        // Do something to each line
}

Надеюсь, это поможет. :)

0 голосов
/ 01 сентября 2011

Если вы просто хотите отправить N строк ввода одному мапперу, вы можете использовать класс NLineInputFormat .Затем вы можете выполнить разбор строк (разделение на запятые и т. Д.) В преобразователе.

Если вы хотите иметь доступ к строкам до и после строки, обрабатываемой преобразователем в данный момент, вам, возможно, придется написатьсобственный формат ввода.Подклассы FileInputFormat обычно являются хорошим местом для начала.Вы можете создать InputFormat, который читает N строк, объединяет их и отправляет их как один блок в преобразователь, который затем снова разбивает входные данные на N строк и начинает обработку.

Что касается глобалов в Hadoop,Вы можете указать некоторые пользовательские параметры при создании конфигурации задания, но, насколько мне известно, вы не можете изменить их в работнике и ожидать, что это изменение будет распространяться по всему кластеру.Чтобы установить параметр задания, который будет виден работникам, выполните следующие действия при создании задания:

job.getConfiguration().set(Constants.SOME_PARAM, "my value");

Затем, чтобы прочитать значение параметров в картотеке или редукторе,

public void map(Text key, Text value, Context context) {

        Configuration conf = context.getConfiguration();
        String someParam = conf.get(Constants.SOME_PARAM);

        // use someParam in processing input
}

Hadoop поддерживает базовые типы, такие как int, long, string, bool и т. Д., Которые должны использоваться в параметрах.

0 голосов
/ 28 августа 2011

Если конечная цель того, что вы хотите, - заставить определенные наборы обращаться к определенным машинам для обработки, вам нужно написать свой собственный Partitioner .В противном случае Hadoop автоматически разделит данные для вас в зависимости от количества редукторов.

Я предлагаю прочитать учебник на сайте Hadoop , чтобы лучше понять M / R.

...