我正在寻找一种方法来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