【问题标题】:How do I read Snappy compressed files on HDFS without using Hadoop?如何在不使用 Hadoop 的情况下读取 HDFS 上的 Snappy 压缩文件?
【发布时间】:2013-05-21 16:23:44
【问题描述】:

我在 HDFS 上以 Snappy 压缩格式存储文件。我希望能够在我的本地 Linux 文件系统上检查这些文件,以确保创建它们的 Hadoop 进程已正确执行。

当我将它们复制到本地并尝试使用 Google 标准库解压缩它们时,它告诉我该文件缺少 Snappy 标识符。当我尝试通过插入一个 Snappy 标识符来解决这个问题时,它会弄乱校验和。

我可以做些什么来读取这些文件而不必编写单独的 Hadoop 程序或通过 Hive 之类的东西传递它?

【问题讨论】:

    标签: hadoop compression hdfs snappy


    【解决方案1】:

    我终于发现可以使用下面的命令来读取HDFS上一个Snappy压缩文件的内容:

    hadoop fs -text /path/filename
    

    使用 Cloudera 或 HDP 上的最新命令:

    hdfs dfs -text /path/filename
    

    如果打算以文本格式下载文件以进行额外检查和处理,则该命令的输出可以通过管道传输到本地系统上的文件。您也可以使用 head 查看文件的前几行。

    【讨论】:

    • 如何在 scala 或 java 中以编程方式执行此操作?
    • 要以编程方式写入 Snappy 文件,您需要导入 Snappy 编解码器类并获取该类的实例作为映射器或缩减器设置的一部分。您需要通过编解码器的“createOutputStream”函数传递您的输出流以获取编码的输出流。这是一个sn-p。反向编解码器读取相同 = (CompressionCodec) ReflectionUtils.newInstance(codecClass, conf); fileOut = fs.create(targetPath, false); thiswriter = new LineRecordWriter(new DataOutputStream(codec.createOutputStream(fileOut)));
    【解决方案2】:

    请查看this post on Cloudera blog。它解释了如何将 Snappy 与 Hadoop 一起使用。本质上,原始文本上的 Snappy 文件不可拆分,因此您无法跨多个主机读取单个文件。

    解决方案是以容器格式使用 Snappy,因此本质上您使用的是 Hadoop SequenceFile,压缩集为 Snappy。如in this answer 所述,您可以将属性 ma​​pred.output.compression.codec 设置为 org.apache.hadoop.io.compress.SnappyCodec 并设置您的作业输出格式作为SequenceFileOutputFormat

    然后要读取它,您应该只需要使用SequenceFile.Reader,因为编解码器信息存储在文件头中。

    【讨论】:

    • 谢谢,Charles,但我认为这不能解决我的问题。让我简化一下。我使用 hadoop fs -get filename 将文件从 HDFS 移动到我在 Linux 上的本地目录。既然有了,为什么不能用snappy的java库来解压呢?
    【解决方案3】:

    那是因为hadoop使用的snappy有更多的元数据,像https://code.google.com/p/snappy/这样的库没有解析,你需要使用hadoop原生的snappy来解开你下载的数据文件。

    【讨论】:

    • 您能说得更具体一点吗?如果可能的话,我希望从 hadoop fs 界面执行此操作。
    【解决方案4】:

    如果你登陆这里并尝试通过本地命令行解压缩 .snappy 文件(就像我一样),试试这个工具:

    https://github.com/kubo/snzip#hadoop-snappy-format

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      相关资源
      最近更新 更多