File 在Hadoop中搜索/查找文件和文件内容
我目前正在从事一个使用Hadoop DFS的项目File 在Hadoop中搜索/查找文件和文件内容,file,filesystems,hadoop,distributed,distributed-computing,File,Filesystems,Hadoop,Distributed,Distributed Computing,我目前正在从事一个使用Hadoop DFS的项目 我注意到Hadoop Shell中没有搜索或查找命令。有没有办法在Hadoop DFS中搜索和查找文件(例如testfile.doc) Hadoop支持文件内容搜索吗?如果是,怎么做?例如,我有许多Word文档文件存储在HDFS中,我想列出哪些文件中有单词“computer science” 在其他分布式文件系统中呢?文件内容搜索是分布式文件系统的一个软肋吗 您可以这样做:hdfs dfs-ls-R/| grep[search\u term] 听
hdfs dfs-ls-R/| grep[search\u term]
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 ...]]
hadoop jar search-mr-job.jar org.apache.solr.hadoop.HdfsFindTool-find/user/hive/tmp-mtime 7
用法:hadoop fs[通用选项]
[-查找……]
[-help[cmd…]]
[-用法[cmd…]]
根据数据在HDFS中的存储方式,您可能需要在dfs中使用-text选项进行字符串搜索。在我的例子中,每天有数千条消息以AVRO格式存储在一系列HDFS序列文件中。从边缘节点上的命令行,此脚本:
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 -find . -name "<name_of_file>"
hadoop-find-名称“”
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"
您将得到您的结果。通常,当我在hadoop中搜索文件时,正如ajduff574所述,它是用 hdfs dfs -ls -R $path | grep "$file_pattern" | awk '{print $8}' 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" hdfs dfs-cat$(hdfs dfs-ls-R$path | grep“$file_pattern”| awk'{print$8}')| grep“$search_pattern” 搜索模式: 您正在文件中查找的内容 文件格式: 您正在查找的文件 路径:
递归搜索的路径,也包括子文件夹。我知道这是一个非常古老的主题,但当我遇到它时,我想分享我的知识 mapReduce作业org.apache.hadoop.examples.Grep可用于此目的: Hadoop的
hadoop org.apache.hadoop.examples.Grep
Grep[]
支持的通用选项包括
-conf指定一个应用程序配置文件
-D使用给定属性的值
-指定一个namenode
-jt指定一个ResourceManager
-文件指定要复制到map reduce群集的逗号分隔文件
-libjar指定要包含在类路径中的逗号分隔的jar文件。
-归档文件指定在计算机上未归档的逗号分隔归档文件。
一般的命令行语法是
bin/hadoop命令[genericOptions][commandOptions]
也许我还应该提到,Lucene()可以做索引和搜索,我认为有一个Word文档插件。你也许可以把东西装配在一起。我认为Lucene+Hadoop已经做了一些工作。谢谢你的回复。但是hadoop dfs-lsr/| grep[search_term]对许多文件或目录不是很慢吗?它肯定不快,但也不算太差。在我们的群集上,有>100000个文件,仍然需要不到一分钟的时间,我认为这是可以接受的。@@ajduff574我认为resursive list lsr命令不使用任何map/reduce函数来进行搜索,对吗?为什么hadoop不支持元数据级别的搜索?因为所有的元数据都存储在Namenode的RAM中,对吗?我在另一篇帖子()中回答说,我建议使用一个名为Schemaindex的软件对hdfs中的所有文件名进行索引。该软件基于python和adminlte(js)构建。该索引软件还利用HDFS的inotify功能实时监控HDFS。该项目位于github:schemaindex()上。如果有人想尝试它,可以通过以下方式安装:$pip install schemaindex$schemaindex runserver,然后可以创建一个数据源并“反映”该数据源。免责声明:我是作者,不幸的是,它似乎没有输出包含搜索词的实际文件,因此它可能对您的情况没有真正的帮助。
hadoop org.apache.hadoop.examples.Grep
Grep <inDir> <outDir> <regex> [<group>]
Generic options supported are
-conf <configuration file> specify an application configuration file
-D <property=value> use value for given property
-fs <local|namenode:port> specify a namenode
-jt <local|resourcemanager:port> specify a ResourceManager
-files <comma separated list of files> specify comma separated files to be copied to the map reduce cluster
-libjars <comma separated list of jars> specify comma separated jar files to include in the classpath.
-archives <comma separated list of archives> specify comma separated archives to be unarchived on the compute machines.
The general command line syntax is
bin/hadoop command [genericOptions] [commandOptions]