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

时间:2011-06-09 18:31:00

标签: file filesystems hadoop distributed distributed-computing

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

  1. 我注意到Hadoop Shell中没有搜索或查找命令。有没有办法在Hadoop DFS中搜索和查找文件(例如testfile.doc)?

  2. Hadoop是否支持文件内容搜索?如果是这样,怎么办?例如,我有许多存储在HDFS中的Word Doc文件,我想列出哪些文件中包含“计算机科学”字样。

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

7 个答案:

答案 0 :(得分:40)

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

答案 1 :(得分:2)

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

  1. 在第一级搜索/ data / lake / raw目录以获取列表 文件。
  2. 将结果传递给awk,输出第6列和第6列。 8(日期和文件 名)
  3. Grep输出有问题的文件日期(2018-05-03)
  4. 将带有两列的行传递给awk,它只输出第2列, 文件列表。
  5. 使用while循环读取,它接受每个文件名,提取 它来自HDFS作为文本。
  6. 文件的每一行都是字符串" 7375675"。
  7. 符合该条件的行将输出到屏幕(标准输出)
  8. 有一个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
    

答案 2 :(得分: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 ...]]

答案 3 :(得分:0)

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

hadoop -find . -name "<name_of_file>"

答案 4 :(得分:0)

1.-在第一个示例中,HDFS上有一个名为-find的查找命令,该命令有效:

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

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

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

,然后在该文件上放置一些过滤器,例如:

  cat someFile | grep "computer science"

您将得到结果。

答案 5 :(得分:0)

通常,如ajduff574所述,当我在hadoop中搜索文件时,它是通过

完成的
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: 您要查找的文件。

路径: 搜索可递归查找的路径,其中还包括子文件夹。

答案 6 :(得分:0)

我知道这是一个非常古老的话题,但当我遇到它时,我想分享我的知识。

mapReduce 作业 org.apache.hadoop.examples.Grep 可用于此目的:

Hadoop 的 Grep

var getData = (data) => {
  console.log(data);
}


<Child data={this.getData} />