2012-03-26 84 views
1

我正在運行的某個作業需要在處理某些大型HDFS文件之前從數據庫(MySQL,儘管這不相關)收集一些元數據。該元數據將被添加到文件中的數據中,並傳遞到更高版本的map/combine/reduce階段。結合Hadoop MapReduce和數據庫查詢

我想知道把這個查詢放在哪裏「正確」的地方。我需要元數據在映射器開始時可用,但將其放置在那裏似乎是多餘的,因爲每個映射器都將執行相同的查詢。我如何(如果有的話)執行一次查詢並在所有映射器上分享其結果?在執行任務的所有節點之間共享數據(除了寫入HDFS之外)是否有共同的方法?謝謝。

回答

3

您可以在主函數中使用MYSQL查詢,查詢結果可以存儲在字符串中。然後,您可以將該變量設置爲Hadoop作業配置對象。所有映射器都可以訪問Configuration對象中設置的變量。

主類看起來是這樣的....
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
}

}

+3

此外,如果您的元數據太大而無法存儲在配置中,那麼您應該查看使用DistributedCache。從驅動程序中的數據庫中獲取元數據,保存到文件中,然後將文件添加到DistributedCache中 - 然後該文件將在每個映射器中可用,以便加載到內存並根據需要追加 – 2012-03-26 10:14:57

+0

這兩個答案都非常好,謝謝! – sa125 2012-03-26 11:39:48

0

如果你有cloude我會用飛撲ra分配方便。我通常在java中使用cascading進行編程,而對於db源使用dbmigrate作爲源「tap」使得dbs成爲頭等公民。在dbmigrate中使用pks時,性能已經足夠。

+0

https://github.com/Cascading/cascading-dbmigrate – 2012-03-27 13:34:16