Spark Streaming:如何有效地将foreachRDD数据保存到Mysql数据库中?

时间:2016-09-21 10:18:57

标签: java mysql spark-streaming

我们要构建一个实时计算系统,也想将处理后的数据保存到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数据库中。谁能帮我一个忙?

1 个答案:

答案 0 :(得分:0)

每个RDD分区就像一个单独的任务,您的程序将获得每个分区的连接。最好使用像Hikari或Tomcat这样的连接池库。 但即使使用连接池,也会产生与数据库通信的成本。在这个模型中你无法避免。