Вопрос:
В настоящее время я работаю над проектом с использованием Hadoop DFS.
-
Я заметил, что в Hadoop Shell нет команды поиска или поиска. Есть ли способ поиска и поиска файла (например, testfile.doc) в Hadoop DFS?
-
Поддерживает ли Hadoop поиск содержимого файла? Если да, то как это сделать? Например, у меня есть много файлов Word Doc, хранящихся в HDFS, я хочу указать, какие файлы имеют в них слова “компьютерная наука”.
В других распределенных файловых системах? Является ли содержимое файла поиска мягким пятном распределенных файловых систем?
Лучший ответ:
- Вы можете сделать это: hdfs dfs -ls -R / | grep [search_term].
- Кажется, что здесь подходит приложение MapReduce. Вот что-то похожее, но для текстовых файлов. Однако, если эти документы невелики, вы можете столкнуться с неэффективностью. В принципе, каждый файл будет привязан к одной задаче карты. Если файлы малы, накладные расходы для настройки задачи карты могут быть значительными по сравнению с временем, необходимым для обработки файла.
Ответ №1
В зависимости от того, как данные хранятся в HDFS, вам может понадобиться использовать опцию -text для dfs для поиска строки. В моем случае у меня ежедневно хранились тысячи сообщений в виде последовательности файлов HDFS в формате AVRO. Из командной строки на граничном узле этот скрипт:
- Выполняет поиск в каталоге /data/lake/raw на первом уровне списка
файлов. - Передает результат в awk, который выводит столбцы 6 & 8 (дата и файл
имя) - Grep выводит строки с указанной датой файла (2018-05-03)
- Пропускает эти строки с двумя столбцами в awk, который выводит только столбец 2,
список файлов. - Это читается с помощью цикла while, который принимает каждое имя файла, извлекает
это из HDFS как текст. - Каждая строка файла содержит строку “7375675”.
- Строки, соответствующие этим критериям, выводятся на экран (стандартный вывод)
Существует реализация 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 Ответ №2
Вы можете использовать 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
Для 1 вы можете искать так:
hadoop -find . -name «<name_of_file>» Ответ №4
1.- В вашем первом примере есть команда find под названием -find, которая работает:
hdfs dfs -find /some/path/ -name «testfile.doc»
2.- Для поиска контента я бы предложил перечислить файлы и сохранить результат в файл.
hdfs dfs -ls -R /some/path/ >> someFile
а затем просто добавьте несколько фильтров в этот файл, например:
cat someFile | grep «computer science»
И ты получишь свой результат.
Ответ №5
Обычно, когда я ищу файлы в 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:
Файл, который вы ищете.
дорожка:
Путь для поиска, чтобы просмотреть рекурсивно, это также включает в себя подпапки.