Подтвердить что ты не робот

Grep для нескольких файлов в файловой системе Hadoop

Я работаю с Hadoop, и мне нужно найти, какой из ~ 100 файлов в моей файловой системе Hadoop содержит определенную строку.

Я могу просмотреть файлы, которые я хочу найти следующим образом:

bash-3.00$ hadoop fs -ls /apps/mdhi-technology/b_dps/real-time

.., который возвращает несколько записей:

-rw-r--r--   3 b_dps mdhi-technology 1073741824 2012-07-18 22:50 /apps/mdhi-technology/b_dps/HADOOP_consolidated_RT_v1x0_20120716_aa
-rw-r--r--   3 b_dps mdhi-technology 1073741824 2012-07-18 22:50 /apps/mdhi-technology/b_dps/HADOOP_consolidated_RT_v1x0_20120716_ab

Как найти, какая из них содержит строку bcd4bc3e1380a56108f486a4fffbc8dc? Как только я знаю, я могу редактировать их вручную.

4b9b3361

Ответ 1

Это файловая система hadoop, а не POSIX, поэтому попробуйте следующее:

hadoop fs -ls /apps/hdmi-technology/b_dps/real-time | awk '{print $8}' | \
while read f
do
  hadoop fs -cat $f | grep -q bcd4bc3e1380a56108f486a4fffbc8dc && echo $f
done

Это должно работать, но оно серийно и поэтому может быть медленным. Если ваш кластер может принять тепло, мы можем распараллелить:

hadoop fs -ls /apps/hdmi-technology/b_dps/real-time | awk '{print $8}' | \
  xargs -n 1 -I ^ -P 10 bash -c \
  "hadoop fs -cat ^ | grep -q bcd4bc3e1380a56108f486a4fffbc8dc && echo ^"

Обратите внимание на параметр -P 10 на xargs: это то, сколько файлов мы будем скачивать и искать параллельно. Начните с низкого уровня и увеличьте количество, пока вы не насытите дисковый ввод-вывод или пропускную способность сети, что бы ни было в вашей конфигурации.

РЕДАКТИРОВАТЬ: учитывая, что вы находитесь на SunOS (который немного мертв мозгом), попробуйте следующее:

hadoop fs -ls /apps/hdmi-technology/b_dps/real-time | awk '{print $8}' | while read f; do hadoop fs -cat $f | grep bcd4bc3e1380a56108f486a4fffbc8dc >/dev/null && echo $f; done

Ответ 2

Чтобы найти все файлы с любым расширением рекурсивно внутри местоположения hdfs:

hadoop fs -find  hdfs_loc_path  -name ".log"

Ответ 3

Использование hadoop fs -cat (или более общий hadoop fs -text) может быть осуществимым, если у вас есть только два файла объемом 1 ГБ. Для 100 файлов, хотя я бы использовал streaming-api, поскольку он может использоваться для adhoc-запросов, не прибегая к полноценной задаче mapreduce. Например. в вашем случае создайте script get_filename_for_pattern.sh:

#!/bin/bash
grep -q $1 && echo $mapreduce_map_input_file
cat >/dev/null # ignore the rest

Обратите внимание, что вам нужно прочитать весь ввод, чтобы избежать получения исключений java.io.IOException: Stream closed.

Затем выполните команды

hadoop jar $HADOOP_HOME/hadoop-streaming.jar\
 -Dstream.non.zero.exit.is.failure=false\
 -files get_filename_for_pattern.sh\
 -numReduceTasks 1\
 -mapper "get_filename_for_pattern.sh bcd4bc3e1380a56108f486a4fffbc8dc"\
 -reducer "uniq"\
 -input /apps/hdmi-technology/b_dps/real-time/*\
 -output /tmp/files_matching_bcd4bc3e1380a56108f486a4fffbc8dc
hadoop fs -cat /tmp/files_matching_bcd4bc3e1380a56108f486a4fffbc8dc/*

В новых дистрибутивах mapred streaming вместо hadoop jar $HADOOP_HOME/hadoop-streaming.jar должна работать. В последнем случае вам нужно правильно установить $HADOOP_HOME, чтобы найти банку (или предоставить полный путь напрямую).

Для более простых запросов вам даже не нужен script, но он может непосредственно передать команду параметру -mapper. Но для чего-то слегка сложного предпочтительнее использовать script, потому что получение права экранирования может быть сложной задачей.

Если вам не нужна фаза уменьшения, поставьте символический параметр NONE в соответствующую опцию -reduce (или просто используйте -numReduceTasks 0). Но в вашем случае полезно иметь фазу уменьшения, чтобы объединить вывод в один файл.

Ответ 4

Вы хотите применить команду grep в папке hdfs

hdfs dfs -cat /user/coupons/input/201807160000/* | grep -c null

здесь cat рекурсивно просматривает все файлы в папке, и я применил grep, чтобы найти count.

Ответ 5

hadoop fs -find /apps/mdhi-technology/b_dps/real-time  -name "*bcd4bc3e1380a56108f486a4fffbc8dc*"

hadoop fs -find /apps/mdhi-technology/b_dps/real-time  -name "bcd4bc3e1380a56108f486a4fffbc8dc"