que lista descargar comandos borrar archivos archivo hadoop hdfs data-transfer

hadoop - lista - Transferir archivo desde HDFS



hdfs hadoop que es (5)

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

Yo 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 de puerta de enlace hadoop, quería evitar esto y enviar datos directamente a mi servidor de archivos.

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



Entonces, probablemente tenga un archivo con varias partes como resultado de su programa 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 you@somewhere:/home/you/ rm ./part-r-0000$i done

Puede que tenga que buscar el modificador de contraseña para scp


Esta es la forma más simple de hacerlo:

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

Funciona también para archivos binarios.


Intentaba 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 hará dos pasos:

  1. encuentre el archivo que desea descargar y cree un enlace temporal - return 307 Temporary Redirect

  2. desde este enlace descargará una información - devuelve HTTP 200 OK .

El conmutador -L está diciendo que toma un archivo y continúa 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 obtendrá un enlace temporal y lo guardará en la variable $LOCATION .

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

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

Espero que haya ayudado.

J.


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

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

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

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

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