альтернативные решения для распределенного кэша Hadoop/Hive для обработки очень большого файла словаря?

Мы создаем словарь, подобный приложению на Hadoop и Hive. Общий процесс представляет собой пакетное сканирование миллиардов данных журнала (например, слов) по большому фиксированному словарю (около 100 ГБ, например многоязычному словарю WordNet).

У нас уже есть версия Java-приложения для одной машины (назовем это "singleApp") для запроса этого словаря. В настоящее время мы не можем изменить ни это Java-приложение, ни файл словаря, поэтому мы не можем перепроектировать и переписать полностью новое приложение MapReduce. Нам нужно использовать эту версию Java-приложения для одной машины в качестве строительного блока, чтобы расширить его до версии MapReduce.

В настоящее время мы можем создать приложение MapReduce, вызвав это «singleApp» и передать подмножество словаря (например, словарь 1G) с использованием распределенного кэша. Однако, если мы используем полный словарь (100G), приложение запускается очень и очень медленно. Кроме того, мы очень хотим установить эти словари в кластер Hadoop, не вызывая его каждый раз с параметрами -file или распределенного кэша.

Мы попытались скопировать файлы словарей напрямую на локальные диски в подчиненных узлах и указать на них java-приложению, но оно не смогло найти словарь. Любые документы о том, что нужно сделать, если мы хотим больше отладить этот подход?

Любые предложения о том, что должно быть передовой практикой/процессом для нас, чтобы справляться с такими ситуациями (очень большие файлы словарей, и вы предпочитаете постоянно устанавливать файлы словарей)?


person bigblue    schedule 14.09.2015    source источник


Ответы (1)


Вам не нужно использовать Hadoop для 100 ГБ данных. Вы также можете использовать свой распределенный кеш в качестве платформы обработки.

Рассмотрите свой распределенный кеш как сетку данных в памяти.

Попробуйте TayzGrid In-Memory DataGrid с открытым исходным кодом с MapReduce, такой как ваш.

public class ProductAnalysisMapper implements 
                             com.alachisoft.tayzgrid.runtime.mapreduce.Mapper {

    @Override
    public void map(Object ikey, Object ivalue, OutputMap omap) 
    {
          //This line emits value count to the map.
          omap.emit(ivalue, 1);
    }
}

public class ProductAnalysisReducer implements
                      com.alachisoft.tayzgrid.runtime.mapreduce.Reducer {

    public ProductAnalysisReducer(Object k) { /* ... */ }

    @Override
    public void reduce(Object iv) { /* ... */ }

    @Override
    public void finishReduce(KeyValuePair kvp) { /* ... */ }
}
person Basit Anwer    schedule 21.09.2015
comment
Привет, Басит, спасибо за помощь. Наши входные данные могут быть 10 ТБ+, а данные словаря — 100 ГБ+. Меня беспокоит производительность распределенного кеша, если мы поместим этот 100G+ файл dict в распределенный кеш. - person bigblue; 21.09.2015
comment
Вы загружаете 100G+ данных в кеш, верно? не 10ТБ+. - person Basit Anwer; 22.09.2015
comment
И я видел кэши, работающие в кластере из 6 с 200 ГБ ОЗУ каждый :) - person Basit Anwer; 22.09.2015
comment
привет, Басит, спасибо, что поделились опытом. Я проверю это. - person bigblue; 29.10.2015