2013-07-26 53 views
0

我需要從MYSQL導入數據,運行MR並將其導出回MYSQL。 我能夠在單個MR作業中使用DBInputFormat和DBOutputFormat成功完成一些記錄。 當我將輸入記錄縮放到1億多條記錄時,MR作業掛起。 對此的替代是將數據導出到HDFS,運行MR作業並推送回My SQL。Hadoop MapReduce DBInputFormat和DBOutputFormat

對於大約400多萬條記錄的大數據集,使用DBInputFormat和DBOutputFormat或使用HDFS作爲數據源和目的地,哪個選項更好。

使用HDFS會在我的MR作業之前和之後添加一個步驟。 由於數據存儲在HDFS上,因此會被複制(默認爲3),並且需要更多的硬盤空間。 感謝 Rupesh

+1

你能解釋爲什麼MR作業掛起? – zsxwing

+0

你的意思是說我們不使用DBinputFormat將數據導出到HDFS? –

+0

我們正在使用DBINputFormat並對其執行MR操作。我假設DBInputFormat將在內部存儲HDFS數據。 –

回答

3

我認爲最好的辦法應在處理這類situation.Apache Sqoop使用SQOOP是專爲高效傳輸的Apache Hadoop和結構化的數據存儲之間的批量數據如關係數據庫如像MySQL或工具Oracle.Sqoop可以自動執行大部分此過程,依靠數據庫來描述要導入的數據的模式。 Sqoop使用MapReduce導入和導出數據,提供並行操作和容錯功能。請查看此鏈接並探索Sqoop的detials。 SQOOP details

爲了使用DBInputFormat,您需要編寫一個類,將數據庫記錄中的列反序列化爲單獨的數據字段以便使用。這非常乏味 - 而且完全是算法的。 Sqoop自動生成類定義以反序列化來自數據庫的數據。這些類還可以用於將結果存儲在Hadoop的SequenceFile格式中,這使您可以利用HDFS中的內置壓縮功能。這些類被寫爲.java文件,您可以稍後將它們合併到您自己的數據處理管道中。類定義是通過利用JDBC讀取關於數據庫和表的元數據的能力來創建的。

當調用Sqoop時,它將檢索表的元數據,爲要導入的列寫出類定義,並啓動MapReduce作業以導入表格本體。

+0

Sqoop是一個選項,我試圖評估哪個會更高效DBINputFormat&DBOutputFormat或Sqoop –

+0

檢查我的答案已更新,以回答您的問題 – Binary01

+0

我已經爲我的類實現了DBWritable,並重寫了readFields()和write()方法。我覺得Sqoop使用的代碼的性能比我執行的更好。請分享你的想法。 –