【发布时间】:2017-10-06 22:43:49
【问题描述】:
我正在尝试处理从配置单元表导入的大量行(数亿行)。作为输出,它会更多。 如果某些条件有效,我需要生成新行。但这不是问题。问题是如何存储这些配置单元行。 在这一刻,我使用 ArrayList of Objects,因为顺序对于我插入新行的算法非常重要,但我得到“超出 GC 开销限制”。
【问题讨论】:
标签: java hive garbage-collection out-of-memory bigdata
我正在尝试处理从配置单元表导入的大量行(数亿行)。作为输出,它会更多。 如果某些条件有效,我需要生成新行。但这不是问题。问题是如何存储这些配置单元行。 在这一刻,我使用 ArrayList of Objects,因为顺序对于我插入新行的算法非常重要,但我得到“超出 GC 开销限制”。
【问题讨论】:
标签: java hive garbage-collection out-of-memory bigdata
您应该一次将一页结果检索到新的 ArrayList 中,处理该结果页中的行,根据需要写入新行,然后将下一个结果页加载到新的 ArrayList 中。垃圾回收 (GC) 将清理旧的 ArrayList。
结果的排序应该在您的数据库查询中使用“ORDER BY”子句。
如果您要插入同一个表并希望避免重新处理要添加的行,那么您需要在表上有一列来区分新行和现有行 - 例如自动递增的“id”或“创建日期”。
【讨论】:
我正在尝试处理从 hive 表导入的大量行...但我得到“超出 GC 开销限制”。
这里有几个选项。正如@DarrenKennedy 所提到的,如果有某种方法一次只处理一个页面,那将是最佳选择,但由于自定义排序,这听起来不是一个选项。
所以你有两种可能:
增加内存大小以适应所有行。我怀疑这也不是一个选项,但我想我会说出来。
在内存中处理批处理,将其写入磁盘,然后在最后处理批处理文件。见下文。
要分批处理,您需要读取一堆可以轻松放入内存的输入行,对它们进行排序和过滤,然后将每个输入行写出它们自己的本地临时文件。如果您为此使用云系统,那么临时存储将非常适合。
处理完所有 hive 输入行,将它们排序并写入一堆临时文件后,您将需要返回并读取并处理已排序的行,执行插入排序。这是一些伪代码:
BufferedReader 或类似名称打开所有临时文件。 希望这会有所帮助。
【讨论】: