2014-05-07 23 views
11

Używam hadoop Cloudera (0.20.2). W tej wersji, jeśli mogę umieścić plik w systemie plików, ale struktura katalogów nie istnieje, to automatycznie tworzone katalogi nadrzędny:Jak uzyskać hadoop umieścić do tworzenia katalogów, jeśli nie istnieją

Tak na przykład, jeśli nie miałem katalogi w HDFS i wpisane:

Hadoop fs -put myfile.txt /some/non/existing/path/myfile.txt

byłoby utworzyć wszystkie katalogi: niektórych, innych niż istniejące i ścieżka i umieścić plik tam.

Teraz z nowszą ofertą hadoop (2.2.0) to automatyczne tworzenie katalogów nie dzieje się. To samo polecenie powyżej rentowności:

put: `/ some/nie/istniejące/ścieżka/': Nie ma takiego pliku lub katalogu

mam obejście po prostu zrobić Hadoop fs -mkdir pierwszy , na każde ułożenie, ale to nie będzie dobrze działać.

Czy można konfigurować? Jakaś rada?

+0

Dlaczego nie będzie to dobrze wykonać? – climbage

+0

>> Dlaczego nie działa dobrze? Ponieważ dla każdego "put" robię mkdir - który przez większość czasu może nie być potrzebny, więc będzie miał wpływ na wydajność w sytuacjach wysokiej przepustowości. – owly

+0

Czy rozważałeś napisanie własnego rozwiązania? Jestem zaskoczony, że 'put' działa dobrze, biorąc pod uwagę, że każde połączenie musi uruchomić VM, odczytać konfigurację, itd ... – climbage

Odpowiedz

18

Teraz należy użyć hadoop fs -mkdir -p <path>

+0

To działa! Dzięki – ajkush

+0

jak odpowiedzieć na to pytanie? – hlagos

1

hadoop fs ... jest przestarzała, zamiast używać: hdfs dfs -mkdir ....

+0

hadoop dfs -mkdir/mnt/hdfs DEPRECATED: Użycie tego skryptu do wykonania polecenia hdfs jest przestarzałe. Zamiast tego użyj polecenia hdfs. – Anshul

0

Umieszczanie pliku w katalogu nie zachowanych w HDFS wymaga procesu dwuetapowego. Jak stwierdził @ rt-vybor, użyj opcji -p do mkdir, aby utworzyć wiele brakujących elementów ścieżki. Ponieważ jednak OP zadał pytanie, w jaki sposób umieścić plik w hdfs, poniższe instrukcje również wykonują polecenie hdfs i zauważ, że możesz również (opcjonalnie) sprawdzić, czy plik się powiódł i warunkowo usunąć lokalną kopię.

Najpierw utwórz odpowiednią ścieżkę do katalogu w pliku hdfs, a następnie umieść plik w formacie hdfs. Chcesz sprawdzić, czy plik istnieje przed umieszczeniem w hdfs. A może chcesz się zalogować/pokazać, że plik został pomyślnie umieszczony w hdfs. Poniższe łączy wszystkie kroki.

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 

I można przekształcić skrypt powłoki, biorąc ścieżkę Hadoop oraz listę plików (również tylko utworzyć ścieżkę raz),

#!/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