在处理一些大型HDFS文件之前,我正在运行的某个作业需要从数据库(MySQL,尽管这并不相关)收集一些元数据。这些元数据将添加到文件中的数据中,并传递到稍后的映射/合并/减少阶段。
我想知道这个查询的"正确"位置可能在哪里。我需要元数据在映射器开始时可用,但把它放在那里似乎是多余的,因为每个映射器都会执行相同的查询。如何(如果有的话)执行一次此查询并在所有映射器之间共享其结果?是否有一种通用的方法在执行任务的所有节点之间共享数据(而不是将数据写入HDFS)?谢谢
您可以将MYSql查询放在主函数中,查询结果可以存储在字符串中。然后,您可以将变量设置为Hadoop作业配置对象。所有映射程序都可以访问Configuration对象中设置的变量
你的主课是这样的JobConf conf = new JobConf(Driver.class);
String metainfo = <You metadata Info goes here>;
conf.set("metadata",metainfo);
因此,在Map Class中,您可以访问元数据值,如下所示
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
}
}
如果您有cloudera分发版,我会使用swamp。我通常用java中的级联进行编程,对于数据库源代码,使用dbmigrate作为源代码"抽头",使dbs成为一流的公民。当将pks与dbmigrate一起使用时,性能已经足够了。