2015-01-27 5 views
0

나는 hadoop을 실행하는 컨테이너가 있습니다. 필자는 입력 디렉토리 생성, 기본 예제 처리, 출력 표시와 같은 Map-Reduce 작업 명령을 포함하는 다른 도커 파일을 가지고 있습니다. 두 번째 파일의 기본 이미지는 첫 번째 도커 파일에서 만든 hadoop_image입니다.실행중인 도커 컨테이너에서 명령을 실행하는 방법은 무엇입니까?

EDIT

Dockerfile - 이로부터 생성

#base image is ubuntu:precise 
#cdh installation 
#hadoop-0.20-conf-pseudo installation 
#CMD to start-all.sh 

start-all.sh 하둡

#start all the services under /etc/init.d/hadoop-* 

하둡베이스 이미지.

Dockerfile2

#base image is hadoop 
#flume-ng and flume-ng agent installation 
#conf change 
#flume-start.sh 

내가 별도로 모두 용기를 실행하고

#start flume services 

flume-start.sh. 그것은 잘 작동합니다. 내가

docker run -it flume_service 

을 실행하면하지만 수로 시작하고 나에게 배쉬 프롬프트를 보여 [/ 빈/bash는은 flume-start.sh의 마지막 줄입니다]. 연결 예외에 실패 8020 : :이 내가 두 번째 실행중인 컨테이너에

hadoop fs -ls/

를 실행, 나는 다음과 같은 오류를

LS 무엇입니까 : 514fa776649a/172.17.5.188는 localhost로부터 전화 java.net.ConnectException : 연결이 거부되었습니다. 더 자세한 내용은 http://wiki.apache.org/hadoop/ConnectionRefused

나는 hadoop 서비스가 아직 시작되지 않았기 때문에이 오류가 발생한다는 것을 알고 있습니다. 하지만 의심의 여지가 내 첫 번째 컨테이너가 실행 중입니다. 나는 이것을 두 번째 컨테이너의 기본 이미지로 사용하고 있습니다. 그런데 왜이 오류가 발생합니까? flume contianer의 hdfs-site.xml 파일에서 무엇인가를 변경해야합니까?

가상 분산 모드 설치.

제안 사항?

아니면 어떤 포트를 노출해야합니까? 그래서, 나에게 예를

편집을 제공하십시오 2

iptables -t nat -L -n 

내가

sudo iptables -t nat -L -n 
    Chain PREROUTING (policy ACCEPT) 
    target  prot opt source    destination 
    DOCKER  all -- 0.0.0.0/0   0.0.0.0/0   ADDRTYPE match dst- 

    Chain POSTROUTING (policy ACCEPT) 
    target  prot opt source    destination 
    MASQUERADE tcp -- 192.168.122.0/24 !192.168.122.0/24 masq ports: 1024-6 
    MASQUERADE udp -- 192.168.122.0/24 !192.168.122.0/24 masq ports: 1024-6 
    MASQUERADE all -- 192.168.122.0/24 !192.168.122.0/24 
    MASQUERADE all -- 172.17.0.0/16  0.0.0.0/0 

    Chain OUTPUT (policy ACCEPT) 
    target  prot opt source    destination 
    DOCKER  all -- 0.0.0.0/0   !127.0.0.0/8   ADDRTYPE match dst- 

Chain DOCKER (2 references) 
target  prot opt source    destination 

볼이 고정 표시기의 @의 domian입니다. 컨테이너 안에 있지 않습니다.

편집 는 surazj

답변

0

당신이 컨테이너를 연결하는 시도 해 봤나 '대답에서 마지막 코멘트를 참조하십시오?

예를 들어 hadoop이라는 컨테이너가 psedo dist 모드로 실행 중입니다. flume이 들어있는 다른 컨테이너를 가져 오려고합니다. 당신이 수로 컨테이너 내부에 얻을 때 당신은

docker run -it --link hadoop:hadoop --name flume ubuntu:14.04 bash 

같은 컨테이너를 연결할 수 - 유형 ENV에게 명령을 IP 및 포트 하둡 컨테이너에 의해 노출 볼 수 있습니다.

flume 컨테이너에서 뭔가를 할 수 있어야합니다. 당신이 점점 오류가 일부 하둡 서비스 수로에서 실행되고 있지 관련이있을 수

$ hadoop fs -ls hdfs://<hadoop containers IP>:8020/ 

(하둡 컨테이너 포트는 노출되어야합니다). 서비스가 실행 중인지 확인하려면 jps을 수행하십시오. 하지만 flume 컨테이너에서 올바르게 클래스 패스를 설정했다면, 아무것도 시작하지 않고 위의 hdfs 명령 (-ls hdfs : // : 8020 /)을 실행할 수 있다고 생각합니다. 그러나 원한다면

hadoop fs -ls/

flume 컨테이너에서 작동하려면 flume 컨테이너에서 역시 hadoop 서비스를 시작해야합니다. 핵심-site.xml 파일에

이 너무 네임 노드와 같은 dfs.namenode.rpc 주소를 추가

<property> 
    <name>fs.defaultFS</name> 
    <value>hdfs://localhost:8020</value> 
    </property> 
    <property> 
    <name>dfs.namenode.rpc-address</name> 
    <value>0.0.0.0:8020</value> 
    </property> 

하는 네임 노드와 데이터 노드

를 다시 시작해야합니다 모든 IP의 연결을 청취 sudo는 sudo를 다시 시작 /etc/init.d/hadoop-hdfs-datanode & & 다시 시작 /etc/init.d/hadoop-hdfs-namenode

는 그런 다음, 링크 된 용기에

hadoop fs -ls hdfs://localhost:8020/ 
hadoop fs -ls hdfs://172.17.0.11:8020/ 

예를 들어, 연결 오류없이 하둡 컨테이너에서이 작업을 수행 할 수 있어야합니다. 당신의 하둡 컨테이너에 의해 노출 된 포트를 볼 수 ENV를 입력

ENV

당신은 HADOOP_PORT_8020_TCP = TCP과 같이 표시되어야합니다 //172.17.0.11 : 8020

이 그럼 당신은 확인할 수 있습니다 연결을 연결된 컨테이너에서 가져옵니다.

텔넷 172.17.0.11 8020

+0

이지도 축소 예제에서는 문제가 없습니다. 나는 cdh4.6.0을 설치하고있다. 하나의 컨테이너에서 실행 중입니다. 이제 다른 도커 파일에 대한 설치 지시가 있습니다. flume은 꼭두각시가 필요합니까? 그러나 그것은 별도의 컨테이너로 실행 중입니다. flume 명령이 hadoop_first_docker_file과 동일하면 잘 작동합니다. 그러나 별도의 파일 인 경우 실행중인 컨테이너에서 명령을 실행해야합니다. hadoop_first_docker_file 컨테이너에서 second_docker_file 명령을 실행/지정하는 방법은 무엇입니까? 지금은 분명합니까? 감사. –

+0

주된 관심사는 컨테이너 1에서 스크립트를 공유하기 만하면 컨테이너에 볼륨을 연결하고 스크립트를 볼륨으로 이동할 수 있습니다. 두 컨테이너 모두 볼륨에 액세스 할 수 있습니다 (즉, -v 플래그). 설치시 두 번째 컨테이너에서 독립 실행 형 모드로 flume을 실행하려고하는데 문제가 표시되지 않습니다. flume에서 hdfs에 쓰려고하십니까? – surajz

+0

예 suraj. 두 번째 dockerfile에서 hdfs에 액세스하는 동안 문제가 발생합니다. 첫 번째 도커 파일 –

0

나는 아직 같은 문제를 만났다 생각합니다. 나는 docker1에서 hadoop 명령 "start-all.sh"로 hadoop namenode와 datanode를 시작할 수 없다.

"hadoop-daemons.sh"를 통해 namenode 및 datanode가 시작되었지만 실패했습니다. 진짜 문제는 "ssh"가 docker에서 작동하지 않는다는 것입니다.
가 실행 시작보다 start-dfs.sh에 을에 "daemon.sh을"모든 용어 "daemons.sh"를 대체합니다

그래서, 당신도

  • (솔루션 1) 할 수 할

    $ HADOOP_PREFIX 경우/sbin/hadoop-daemon.sh 시작 데이터 노드 $ HADOOP_PREFIX 경우/sbin/하둡 :

  • (솔루션 2) -dfs.sh 네임 노드에게

을 시작 -daemon.sh 당신은 데이터 노드와 네임 노드 명령 "표준 새 번역"

감사에 의해 잘 작동하고 있습니다 볼 수 있습니다.

관련 문제