2012-08-29 10 views
12

Desidero trasferire file da HDFS al filesystem locale di un server diverso che non si trova in cluster hadoop ma nella rete.Trasferimento file da HDFS

avrei potuto fare:

hadoop fs -copyToLocal <src> <dest> 
and then scp/ftp <toMyFileServer>. 

Poiché i dati è enorme e causa dello spazio limitato sul filesystem locale della macchina gateway Hadoop, ho voluto evitare questo e inviato i dati direttamente al mio file server.

Si prega di aiuto con alcuni suggerimenti su come gestire questo problema.

+1

Il fileserver può collegarsi direttamente al proprio namenode? –

+0

No. Per ora, non si connette. Ma mi piacerebbe conoscere il tuo suggerimento. – dipeshtech

+0

Farebbe un semplice tunnel SSH al proprio namenode e si connetterà dal proprio server. –

risposta

2

Quindi probabilmente avete un file con un mazzo di parti come l'uscita dal programma Hadoop.

part-r-00000 
part-r-00001 
part-r-00002 
part-r-00003 
part-r-00004 

Quindi, facciamo una parte alla volta?

for i in `seq 0 4`; 
do 
hadoop fs -copyToLocal output/part-r-0000$i ./ 
scp ./part-r-0000$i [email protected]:/home/you/ 
rm ./part-r-0000$i 
done 

Potrebbe essere necessario ricerca il modificatore di password per SCP

2

Penso che la soluzione più semplice sarebbe mount di rete o SSHFS per simulare localmente la directory del file server locale.
È anche possibile montare FTP come una directory locale: http://www.linuxnix.com/2011/03/mount-ftp-server-linux.html

+0

Grazie David per la soluzione! Ma, in qualche modo, cross mount non è disponibile qui. Vado con il workaround che cosa ha suggerito djc391 per ora. – dipeshtech

+0

Hai citato dati enormi, quindi ho cercato il modo di evitare completamente la memorizzazione dei dati localmente. Cosa intendi per "cross environment mount"? –

9

Questo è il modo più semplice per farlo:

ssh <YOUR_HADOOP_GATEWAY> "hdfs dfs -cat <src_in_HDFS> " > <local_dst> 

Si lavora per i file binari troppo.

+0

È possibile farlo in modo ricorsivo? copiare file e directory? – coloboxp

1

È possibile utilizzare l'API REST webHDFS per farlo. Esegui un curl dalla macchina in cui si desidera scaricare i file.

curl -i -L "http://namenode:50075/webhdfs/v1/path_of_the_file?op=OPEN" -o ~/destination 

Un altro approccio potrebbe essere quello di utilizzare il DataNode API attraverso wget per fare questo:

wget http://$datanode:50075/streamFile/path_of_the_file 

Ma, il modo più conveniente, secondo me, sarebbe quella di utilizzare il NameNode WebUI. Poiché questa macchina è parte della rete, puoi semplicemente indirizzare il tuo browser Web a NameNode_Machine:50070. Successivamente, sfogliare l'HDFS, aprire il file che si desidera scaricare e fare clic su Download this file.

0

Stavo provando a fare anche questo (stavo usando la sicurezza Kerberos). Questo mi ha aiutato dopo il piccolo aggiornamento: https://hadoop.apache.org/docs/r1.0.4/webhdfs.html#OPEN

Eseguire direttamente curl -L -i --negotiate "http://<HOST>:<PORT>/webhdfs/v1/<PATH>?op=OPEN" non ha funzionato per me, spiegherò perché.

Questo comando farà due fasi:

  1. trovare un file che si desidera scaricare e creare un link temporaneo - ritorno 307 Temporary Redirect

  2. da questo link si scaricherà un data - tornare HTTP 200 OK.

Lo switcher -L sta dicendo che lui prende un file e continuare con segatura direttamente. Se aggiungi il comando arricciatura -v, eseguirà il log in output; se è così, vedrai due passaggi descritti in linea di comando, come ho detto. MA - perché a causa di una versione più vecchia di arricciatura (che non riesco a udire) non funzionerà.

soluzione per questo (in Shell):

LOCATION=`curl -i --negotiate -u : "${FILE_PATH_FOR_DOWNLOAD}?op=OPEN" | /usr/bin/perl -n -e '/^Location: (.*)$/ && print "$1\n"'` 

In questo modo ottenere link temporaneo e salvarlo $LOCATION variabile.

RESULT=`curl -v -L --negotiate -u : "${LOCATION}" -o ${LOCAL_FILE_PATH_FOR_DOWNLOAD}` 

E questo farà risparmiare al vostro file locale, se si aggiunge -o <file-path>.

Spero che abbia aiutato.

J.