web-dev-qa-db-fra.com

Rechercher/Trouver un fichier et son contenu dans Hadoop

Je travaille actuellement sur un projet utilisant Hadoop DFS. 

  1. Je remarque qu'il n'y a pas de commande de recherche ou de recherche dans Hadoop Shell. Existe-t-il un moyen de rechercher et de trouver un fichier (par exemple, testfile.doc) dans Hadoop DFS? 

  2. Hadoop prend-il en charge la recherche de contenu de fichier? Dans l'affirmative, comment le faire? Par exemple, j'ai beaucoup de fichiers Word Doc stockés dans HDFS, je veux lister ceux qui contiennent les mots "informatique". 

Qu'en est-il des autres systèmes de fichiers distribués? La recherche de contenu de fichier est-elle un point faible des systèmes de fichiers distribués?

15
leon
  1. Vous pouvez faire ceci: hdfs dfs -ls -R / | grep [search_term].
  2. Cela ressemble à un travail MapReduce pourrait être approprié ici. Voici quelque chose de similaire, mais pour les fichiers texte. Toutefois, si ces documents sont petits, vous risquez de rencontrer des problèmes d’efficacité. Fondamentalement, chaque fichier sera assigné à une tâche de carte. Si les fichiers sont petits, le temps système nécessaire pour configurer la tâche de mappage peut être considérable par rapport au temps nécessaire pour traiter le fichier.
38
ajduff574

Selon la manière dont les données sont stockées dans HDFS, vous devrez peut-être utiliser l'option -text pour dfs pour une recherche de chaîne. Dans mon cas, des milliers de messages étaient stockés quotidiennement dans une série de fichiers de séquence HDFS au format AVRO. A partir de la ligne de commande sur un nœud Edge, ce script:

  1. Recherche dans le répertoire/data/lake/raw à son premier niveau une liste De fichiers.
  2. Passe le résultat à awk, qui affiche les colonnes 6 et 8 (date et nom de fichier )
  3. Grep affiche les lignes avec la date du fichier en question (2018-05-03)
  4. Passe ces lignes avec deux colonnes à awk, qui ne sort que la colonne 2, La liste des fichiers.
  5. Celui-ci est lu avec une boucle while qui prend chaque nom de fichier et l'extrait De HDFS sous forme de texte.
  6. Chaque ligne du fichier est grep-ed pour la chaîne "7375675".
  7. Les lignes répondant à ces critères sont affichées à l'écran (stdout)

Il existe une implémentation solr jar-file qui est supposément plus rapide que je n’ai pas essayée.

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
Mike Woodcock

Vous pouvez utiliser hadoop.HdfsFindTool avec solr, est plus rapide que 'hdfs dfs ls -R' et plus utile.

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 ...]]
1
Mark

Pour 1, vous pouvez chercher comme ceci:

hadoop -find . -name "<name_of_file>"
0
Gadzair