我正在运行的某项工作需要在处理一些大型HDFS文件之前从数据库中收集一些元数据(MySQL,尽管这并不相关)。此元数据将添加到文件中的数据,并传递到以后的map / combine / reduce阶段。
我想知道放置此查询的“正确”位置在哪里。我需要在映射器开始时提供元数据,但将其放在那里似乎是多余的,因为每个Mapper都会执行相同的查询。我怎样才能(如果有的话)执行此查询一次并在所有映射器中共享其结果?是否有一种在执行任务的所有节点之间共享数据的常用方法(除了将其写入HDFS)?感谢。
答案 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时,性能已经足够。