【问题标题】:Dataflow GZIP TextIO ZipException: too many length or distance symbols数据流 GZIP TextIO ZipException:长度或距离符号过多
【发布时间】: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


【解决方案1】:

查看code that produces the error message 似乎是zlib 库(由JDK 使用)不支持您拥有的gzip 文件格式的问题。

它看起来是zlib 中的以下错误:Codes for reserved symbols are rejected even if unused。

不幸的是,除了建议使用其他实用程序生成这些压缩文件之外,我们可能无能为力。

如果您可以生成一个小的示例 gzip 文件,我们可以使用它来重现该问题,我们也许可以查看是否有可能以某种方式解决,但我不会依赖这个来成功。

【讨论】:

  • 谢谢!不幸的是,我没有自己构建这些文件,它们包含非常敏感的信息......但是一旦我知道更多,我会发布用于压缩文件的工具...... +尝试用一些假人重新创建错误数据。
  • 如果您设法使用虚拟非敏感数据重新创建错误,请跟进,我很想看看我们是否可以在不影响解压缩性能的情况下以某种方式解决问题。
【解决方案2】:

这个问题可能有点老了,但这是我昨天谷歌搜索的第一个结果:

HIVE_CURSOR_ERROR:长度或距离符号过多

在获得此处的提示后,我意识到我在尝试处理的文件的 gzip 结构中搞砸了。我有两个进程将 gzip 数据写入同一个输出文件,并且输出文件因此而损坏。修复写入唯一文件的过程解决了该问题。我认为这个答案可能会节省一些时间。

【讨论】:

    【解决方案3】:

    我在 Spring 启动时遇到了这个错误。我有一个将使用图书馆项目的主要项目。我在主项目中使用弹簧执行器。一旦我卸下弹簧执行器,它就开始工作了。

    【讨论】:

      猜你喜欢
      • 2022-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-16
      • 2019-04-27
      • 1970-01-01
      • 1970-01-01
      • 2012-08-02
      相关资源
      最近更新 更多