2012-08-29 4 views
12

HDFS에서 네트워크에있는 다른 서버의 로컬 파일 시스템으로 파일을 전송하려고합니다.HDFS에서 파일 전송

은 내가 할 수 있었다 : 데이터가 큰 인해 하둡 게이트웨이 컴퓨터의 로컬 파일 시스템에 제한된 공간에있다

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

, 나는 이러한 문제가 발생하지 않도록하고 싶어 내 파일 서버에 직접 데이터를 전송.

이 문제를 해결하는 방법에 대한 몇 가지 도움말을 제공해주십시오.

+1

파일 서버가 namenode에 직접 연결할 수 있습니까? –

+0

아니요. 지금은 연결되지 않습니다. 하지만 당신의 제안을 알고 싶습니다. – dipeshtech

+0

namenode에 간단한 SSH 터널을 만들고 파일 서버에서 연결하겠습니까? –

답변

2

그래서 당신은 아마 당신의 하둡 프로그램의 출력과 같은 부품의 무리와 함께 파일이 있습니다.

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

한 번에 한 부분 씩 할 수 있습니까?

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

그것은 너무 바이너리 파일을 작동합니다

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 

당신은 SCP

2

로컬 파일 서버 디렉토리를 로컬에서 시뮬레이트하는 가장 간단한 솔루션은 네트워크 마운트 또는 SSHFS 일 것입니다.
또한 로컬 디렉토리로 FTP를 마운트 할 수 있습니다 : http://www.linuxnix.com/2011/03/mount-ftp-server-linux.html

+0

솔루션 데이비드에게 감사드립니다! 그러나, 여하튼 크로스 환경 마운트는 여기서 사용할 수 없습니다. djc391이 지금 제안한 해결 방법으로 갈 것입니다. – dipeshtech

+0

거대한 데이터를 언급 했으므로 데이터를 로컬에 저장하는 것을 완전히 피하는 방법을 모색했습니다. 교차 환경 마운트 란 무슨 뜻입니까? –

9

의 암호 수정을 조회 할 수 있습니다이 할 수있는 가장 간단한 방법입니다.

+0

재귀 적으로 할 수 있습니까? 파일과 디렉토리를 복사 하시겠습니까? – coloboxp

1

webHDFS REST API를 사용하여이를 수행 할 수 있습니다. 파일을 다운로드 할 시스템에서 curl을 수행하십시오.

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

또 다른 방법이 작업을 수행 할 수 wget 통해 DataNode API을 사용할 수 : 가장 편리한 방법, 이럴

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

하지만, 네임 노드 웹 UI를 사용하는 것입니다. 이 컴퓨터는 네트워크의 일부이므로 웹 브라우저에서 NameNode_Machine:50070을 가리키면됩니다. 그런 다음 HDFS를 탐색하고 다운로드 할 파일을 열고 Download this file을 클릭하십시오.

0

나는 (Kerberos 보안을 사용하고 있었음)이 작업을하려고 했었습니다. 이것은 작은 업데이트 후 나를 도왔습니다 : https://hadoop.apache.org/docs/r1.0.4/webhdfs.html#OPEN

직접 실행 curl -L -i --negotiate "http://<HOST>:<PORT>/webhdfs/v1/<PATH>?op=OPEN" 나를 위해 일하지 않았다, 나는 이유를 설명 할게.

이 명령은 다음과 같은 두 가지 단계를 수행합니다

  1. 이 다운로드 및 임시 링크를 생성 할 파일을 찾기 - 자신이 데이터를 다운로드합니다 링크에서 307 Temporary Redirect

  2. 을 반환 - HTTP 200 OK을 반환합니다.

스위처 -L은 파일을 가져 와서 톱질을 계속한다고 말합니다. curl 명령 -v에 추가하면 출력으로 기록됩니다. 그렇다면 명령 줄에 두 단계가 설명되어 있습니다. 하지만 이전 버전의 컬 때문에 (우울하지 못함) 작동하지 않습니다. (쉘에서) 이것에 대한

해결책 :

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

이 임시 링크를 얻을 $LOCATION 변수에 저장합니다.

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

-o <file-path>을 추가하면 로컬 파일에 저장됩니다.

는 나는 그것이 도움이되기를 바랍니다.

제이