为啥没有'hadoop fs -head' shell 命令?

Posted

技术标签:

【中文标题】为啥没有\'hadoop fs -head\' shell 命令?【英文标题】:Why is there no 'hadoop fs -head' shell command?为什么没有'hadoop fs -head' shell 命令? 【发布时间】:2013-11-15 16:28:27 【问题描述】:

在 HDFS 上检查文件的快速方法是使用 tail:

~$ hadoop fs -tail /path/to/file

这会显示文件中最后一千字节的数据,这非常有用。但是,相反的命令 head 似乎不是 shell 命令集合的一部分。我觉得这非常令人惊讶。

我的假设是,由于 HDFS 是为对非常大的文件进行非常快速的流式读取而构建的,因此存在一些影响head 的面向访问的问题。这让我在做访问头部的事情时犹豫不决。有人回答吗?

【问题讨论】:

社区对实施此类功能缺乏兴趣? https://issues.apache.org/jira/browse/HDFS-206. 【参考方案1】:

从 3.1.0 版开始,我们现在有了它:

用法:hadoop fs -head URI

将文件的第一个千字节显示到标准输出。

见here。

【讨论】:

【参考方案2】:

在 Hadoop v2 中:

hdfs dfs -cat /file/path|head

在 Hadoop v1 和 v3 中:

hadoop fs -cat /file/path|head

【讨论】:

【参考方案3】:

你可以试试下面的命令

hadoop fs -cat /path | head -n 

-n 可以替换为要查看的记录数

【讨论】:

【参考方案4】:
hdfs -dfs /path | head

是解决问题的好方法。

【讨论】:

你将如何保存这个结果 | head -n 进入 HDFS 中的文件?【参考方案5】:

我想说这更多地与效率有关 - 可以通过 linux head 命令通过管道传输 hadoop fs -cat 的输出来轻松复制 head。

hadoop fs -cat /path/to/file | head

这是有效的,因为 head 将在输出所需的行数后关闭底层流

以这种方式使用 tail 效率会大大降低 - 因为您必须流式传输整个文件(所有 HDFS 块)才能找到最终的 x 行数。

hadoop fs -cat /path/to/file | tail

您注意到的 hadoop fs -tail 命令适用于最后一个千字节 - hadoop 可以有效地找到最后一个块并跳到最后一个千字节的位置,然后流式传输输出。通过尾部管道不能轻易做到这一点。

【讨论】:

如何把这个 head hadoop 东西变成别名形式。 argpas() hdfs dfs -cat $1 | head -$2 alias hh=argpas 我试过了,但它不起作用 bash 函数调用相同的(可选通过-n num hdfs_path 给出num 行显示):hdfs-head() [ "$1" = "-n" ] && n=$2; shift 2; || n=10; hdfs dfs -cat "$@" | head -n $n ;

以上是关于为啥没有'hadoop fs -head' shell 命令?的主要内容,如果未能解决你的问题,请参考以下文章

org.apache.hadoop.fs.UnsupportedFileSystemException:方案“oci”没有文件系统

org.apache.hadoop.fs.FSError: java.io.IOException: 设备上没有空间 at org.apache.hadoop.fs.RawLocalFileSyste

hadoop fs -mkdir没有创建所需的文件夹

hadoop fs -ls隐藏文件

hadoop fs -ls s3://bucket 或 s3a://bucket 抛出“没有这样的文件或目录”错误

Hadoop回收站及fs.trash参数详解