Поиск/Поиск файла и содержимого файла в Hadoop
В настоящее время я работаю над проектом с использованием Hadoop DFS.
-
Я заметил, что в Hadoop Shell нет команды поиска или поиска. Есть ли способ поиска и поиска файла (например, testfile.doc) в Hadoop DFS?
-
Поддерживает ли Hadoop поиск содержимого файла? Если да, то как это сделать? Например, у меня есть много файлов Word Doc, хранящихся в HDFS, я хочу указать, какие файлы имеют в них слова "компьютерная наука".
В других распределенных файловых системах? Является ли содержимое файла поиска мягким пятном распределенных файловых систем?
Ответы
Ответ 1
Ответ 2
В зависимости от того, как данные хранятся в 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
Ответ 3
Вы можете использовать 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 ...]]
Ответ 4
Для 1 вы можете искать так:
hadoop -find . -name "<name_of_file>"
Ответ 5
1.- В вашем первом примере есть команда find под названием -find
, которая работает:
hdfs dfs -find /some/path/ -name "testfile.doc"
2.- Для поиска контента я бы предложил перечислить файлы и сохранить результат в файл.
hdfs dfs -ls -R /some/path/ >> someFile
а затем просто добавьте несколько фильтров в этот файл, например:
cat someFile | grep "computer science"
И ты получишь свой результат.
Ответ 6
Обычно, когда я ищу файлы в 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:
Файл, который вы ищете.
дорожка:
Путь для поиска, чтобы просмотреть рекурсивно, это также включает в себя подпапки.