为啥没有'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