Hadoop: установите переменную наподобие hashSet только один раз, чтобы ее можно было использовать несколько раз в каждой задаче карты - PullRequest
1 голос
/ 22 января 2012

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

Ответы [ 4 ]

2 голосов
/ 22 января 2012

Похоже, вы не совсем поняли стратегию выполнения Hadoop.

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

Что вы можете сделать, так это установить HashSet для каждой задачи в начале вычисления.

Поэтому вы можете переопределить метод setup(Context ctx). Это будет вызвано до вызова метода map.

Однако вам нужно достаточно оперативной памяти для хранения HashSet в каждой задаче.

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

1 голос
/ 22 января 2012

Задачи карты выполняются на нескольких узлах, и у каждого узла есть несколько JVM, в которых выполняются задачи карты.Таким образом, как есть, невозможно разделить HashSet между задачами карты.Существует несколько способов решения проблемы, упомянутой в OP

  1. Использование задача jvm, повторное использование .

  2. Использование решение распределенного кэша .

0 голосов
/ 23 января 2012

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

0 голосов
/ 22 января 2012

Если вы объявите HaseSet как статический, он будет инициализирован один раз для каждой задачи Если вам нужно разделить его между задачами, вам нужен общий ресурс, такой как распределенный кеш, упомянутый Praveen

...