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.
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
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:
encuentre el archivo que desea descargar y cree un enlace temporal - return
307 Temporary Redirect
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
.