结合Hadoop MapReduce和数据库查询

时间:2012-03-26 07:22:55

标签: database data-binding hadoop mapreduce

我正在运行的某项工作需要在处理一些大型HDFS文件之前从数据库中收集一些元数据(MySQL,尽管这并不相关)。此元数据将添加到文件中的数据,并传递到以后的map / combine / reduce阶段。

我想知道放置此查询的“正确”位置在哪里。我需要在映射器开始时提供元数据,但将其放在那里似乎是多余的,因为每个Mapper都会执行相同的查询。我怎样才能(如果有的话)执行此查询一次并在所有映射器中共享其结果?是否有一种在执行任务的所有节点之间共享数据的常用方法(除了将其写入HDFS)?感谢。

2 个答案:

答案 0 :(得分:3)

您可以在main函数中使用MYSql查询,并且查询结果可以存储在字符串中。然后,您可以将变量设置为Hadoop作业配置对象。所有映射器都可以访问Configuration对象中设置的变量。

你的主要课程看起来像这样.... JobConf conf = new JobConf(Driver.class);
String metainfo = <You metadata Info goes here>; {
{1}}



因此,在Map Map中,您可以按如下方式访问元数据值

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

}

答案 1 :(得分:0)

如果您轻松拥有cloudera发行版,我会使用猛扑。我通常使用java级联编程,对于db源使用dbmigrate作为源“tap”使dbs成为一等公民。当使用具有dbmigrate的pks时,性能已经足够。