尝试通过调用函数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) ```
答案 0 :(得分:1)
我相信,在大多数情况下,Dataflow运行程序默认使用n1-standard-1实例。这些没有太多的内存。您可以通过将workerMachineType
parameter传递给跑步者以指定具有大于10GB内存的machine type来覆盖此设置。
但是,这种方法没有充分利用与Apache Beam一起运行的并行优势。将整个文件读取到内存中会产生瓶颈和高内存负载,如果您将读取内容分成多个片段,则可能会遇到。您可能需要研究其他读取CSV的方法。例如,如果CSV的每一行都是单独的条目,则TextIO可能很有用。但是,如果由于某种原因例如一次需要整个文件内容,则此方法将行不通。该文件已压缩。