我正在对存储在 S3 中的一些 LZO 压缩日志文件运行 EMR Spark 作业。有几个日志文件存储在同一个文件夹中,例如:
...
s3://mylogfiles/2014-08-11-00111.lzo
s3://mylogfiles/2014-08-11-00112.lzo
...
在 spark-shell 中,我正在运行一项计算文件中行数的作业。如果我为每个文件单独计算行数,则没有问题,例如:
// Works fine
...
sc.textFile("s3://mylogfiles/2014-08-11-00111.lzo").count()
sc.textFile("s3://mylogfiles/2014-08-11-00112.lzo").count()
...
如果我使用通配符以单行方式加载所有文件,则会出现两种异常。
// One-liner throws exceptions
sc.textFile("s3://mylogfiles/*.lzo").count()
例外情况是:
java.lang.InternalError: lzo1x_decompress_safe returned: -6
at com.hadoop.compression.lzo.LzoDecompressor.decompressBytesDirect(Native Method)
和
java.io.IOException: Compressed length 1362309683 exceeds max block size 67108864 (probably corrupt file)
at com.hadoop.compression.lzo.LzopInputStream.getCompressedData(LzopInputStream.java:291)
在我看来,解决方案是由最后一个例外给出的文本暗示的,但我不知道如何继续。LZO 文件的大小是否有限制,或者有什么问题?
我的问题是:我可以运行将所有 LZO 压缩文件加载到 S3 文件夹中的 Spark 查询,而不会出现与 I/O 相关的异常吗?
有 66 个文件,每个文件大约 200MB。
编辑:只有在使用 Hadoop2 核心库(ami 3.1.0)运行 Spark 时才会发生异常。使用 Hadoop1 核心库(ami 2.4.5)运行时,一切正常。这两种情况都使用 Spark 1.0.1 进行了测试。