【发布时间】:2015-07-27 08:50:39
【问题描述】:
对大量压缩文本文件(1000 多个文件,大小在 100MB 到 1.5GB 之间)使用 TextIO.Read 转换,我们有时会收到以下错误:
java.util.zip.ZipException: too many length or distance symbols at
java.util.zip.InflaterInputStream.read(InflaterInputStream.java:164) at
java.util.zip.GZIPInputStream.read(GZIPInputStream.java:117) at
java.io.BufferedInputStream.fill(BufferedInputStream.java:246) at
java.io.BufferedInputStream.read1(BufferedInputStream.java:286) at
java.io.BufferedInputStream.read(BufferedInputStream.java:345) at
java.io.FilterInputStream.read(FilterInputStream.java:133) at
java.io.PushbackInputStream.read(PushbackInputStream.java:186) at
com.google.cloud.dataflow.sdk.runners.worker.TextReader$ScanState.readBytes(TextReader.java:261) at
com.google.cloud.dataflow.sdk.runners.worker.TextReader$TextFileIterator.readElement(TextReader.java:189) at
com.google.cloud.dataflow.sdk.runners.worker.FileBasedReader$FileBasedIterator.computeNextElement(FileBasedReader.java:265) at
com.google.cloud.dataflow.sdk.runners.worker.FileBasedReader$FileBasedIterator.hasNext(FileBasedReader.java:165) at
com.google.cloud.dataflow.sdk.util.common.worker.ReadOperation.runReadLoop(ReadOperation.java:169) at
com.google.cloud.dataflow.sdk.util.common.worker.ReadOperation.start(ReadOperation.java:118) at
com.google.cloud.dataflow.sdk.util.common.worker.MapTaskExecutor.execute(MapTaskExecutor.java:66) at
com.google.cloud.dataflow.sdk.runners.worker.DataflowWorker.executeWork(DataflowWorker.java:204) at
com.google.cloud.dataflow.sdk.runners.worker.DataflowWorker.doWork(DataflowWorker.java:151) at
com.google.cloud.dataflow.sdk.runners.worker.DataflowWorker.getAndPerformWork(DataflowWorker.java:118) at
com.google.cloud.dataflow.sdk.runners.worker.DataflowWorkerHarness$WorkerThread.call(DataflowWorkerHarness.java:139) at
com.google.cloud.dataflow.sdk.runners.worker.DataflowWorkerHarness$WorkerThread.call(DataflowWorkerHarness.java:124) at
java.util.concurrent.FutureTask.run(FutureTask.java:266) at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at
java.lang.Thread.run(Thread.java:745)
网上搜索同样的ZipException,只导致这个reply:
当热部署程序在应用程序完全复制到部署目录之前尝试部署应用程序时,通常会发生 Zip 文件错误。如果复制文件需要几秒钟,这很常见。解决方法是将文件复制到与应用服务器在同一磁盘分区上的一个临时目录,然后将文件移动到部署目录。
有没有其他人遇到过类似的异常?或者无论如何我们可以解决这个问题?
【问题讨论】:
-
除非文件是文本,否则您根本不应该使用
TextIO,并且您引用的答案似乎涵盖了另一种可能性。 -
感谢您的回复。但是,根据the Dataflow documentation 的说法,我认为 TextIO 应该是读取压缩文本文件的推荐方法,还是我错过了什么?
-
您在问题中引用的内容完全不相关。是的,这是一个 java.util.zip.ZipException,但除此之外,这根本不相关,正如您从堆栈跟踪的其余部分完全不同的那样。
-
这似乎是系统的内部错误,而不是您的用例的错误,这听起来很简单。如果可能,您应该打开一个public issue tracker 缺陷报告,其中包含您收集的所有信息,并希望有足够的信息来尝试重现该问题。
-
您使用的压缩器可能正在创建 Dataflow 实现无法处理的文件(这将是缺陷报告中的重要信息,您甚至可能想要附加一个文件,导致它失败),或文件已损坏,或流式解压缩遇到问题。
标签: java google-cloud-dataflow gzipinputstream