it-swarm.com.de

Grep über mehrere Dateien im Hadoop-Dateisystem

Ich arbeite mit Hadoop und muss herausfinden, welche der ~ 100 Dateien in meinem Hadoop-Dateisystem eine bestimmte Zeichenfolge enthalten.

Ich kann die Dateien sehen, die ich suchen möchte:

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

..was gibt mehrere Einträge wie folgt zurück:

-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

Wie finde ich, welche davon den String bcd4bc3e1380a56108f486a4fffbc8dc enthält? Sobald ich es weiß, kann ich sie manuell bearbeiten.

16
arsenal

Dies ist ein "hadoop" -Dateisystem ", kein POSIX-Dateisystem. Versuchen Sie Folgendes:

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

Das sollte funktionieren, aber es ist seriell und kann daher langsam sein. Wenn Ihr Cluster die Hitze aufnehmen kann, können wir parallelisieren:

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 ^"

Beachten Sie die -P 10-Option für xargs: Dies ist, wie viele Dateien parallel heruntergeladen und durchsucht werden. Starten Sie low und erhöhen Sie die Anzahl, bis Sie die Festplatten-E/A- oder Netzwerkbandbreite erreicht haben, je nachdem, was in Ihrer Konfiguration relevant ist.

EDIT: Angenommen, Sie sind auf SunOS (das ist ein bisschen hirntot), versuchen Sie Folgendes:

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
29
phs

So finden Sie alle Dateien mit einer beliebigen Endung rekursiv im Verzeichnis hdfs:

hadoop fs -find  hdfs_loc_path  -name ".log"
1
Gourav Goutam

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

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

0
D Xia

Sie suchen nach dem Befehl grep im Ordner hdfs

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

hier geht cat rekursiv alle dateien im ordner durch und ich habe grep angewendet, um zu zählen.

0
Mukesh Gupta

Die Verwendung von hadoop fs -cat (oder der allgemeineren hadoop fs -text) ist möglicherweise möglich, wenn Sie nur zwei 1-GB-Dateien haben. Für 100 Dateien würde ich jedoch die streaming-api verwenden, weil sie für Adhoc-Abfragen verwendet werden kann, ohne auf einen vollwertigen Mapreduce-Job zurückgreifen zu müssen. Z.B. In Ihrem Fall erstellen Sie ein Skript get_filename_for_pattern.sh:

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

Beachten Sie, dass Sie die gesamte Eingabe lesen müssen, um Java.io.IOException: Stream closed-Ausnahmen zu vermeiden.

Dann geben Sie die Befehle aus

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/*

In neueren Distributionen sollte mapred streaming anstelle von hadoop jar $HADOOP_HOME/hadoop-streaming.jar funktionieren. Im letzteren Fall müssen Sie Ihren $HADOOP_HOME richtig einstellen, um das Glas zu finden (oder den vollständigen Pfad direkt anzugeben).

Für einfachere Abfragen benötigen Sie nicht einmal ein Skript, sondern können den Befehl nur direkt an den Parameter -mapper übergeben. Bei etwas Komplexem ist es jedoch vorzuziehen, ein Skript zu verwenden, da die richtige Flucht recht mühsam sein kann.

Wenn Sie keine Reduktionsphase benötigen, geben Sie den symbolischen Parameter NONE für die entsprechende -reduce-Option an (oder verwenden Sie einfach -numReduceTasks 0). In Ihrem Fall ist es jedoch sinnvoll, eine Reduzierungsphase zu haben, um die Ausgabe in einer einzigen Datei zusammenzufassen.

0
David Ongaro