如何在数据流中读取大小超过10 GB的文件?

时间:2019-05-05 13:08:05

标签: google-cloud-dataflow apache-beam

尝试通过调用函数ReadableFile.readFullyAsUTF8String在数据流作业中使用Apache Beam FileIO读取大小为10 GB以上的CSV文件。并且,其失败并出现以下错误。

看起来像读取大小超过INTEGER.MAX_VALUE的文件失败。请指教。

    at java.io.ByteArrayOutputStream.hugeCapacity(ByteArrayOutputStream.java:123)
    at java.io.ByteArrayOutputStream.grow(ByteArrayOutputStream.java:117)
    at java.io.ByteArrayOutputStream.ensureCapacity(ByteArrayOutputStream.java:93)
    at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:153)
    at org.apache.beam.sdk.util.StreamUtils.getBytes(StreamUtils.java:64)
    at org.apache.beam.sdk.io.FileIO$ReadableFile.readFullyAsBytes(FileIO.java:419)
    at org.apache.beam.sdk.io.FileIO$ReadableFile.readFullyAsUTF8String(FileIO.java:424) ```

1 个答案:

答案 0 :(得分:1)

我相信,在大多数情况下,Dataflow运行程序默认使用n1-standard-1实例。这些没有太多的内存。您可以通过将workerMachineType parameter传递给跑步者以指定具有大于10GB内存的machine type来覆盖此设置。

但是,这种方法没有充分利用与Apache Beam一起运行的并行优势。将整个文件读取到内存中会产生瓶颈和高内存负载,如果您将读取内容分成多个片段,则可能会遇到。您可能需要研究其他读取CSV的方法。例如,如果CSV的每一行都是单独的条目,则TextIO可能很有用。但是,如果由于某种原因例如一次需要整个文件内容,则此方法将行不通。该文件已压缩。