wake-up-neo.com

Wie kann man hadoop dazu bringen, Verzeichnisse anzulegen, wenn sie nicht existieren?

Ich habe Clouderas hadoop (0.20.2) benutzt. Wenn bei dieser Version eine Datei in das Dateisystem eingefügt wurde, die Verzeichnisstruktur jedoch nicht vorhanden war, wurden automatisch die übergeordneten Verzeichnisse erstellt:

Wenn ich beispielsweise keine Verzeichnisse in hdfs hatte und Folgendes eingab:

hadoop fs -put meineDatei.txt /some/non/existing/path/myfile.txt

Es würde alle Verzeichnisse erstellen: einige, nicht vorhandene und Pfad und die Datei dort ablegen.

Mit einem neueren Angebot von hadoop (2.2.0) findet diese automatische Erstellung von Verzeichnissen nicht statt ... _. Der gleiche Befehl oben ergibt:

put: `/ einige/nicht/vorhandene/Pfad/': Keine solche Datei oder Verzeichnis

Ich habe eine Problemumgehung, um einfach hadoop fs -mkdir zuerst für jeden Put auszuführen, aber dies wird nicht gut funktionieren.

Ist das konfigurierbar? Irgendwelche Ratschläge?

18
owly

Jetzt sollten Sie .__ verwenden. hadoop fs -mkdir -p <path>

24
art-vybor

hadoop fs ... ist veraltet stattdessen verwenden: hdfs dfs -mkdir .... 

3
aName

Das Platzieren einer Datei in einem nicht-erweiterten Verzeichnis in hdfs erfordert einen zweistufigen Prozess. Wie in @ rt-vybor angegeben, verwenden Sie die Option '-p' für mkdir, um mehrere fehlende Pfadelemente zu erstellen. Da das OP jedoch gefragt hat, wie die Datei in hdfs abgelegt werden soll, führt das Folgende auch den hdfs-Put aus und beachtet, dass Sie (optional) auch überprüfen können, ob der put erfolgreich war, und die lokale Kopie bedingt entfernen.

Erstellen Sie zuerst den relevanten Verzeichnispfad in hdfs und legen Sie dann die Datei in hdfs ab. Sie möchten vor dem Einfügen in HDFS überprüfen, ob die Datei vorhanden ist. Möglicherweise möchten Sie protokollieren/zeigen, dass die Datei erfolgreich in HDFS platziert wurde. Im Folgenden werden alle Schritte zusammengefasst.

fn=myfile.txt
if [ -f $fn ] ; then
  bfn=`basename $fn` #trim path from filename
  hdfs dfs -mkdir -p /here/is/some/non/existant/path/in/hdfs/
  hdfs dfs -put $fn /here/is/some/non/existant/path/in/hdfs/$bfn
  hdfs dfs -ls /here/is/some/non/existant/path/in/hdfs/$bfn
  success=$? #check whether file landed in hdfs
  if [ $success ] ; then
    echo "remove local copy of file $fn"
    #rm -f $fn #uncomment if you want to remove file
  fi
fi

Und Sie können dies in ein Shell-Skript verwandeln, das einen hadoop-Pfad und eine Liste von Dateien (auch nur einmal erstellen) enthält.

#!/bin/bash
hdfsp=${1}
shift;
hdfs dfs -mkdir -p /here/is/some/non/existant/path/in/hdfs/
for fn in $*; do
  if [ -f $fn ] ; then
    bfn=`basename $fn` #trim path from filename
    hdfs dfs -put $fn /here/is/some/non/existant/path/in/hdfs/$bfn
    hdfs dfs -ls /here/is/some/non/existant/path/in/hdfs/$bfn >/dev/null
    success=$? #check whether file landed in hdfs
    if [ $success ] ; then
      echo "remove local copy of file $fn"
      #rm -f $fn #uncomment if you want to remove file
    fi
  fi
done
0
ChuckCottrill