【问题标题】:Spark Streaming: How to efficiently save foreachRDD data into Mysql Database?Spark Streaming:如何有效地将foreachRDD数据保存到Mysql数据库中?
【发布时间】:2023-04-01 04:15:01
【问题描述】:

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

【问题讨论】:

  • 我不这么认为,我要求的是最佳实践,不仅仅是如何将 foreachRDD 数据保存到 Mysql 数据库中,而是谢谢@ruhungry
  • 据我所知,每个 RDD 都会打开一个到 mySQL 的连接,所以如果你想在未来扩大规模,这个解决方案并不是最佳实践。
  • 那么有什么关于最佳实践的建议吗? @弗兰基
  • @triffic 也许你可以在你的项目中使用 Spark Streaming 和 HBase。

标签: java mysql spark-streaming


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2017-01-27
    • 2016-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多