在`hadoop`中是否存在`find`命令的等价物?

时间:2015-10-01 20:34:45

标签: hadoop terminal hdfs hadoop2

我知道终端可以通过find命令查找以下文件:

find . -type d -name "*something*" -maxdepth 4 

但是,当我在hadoop文件系统中时,我还没有找到办法做到这一点。

hadoop fs -find ....

抛出错误。

人们如何遍历hadoop中的文件?我正在使用hadoop 2.6.0-cdh5.4.1

4 个答案:

答案 0 :(得分:6)

Apache Hadoop 2.7.0中引入了

hadoop fs -find。很可能你使用的是旧版本,因此你还没有。 有关详细信息,请参阅:HADOOP-8989

在此期间,您可以使用

hdfs dfs -ls -R <pattern>

e.g ,: hdfs dfs -ls -R / demo / order *。*

但这并不像'发现'那样强大,缺乏一些基础知识。根据我的理解,人们一直在编写脚本来解决这个问题。

答案 1 :(得分:1)

如果您使用的是Cloudera堆栈,请尝试使用查找工具:

org.apache.solr.hadoop.HdfsFindTool

将命令设置为bash变量:

COMMAND='hadoop jar /opt/cloudera/parcels/CDH/lib/solr/contrib/mr/search-mr-job.jar org.apache.solr.hadoop.HdfsFindTool'

用法如下:

${COMMAND} -find . -name "something" -type d ...

答案 2 :(得分:0)

如果您没有可用的cloudera包裹,可以使用awk。

hdfs dfs -ls -R /some_path | awk -F / '/^d/ && (NF <= 5) && /something/' 

几乎等同于find . -type d -name "*something*" -maxdepth 4命令。

答案 3 :(得分:-1)

在.bash_profile中添加HdfsFindTool作为别名,将使其易于使用。

- 在下方添加个人资料 别名hdfsfind ='hadoop jar /opt/cloudera/parcels/CDH/lib/solr/contrib/mr/search-mr-job.jar org.apache.solr.hadoop.HdfsFindTool' 别名hdfs ='hadoop fs'

- 你现在可以使用如下:(这里我使用find工具获取HDFS源文件夹文件名和记录计数。)

$&GT; cnt = 1;对于hdfsfind -find /dev/abc/*/2018/02/16/*.csv -type f中的ff; do pp = echo ${ff}|awk -F"/" '{print $7}'; fn = basename ${ff}; FCNT = hdfs -cat ${ff}|wc -l; echo“$ {cnt} = $ {pp} = $ {fn} = $ {fcnt}”; CNT = expr ${cnt} + 1;完成

- 获取文件夹/文件详细信息很简单: $&GT; hdfsfind -find / dev / abc / -type f -name“* .csv” $&GT; hdfsfind -find / dev / abc / -type d -name“ toys