有没有办法在不提取 HDFS 中的 gzip 压缩内容的情况下对其进行 grep?

有没有办法在不提取 HDFS 中的 gzip 压缩内容的情况下对其进行 grep?

我正在寻找一种方法来zgrep hdfs归档

就像是:

hadoop fs -zcat hdfs://myfile.gz | grep "hi"

或者

hadoop fs -cat hdfs://myfile.gz | zgrep "hi"

它对我来说实际上不起作用有没有办法通过命令行实现这一点?

答案1

zless/zcat/zgrep只是外壳包装,压缩将解压后的数据输出到 stdout。要执行所需的操作,你只需编写一个包装器来包装Hadoop文件系统命令。

另外:这可能对您不起作用的原因是您的 hdfs URI 中缺少一个额外的斜线。

你写了:

hadoop fs -cat hdfs://myfile.gz | zgrep "hi"

这将尝试联系主机或集群我的文件.gz。你真正想要的是hdfs:///myfile.gz或者(假设你的配置文件设置正确),只需我的文件.gz,hadoop 命令应该在其前面添加由以下代码定义的正确 cluster/namenode 路径:fs.默认FS

以下对我有用。

$ hadoop fs -ls hdfs:///user/hcoyote/foo.gz
Found 1 items
-rw-r--r--   3 hcoyote users    5184637 2015-02-20 12:17 hdfs:///user/hcoyote/foo.gz

$ hadoop fs -cat hdfs:///user/hcoyote/foo.gz | gzip -c -d | grep -c Authorization
425893

$ hadoop fs -cat hdfs:///user/hcoyote/foo.gz | zgrep -c Authorization
425893

答案2

该命令行将自动为任何简单文本文件找到正确的解压缩程序,并将解压缩的数据打印到标准输出:

hadoop fs -text hdfs:///path/to/file [hdfs:///path/to/another/file]

我曾将其用于 .snappy 和 .gz 文件。它可能也适用于 .lzo 和 .bz2 文件。

这是一个重要的功能,因为 Hadoop 对 Snappy 文件使用自定义文件格式。这是解压 Hadoop 创建的 Snappy 文件的唯一直接方法。没有像其他压缩器那样的命令行“unsnappy”命令。我也不知道有任何直接命令可以创建一个。我只将它们创建为 Hive 表数据。

注意:hadoop fs -text是单线程的,并在运行命令的机器上运行解压缩。

答案3

我通常使用 hdfs fuse 挂载...因此可以使用几乎任何常规 Unix 命令(由于 hdfs 不是符合 POSIX 标准的文件系统,因此某些命令可能不起作用)。

gunzip/zcat

$ gunzip /hdfs_mount/dir1/somefile.gz 
$ grep hi /hdfs_mount/dir1/somefile.gz 

在 hdfs 保险丝座上工作得很好。而且输入速度也更快 :),更容易阅读,例如如果你想编写脚本的话。

要将 Hadoop 安装为“常规”文件系统: http://www.cloudera.com/content/cloudera/en/documentation/cdh4/latest/CDH4-Installation-Guide/cdh4ig_topic_28.html

相关内容