Я хочу поделиться большими статическими данными в памяти (индекс RAM Lucene) для моих картографических задач в Hadoop? Есть ли способ для нескольких задач map/reduce использовать одну и ту же JVM?
Можно ли запустить несколько задач карты в одной JVM?
Ответы (4)
Задания могут разрешить повторное использование JVM задач, указав конфигурацию задания mapred.job.reuse.jvm.num.tasks. Если значение равно 1 (по умолчанию), то JVM не используются повторно (т. е. 1 задача на JVM). Если он равен -1, количество задач, которые может выполнять JVM (одного и того же задания), не ограничено. Можно также указать некоторое значение больше 1, используя API.
В $HADOOP_HOME/conf/mapred-site.xml
добавьте следующее свойство
<property>
<name>mapred.job.reuse.jvm.num.tasks</name>
<value>#</value>
</property>
#
можно установить в число, чтобы указать, сколько раз JVM будет повторно использоваться (по умолчанию 1
), или установить в -1
для неограниченного количества повторного использования.
Бессовестная вилка
Я расскажу об использовании статических объектов с повторным использованием JVM, чтобы выполнить то, что вы здесь описываете: http://chasebradford.wordpress.com/2011/02/05/distributed-cache-static-objects-and-fast-setup/
Другой вариант, хотя и более сложный, заключается в использовании распределенного кеша с отображаемым в память файлом, доступным только для чтения. Таким образом, вы также можете совместно использовать ресурс в процессах JVM.
Насколько мне известно, нет простого способа для нескольких задач карты (Hadoop) совместно использовать статические структуры данных.
На самом деле это известная проблема для текущей модели Map Reduce. Причина того, что текущая реализация не использует совместно статические данные в задачах карты, заключается в том, что Hadoop спроектирован так, чтобы быть очень надежным. В результате, если задача завершится ошибкой, произойдет сбой только ее собственной JVM. Это не повлияет на выполнение других JVM.
В настоящее время я работаю над прототипом, который может распределять работу одной JVM по нескольким ядрам (по сути, вам просто нужна одна JVM для использования нескольких ядер). Таким образом, вы можете уменьшить дублирование структур данных в памяти без затрат на использование ЦП. Следующим шагом для меня является разработка версии Hadoop, которая может выполнять несколько задач Map в рамках одной JVM, а это именно то, о чем вы просите.
Здесь есть интересный пост https://issues.apache.org/jira/browse/MAPREDUCE-2123