我有一个运行hadoop的容器。我有另一个docker文件,其中包含Map-Reduce作业命令,如创建输入目录,处理默认示例,显示输出。第二个文件的基本映像是从第一个docker文件创建的hadoop_image。
修改
Dockerfile - 用于hadoop
#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-*
从此创建的hadoop基础图像。
Dockerfile2
#base image is hadoop
#flume-ng and flume-ng agent installation
#conf change
#flume-start.sh
flume-start.sh
#start flume services
我分别运行两个容器。它工作正常。但如果我跑
docker run -it flume_service
它启动了水槽并向我显示了一个bash提示符[/ bin / bash是flume-start.sh的最后一行]。我执行
hadoop fs -ls /
在第二个正在运行的容器中,我收到以下错误
ls:从514fa776649a / 172.17.5.188调用localhost:8020连接异常失败: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
在docker @ domian中。不在容器内。
修改 请参阅surazj'回答
下的最新评论答案 0 :(得分:0)
您是否尝试过连接容器?
例如,名为 hadoop 的容器正在psedo dist模式下运行。您想要调出另一个包含水槽的容器。您可以链接容器,如
docker run -it --link hadoop:hadoop --name flume ubuntu:14.04 bash
当你进入水槽容器时 - 输入 env 命令查看hadoop容器暴露的ip和端口。
从水槽容器中你应该可以做类似的事情。 (应该暴露hadoop容器上的端口)
$ hadoop fs -ls hdfs://<hadoop containers IP>:8020/
您获得的错误可能与某些没有在水槽上运行的hadoop服务有关。执行 jps 检查正在运行的服务。但是我想如果你在flume容器上正确设置了hadoop classpath,那么你可以运行上面的hdfs命令(-ls hdfs://:8020 /)而无需启动任何东西。但如果你想要
hadoop fs -ls /
在水槽容器上工作,那么你需要在水槽容器上启动hadoop服务。
在你的core-site.xml上添加 dfs.namenode.rpc-address ,这样namenode就会监听来自所有ip的连接
<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>
确保重新启动namenode和datanode
sudo /etc/init.d/hadoop-hdfs-namenode restart&amp;&amp; sudo /etc/init.d/hadoop-hdfs-datanode restart
然后你应该可以从没有连接错误的hadoop容器中执行此操作,例如
hadoop fs -ls hdfs://localhost:8020/ hadoop fs -ls hdfs://172.17.0.11:8020/
在链接的容器上。键入env以查看hadoop容器的公开端口
的env
你应该看到类似的东西 HADOOP_PORT_8020_TCP = TCP://172.17.0.11:8020
然后,您可以验证链接容器的连接。
telnet 172.17.0.11 8020
答案 1 :(得分:0)
我想我遇到了同样的问题。我要么不能通过hadoop命令启动hadoop namenode和datanode&#34; start-all.sh&#34;在docker1中。
这是因为它通过&#34; hadoop-daemons.sh&#34;启动了namenode和datanode。但它失败了。真正的问题是&#34; ssh&#34;在docker中不起作用。
所以,你可以做任何一次
(解决方案1):
替换所有术语&#34; daemons.sh&#34; to&#34; daemon.sh&#34;在start-dfs.sh中,
而不是运行start-dfs.sh
(解决方案2):做
$ HADOOP_PREFIX / sbin / hadoop-daemon.sh启动datanode $ HADOOP_PREFIX / sbin / hadoop-daemon.sh start namenode
您可以通过命令&#34; jps&#34;
看到datanode和namenode工作正常问候。