2016-09-21 15 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パーティションは別々のタスクのようなもので、プログラムは各パーティションに接続します。ひかりやTomcatのような接続プールライブラリを使うのは良いことです。 しかし、接続プールであっても、データベースとの通信にはコストがかかります。このモデルでは避けることはできません。

関連する問題