我们愿意使用 org.apache.orc.Writer 创建 orc 文件。我们的测试还可以,直到从包含 blob-s 的较大数据库表创建 orc 文件。我们尝试更改以下设置,但都没有帮助:
org.apache.orc.OrcFile.WriterOptions:
bufferSize()
stripeSize()
blockSize()
enforceBufferSize()
Orc 编写器正在获取所有数据集,并且只有在完成后才将它们写出,这种行为会导致较大数据集上的内存问题。有没有办法连续填充 ORC 文件(连续从内存中刷新(,而不是在关闭文件编写器时从内存中刷新数据?从包含 blob 且不能仅在内存中处理的数据源创建 orc 文件的最佳做法是什么?
任何信息不胜感激!
谢谢。 塔马斯
我知道这是一个非常古老的问题,但我会为任何其他有相同问题的问题提供解决方案。
事实证明,ORCWriter 实现检查内存限制以每 n 行刷新一次缓冲区,但是如果您的行足够大,可以在执行检查之前消耗整个内存,则会出现 OOM 错误。因此,也许您应该尝试在内存检查/刷新之间设置较小的行数。默认值为 5000。
var configuration = new Configuration();
configuration.set(OrcConf.ROWS_BETWEEN_CHECKS.getAttribute(), String.valueOf(1000));
var options = OrcFile.writerOptions(configuration)
.stripeSize(stripeSize)
.setSchema(schema);
文档在这里: https://github.com/apache/orc/blob/fc6f6aee6571df6e53de5adba7cc0b2670c5df91/java/core/src/java/org/apache/orc/OrcConf.java#L165