2011-12-02 67 views
1

在我的數據庫中,我有多個表,其中每個表是不同的實體類型。我有一個在hadoop中使用的Avro模式,它是這些不同實體類型的所有字段的聯合,還有一個實體類型字段。在Hadoop中使用DBInputFormat的MultipleInputs

我想要做的是沿用DBWritable爲實體類型映射到組合Avro類型的每個實體類型設置DBInputFormat。然後給每個DBInputFormat類似MultipleInputs,這樣我就可以創建一個複合輸入格式。然後可以將複合輸入格式提供給我的map reduce作業,以便所有表中的所有數據都可以由同一個映射器類一次處理。

數據不斷添加到這些數據庫表中,因此我需要能夠爲每個實體類型/ dbtable配置DBInputFormat以僅抓取新數據並正確執行拆分。

基本上我需要DBInputFormat或DataDrivenDBInputFormat的功能,但也有能力使它們的組合類似於您可以對路徑和MultipleInputs執行的操作。

回答

1

從N個輸入表創建一個視圖,並在DBInputFormat#setInput中設置視圖。根據Cloudera article。所以,我猜數據不應該在作業完成時更新。

Hadoop可能需要多次執行相同的查詢。每次都需要返回相同的結果。因此,對數據庫的任何併發更新等都不應該影響您的MapReduce作業運行的查詢。這可以通過在您的MapReduce作業運行時禁止寫入表格,在啓動MapReduce過程之前通過諸如「insert_date <昨天」之類的子句限制您的MapReduce查詢,或者將數據轉儲到數據庫中的臨時表中。

評估哪些支持實時處理像StormHStreamingS4Strembases框架。其中一些位於Hadoop的頂端,有些則不是,有些是FOSS,有些是商業的。

+0

恐怕這可能是編寫我自己的InputFormat的唯一答案。這種方法的問題是,那麼所有的映射器將查詢所有的表,這將比查詢一個表的映射器的子集,查詢另一個表的另一個子集等效率低得多。我必須使每個Mapper抓取的窗口大小都要小得多,因爲它從每個表中抓取該窗口。每個窗口抓取都是對錶格的全表掃描,因此會有更多的全表掃描。 – user533020

+0

或者使用導出工具將錶轉儲成多個文件並使用[MultipleInputs](http://hadoop.apache.org/mapreduce/docs/r0.21.0/api/org/apache/hadoop/mapred/lib/MultipleInputs。 HTML)。如果你碰巧寫了你自己的輸入格式,然後嘗試將它提交給Apache。 –

相關問題