2017-06-22 89 views
0

什麼是最有效的內存複製方式,使用spark複製大型關係表的內容,然後以實木複合格式(不帶sqoop)寫入分區Hive表。我有一個基本的火花應用程序,我已經做了一些與火花的jdbc其他調整,但關係表中的數據仍然是0.5 TB和2十億記錄,所以我雖然我可以懶加載全表,我想弄清楚如何有效按日期分區並保存到hdfs,而不會遇到內存問題。因爲來自spark的jdbc load()會將所有內容加載到內存中我正在考慮循環訪問數據庫查詢中的日期,但仍不確定如何確保不會耗盡內存。Spark和JDBC:遍歷大表並寫入hdfs

回答

0

如果您需要使用Spark,您可以添加到應用程序date參數中,以按日期過濾表並在每個日期的循環中運行Spark應用程序。您可以在此循環中使用bash或其他腳本語言。

這可以是這樣的:在日期

  • 的foreach日期
    • ​​與date參數應用程序
    • 讀取數據庫表spark.read.jdbc
    • 過濾器通過date使用filter方法
    • 使用0將結果寫入HDFS

另一種選擇是使用例如不同技術使用JDBC和DB光標通過行迭代和將結果放入HDFS實現Scala的應用。這更復雜,因爲您需要解決與使用Scala寫入Parquet格式和保存到HDFS相關的問題。如果你想我可以提供負責寫入Parquet格式的Scala代碼。

+0

但是,如果我循環遍歷一個日期數組,並通過這些日期循環'jdbc.read',那麼我是否仍然繼續用每個連續的'load()'語句繼續填充內存,或者你的意思是別的東西? – horatio1701d

+0

我的意思是在某些腳本語言中運行這個循環,例如bash和sumbitting你的Spark應用程序,所以我不是說在Scala中實現這個循環,因爲你確實仍然會遇到內存問題。 –

+0

這是有道理的。謝謝。 – horatio1701d