【问题标题】:using ResultSet select 10M record and dump onto HDFS使用 ResultSet 选择 10M 记录并转储到 HDFS
【发布时间】:2014-07-09 23:13:15
【问题描述】:

在一个程序中,我做了类似的事情:

ResultSet rs = con.executeQuery(sql);
List l = new List();
while(rs.next()){
   l.append(rs.getObject(xxx))
}

fileSys.write(l)

sql 有 10M 的记录。此功能需要 2 小时才能完成。循环占用大部分时间。我想知道有没有更好的方法来做这件事?是否可以使用多线程?

【问题讨论】:

  • 为什么需要将 10M 项加载到列表中?为什么不直接将它们输出到文件中(假设从您的示例中这是您想要做的)。如果您正在使用 10M 项目列表做其他事情,请说明它是什么。
  • 将 10M 项目直接写入文件比将 10M 项目附加到列表中然后将整个列表写入文件要慢。
  • 好的,然后尝试寻找一种可以有效地将sql结果集写入文件的方法。快速搜索找到了THIS ARTICLE,但如果您只想这样做,还有很多其他可能的方法来完成它。
  • 这是另一个链接 - THIS ONE FOR JAVA。在某种程度上,您必须考虑将大量数据传输到磁盘,并且 需要一些时间,但 2 小时似乎过分了。不确定多线程是否可以工作——多个线程如何同时写入同一个文件流?
  • @SlimsGhost 如果 2 小时太长,那么 SQL 查询中可能存在严重问题。服务器准备查询计划、执行它可能需要很长时间,如果每条记录有约 500 字节,那么它必须将约 5GB 的数据传输到客户端。在没有看到 SQL 的情况下,我看不到任何通用帮助,然后确保您已关闭客户端的内存缓存并使用快速 ODBC 只进游标

标签: sql performance jdbc


【解决方案1】:

如果您必须通过网络将大量数据(千兆字节)从一个系统 (SQL) 移动到另一个系统 (HDFS),那么驱动复制(您的代码)的处理器中的线程将无济于事

1您可以尝试在具有更好network throughput的服务器上运行您的代码

2 您可以尝试仅复制自上次以来更改的记录(HDFS 还没有副本)。从长远来看,这将提高性能。第一次会很慢。第二次和第三次它会更快,因为你只会移动已经改变的东西。使用 UTC 时间戳和“更改后”是基本概念

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-20
    • 1970-01-01
    • 1970-01-01
    • 2018-02-12
    • 2014-01-15
    • 1970-01-01
    相关资源
    最近更新 更多