2016-09-21 70 views
0

我們將構建一個實時計算系統,而且要處理的數據保存到MySQL數據庫,這裏的代碼如下:Spark Streaming:如何有效地將foreachRDD數據保存到Mysql數據庫?

splitWordInfo.foreachRDD(new Function<JavaRDD<String>, Void>() { 
     private static final long serialVersionUID = 1L; 

     @Override 
     public Void call(JavaRDD<String> rdd) throws Exception { 
      rdd.foreachPartition(new VoidFunction<Iterator<String>>() { 
       // Default Serial ID 
       private static final long serialVersionUID = 1L; 
       @Override 
       public void call(Iterator<String> eachline) throws Exception { 
        String sql = "insert into test_mm(name,addr) values(?)"; 
        Connection conn = DriverManager.getConnection("jdbc:mysql://xx.xx.xx.xx:3306/dbname", "user", "pass"); 
        PreparedStatement stat = conn.prepareStatement(sql); 
        while(eachline.hasNext()){ 
         stat.setString(1, eachline.next()); 
         stat.executeUpdate(); 
        } 
        stat.close(); 
        conn.close(); 
       } 

      }); 
      return null; 
     } 
    }); 

它會打開每個RDD /關閉MySQL連接,或者每個分區?

以及如何有效地將foreachRDD數據保存到Mysql數據庫中。有誰能幫我一個忙嗎?

+0

可能重複[如何使用MySQL DB和Apache Spark?](http://stackoverflow.com/questions/27718382/how-to-work-with-mysql-db-and-apache-spark) – ruhungry

+0

我不這麼認爲,我要求的是最佳實踐,而不是如何將foreachRDD數據保存到Mysql數據庫中,但thx @ruhungry – triffic

+0

據我所知,每個RDD都會打開一個到mySQL的連接,所以這個解決方案不是最好的做法,如果你想在未來擴大規模。 – Frankie

回答

0

每個RDD分區就像一個單獨的任務,您的程序將獲得每個分區的連接。使用像Hikari或Tomcat這樣的連接池庫是很好的。 但即使連接池也會與數據庫通信。在這個模型中你無法避免。