我知道终端可以通过find
命令查找以下文件:
find . -type d -name "*something*" -maxdepth 4
但是,当我在hadoop文件系统中时,我还没有找到办法做到这一点。
hadoop fs -find ....
抛出错误。
人们如何遍历hadoop中的文件?我正在使用hadoop 2.6.0-cdh5.4.1
。
答案 0 :(得分:6)
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 ”