Объединение запросов Hadoop MapReduce и базы данных - PullRequest
1 голос
/ 26 марта 2012

Определенная работа, которую я выполняю, должна собрать некоторые метаданные из БД (MySQL, хотя это не так актуально) перед обработкой некоторых больших файлов HDFS. Эти метаданные будут добавлены к данным в файлах и переданы на последующие этапы сопоставления / объединения / сокращения.

Мне было интересно, где может быть "правильное" место для размещения этого запроса. Мне нужно, чтобы метаданные были доступны, когда маппер начинается, но размещение его там кажется излишним, так как каждый маппер будет выполнять тот же запрос. Как я могу (если вообще) выполнить этот запрос один раз и поделиться его результатами среди всех мапперов? Существует ли общий способ обмена данными между всеми узлами, выполняющими задачу (кроме записи в HDFS)? спасибо.

Ответы [ 2 ]

3 голосов
/ 26 марта 2012

Вы можете иметь свой запрос MYSql в своей главной функции, и результат запроса может быть сохранен в строке. Затем вы можете установить переменную для объекта конфигурации задания Hadoop. Переменные, установленные в объекте конфигурации, могут быть доступны для всех картографов.

Ваш основной класс выглядит так ...
JobConf conf = new JobConf(Driver.class);
String metainfo = <You metadata Info goes here>;
conf.set("metadata",metainfo);



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

publi class Map(...){

String sMetaInfo="";

public void configure(JobConf job) {

sMetaInfo= job.get("metadata"); // Getting the metadata value from Job Configureation Object

}
public void map(....){

// Map Function
}

}

0 голосов
/ 27 марта 2012

Я бы использовал swoop, если у вас есть дистрибутив cloudera для простоты.Я обычно программирую с каскадированием в java, и для db-источников использую dbmigrate в качестве источника "tap", делая dbs гражданином первого класса.При использовании pks с dbmigrate производительность была адекватной.

...