Поиск / Найти файл и содержимое файла в Hadoop - PullRequest
15 голосов
/ 09 июня 2011

В настоящее время я работаю над проектом, использующим Hadoop DFS.

  1. Я заметил, что в Hadoop Shell нет команды поиска или поиска. Есть ли способ поиска и поиска файла (например, testfile.doc) в Hadoop DFS?

  2. Поддерживает ли Hadoop поиск содержимого файла? Если да, то как это сделать? Например, у меня есть много файлов Word Doc, хранящихся в HDFS, я хочу перечислить, в каких файлах есть слова «информатика».

А как насчет других распределенных файловых систем? Поиск содержимого файла - это слабое место распределенных файловых систем?

Ответы [ 4 ]

40 голосов
/ 09 июня 2011
  1. Вы можете сделать это: hdfs dfs -ls -R / | grep [search_term].
  2. Похоже, здесь может подойти работа MapReduce. Вот нечто похожее, но для текстовых файлов. Однако, если эти документы небольшие, вы можете столкнуться с неэффективностью. По сути, каждый файл будет привязан к одной карте. Если файлы небольшие, накладные расходы на настройку задачи карты могут быть значительными по сравнению со временем, необходимым для обработки файла.
2 голосов
/ 10 мая 2018

В зависимости от того, как данные хранятся в HDFS, вам может понадобиться использовать параметр -text для dfs для поиска строк. В моем случае у меня ежедневно хранились тысячи сообщений в виде последовательности файлов HDFS в формате AVRO. Из командной строки на граничном узле этот скрипт:

  1. Поиск в каталоге / data / lake / raw на первом уровне списка файлов.
  2. Передает результат в awk, который выводит столбцы 6 и 8 (дата и файл имя)
  3. Grep выводит строки с указанной датой файла (2018-05-03)
  4. Передает те строки с двумя столбцами в awk, который выводит только столбец 2, список файлов.
  5. Это читается с помощью цикла while, который принимает каждое имя файла, извлекает это из HDFS как текст.
  6. Каждая строка файла содержит строку "7375675".
  7. Строки, соответствующие критериям, выводятся на экран (стандартный вывод)

Существует реализация jar-файла solr, которая предположительно быстрее, я не пробовал.

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 голос
/ 24 февраля 2017

Вы можете использовать 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 голосов
/ 02 марта 2019

Для 1 вы можете искать так:

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