在Hadoop中搜索/查找文件和文件内容

问题描述 投票:15回答:4

我目前正在使用Hadoop DFS开展项目。

  1. 我注意到Hadoop Shell中没有搜索或查找命令。有没有办法在Hadoop DFS中搜索和查找文件(例如testfile.doc)?
  2. Hadoop是否支持文件内容搜索?如果是这样,怎么办?例如,我有许多存储在HDFS中的Word Doc文件,我想列出哪些文件中包含“计算机科学”字样。

在其他分布式文件系统中呢?文件内容搜索是分布式文件系统的软肋吗?

file filesystems hadoop distributed distributed-computing
4个回答
41
投票
  1. 你可以这样做:hdfs dfs -ls -R / | grep [search_term]
  2. 听起来MapReduce工作可能适合这里。 Here's类似的东西,但用于文本文件。但是,如果这些文档很小,您可能会遇到效率低下的问题。基本上,每个文件将分配给一个地图任务。如果文件很小,则与处理文件所需的时间相比,设置映射任务的开销可能很大。

2
投票

根据数据在HDFS中的存储方式,您可能需要使用-text选项将dfs用于字符串搜索。在我的例子中,我每天都在AVRO格式的一系列HDFS序列文件中存储了数千条消息。从边缘节点上的命令行,此脚本:

  1. 在第一级搜索/ data / lake / raw目录以获取文件列表。
  2. 将结果传递给awk,输出第6和第8列(日期和文件名)
  3. Grep输出具有相关文件日期的行(2018-05-03)
  4. 将具有两列的行传递给awk,其仅输出列2,即文件列表。
  5. 这是用while循环读取的,它接受每个文件名,从HDFS中提取它作为文本。
  6. 该文件的每一行都是字符串“7375675”的grep-ed。
  7. 满足该条件的行输出到屏幕(标准输出)

有一个solr jar文件实现,据说我没有尝试过更快。

hadoop fs -ls /data/lake/raw | awk {'print $6"   "$8'} | grep 2018-05-03 | awk {'print $2'} | while read f; do hadoop fs -text $f | grep 7375675 && echo $f ; done

1
投票

你可以使用hadoop.HdfsFindTool和solr,比'hdfs dfs ls -R'更快,更有用。

hadoop jar search-mr-job.jar org.apache.solr.hadoop.HdfsFindTool -find /user/hive/tmp -mtime 7

Usage: hadoop fs [generic options]
    [-find <path> ... <expression> ...]
    [-help [cmd ...]]
    [-usage [cmd ...]]

0
投票

对于1,您可以像这样搜索:

hadoop -find . -name "<name_of_file>"

0
投票

1.-在HDFS上有一个名为-find的find命令,用于你的第一个例子:

hdfs dfs -find /some/path/ -name "testfile.doc"

2.-对于内容搜索,我建议列出文件并将结果保存在文件中

  hdfs dfs -ls -R /some/path/ >> someFile

然后只需在该文件上添加一些过滤器,如:

  cat someFile | grep "computer science"

你会得到你的结果。


0
投票

通常当我在hadoop中搜索文件时,如ajduff574所述,它完成了

hdfs dfs -ls -R $path | grep "$file_pattern" | awk '{print $8}'

此代码只是打印出每个模式的路径,然后可以进一步操作,只要您希望在文件内容中进行搜索。例如:

hdfs dfs -cat $(hdfs dfs -ls -R $path | grep "$file_pattern" | awk '{print $8}') | grep "$search_pattern"

search_pattern:您在文件中查找的内容

file_pattern:您要查找的文件。

path:搜索以递归方式查看的路径,这也包括子文件夹。

© www.soinside.com 2019 - 2024. All rights reserved.