2012-08-29 27 views
12

Quiero transferir archivos de HDFS al sistema de archivos local de un servidor diferente que no está en el cluster hadoop pero en la red.Transferir archivo desde HDFS

que podría haber hecho:

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

Como los datos son enormes y debido al espacio limitado en el sistema de archivos local de la máquina pasarela hadoop, quería evitar esto y envían los datos directamente a mi servidor de archivos.

Por favor ayuda con algunos consejos sobre cómo manejar este problema.

+1

¿Podría su servidor de archivos conectarse directamente a su namenode? –

+0

No. Por ahora, no se conecta. Pero me gustaría saber tu sugerencia. – dipeshtech

+0

Haría un simple túnel SSH a su namenode y se conectaría desde su servidor de archivos. –

Respuesta

2

Así que probablemente tienen un archivo con un montón de piezas como la salida de su programa de Hadoop.

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

Así que vamos a hacer una parte a la vez?

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 

Puede que tenga que buscar el modificador contraseña para SCP

2

Creo que la solución más simple sería el montaje en red o SSHFS para simular localmente el directorio local del servidor de archivos.
También puede montar FTP como un directorio local: http://www.linuxnix.com/2011/03/mount-ftp-server-linux.html

+0

¡Gracias David por la solución! Pero, de alguna manera, el montaje de entorno cruzado no está disponible aquí. Voy a ir con la solución que djc391 ha sugerido por ahora. – dipeshtech

+0

Mencionó datos enormes, por lo que busqué la manera de evitar por completo el almacenamiento local de datos. ¿Qué quiere decir con montaje de entorno cruzado? –

9

Esta es la forma más sencilla de hacerlo:

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

Funciona para archivos binarios también.

+0

¿Es posible hacerlo recursivamente? para copiar archivos y directorios? – coloboxp

1

Puede hacer uso de la API REST webHDFS para hacer eso. Haga un curl desde la máquina donde desea descargar los archivos.

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

Otro enfoque podría ser el uso de la DataNode API través wget para hacer esto:

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

embargo, la forma más conveniente, en mi humilde opinión, sería utilizar la NameNode webUI. Como esta máquina es parte de la red, puede apuntar su navegador web al NameNode_Machine:50070. Luego de navegar a través de HDFS, abra el archivo que desea descargar y haga clic en Download this file.

0

Estaba intentando hacer esto también (estaba usando la seguridad de Kerberos). Esto me ayudó después de una pequeña actualización: https://hadoop.apache.org/docs/r1.0.4/webhdfs.html#OPEN

Ejecutar directamente curl -L -i --negotiate "http://<HOST>:<PORT>/webhdfs/v1/<PATH>?op=OPEN" no funcionó para mí, explicaré por qué.

Este comando va a hacer dos pasos:

  1. encontrar un archivo que desea descargar y crear un vínculo temporal - volver 307 Temporary Redirect

  2. desde este enlace se descargará un conjunto de datos - volver HTTP 200 OK.

El conmutador -L está diciendo que él toma un archivo y continuar con el aserrado directamente. Si agrega al comando curl -v, se registrará en la salida; si es así, verás dos pasos descritos en la línea de comando, como dije. PERO - porque debido al enrollamiento de la versión anterior (que no puedo borrar) no funcionará.

solución para esto (en Shell):

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

Esto conseguirá enlace temporal y guardarla en $LOCATION variable.

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

Y esto lo guardará en su archivo local, si se agrega -o <file-path>.

Espero que haya sido útil.

J.

Cuestiones relacionadas