我有两个用于水槽和hadoop的运行容器。让它成为hadoop2和flume2。我从两个图像中创建了这两个容器,即hadoop_alone和flume_alone。
docker run -d -p 10.236.173.XX:8020:8020 -p 10.236.173.XX:50030:50030 -p 10.236.173.XX:50060:50060 -p 10.236.173.XX:50070:50070 -p 10.236.173.XX:50075:50075 -p 10.236.173.XX:50090:50090 -p 10.236.173.XX:50105:50105 --name hadoopservices hadoop_alone
我进入hadoop容器并检查暴露的端口。所以所有端口都正确暴露。
docker run -d --name flumeservices -p 0.0.0.0:5140:5140 -p 0.0.0.0:44444:44444 --link hadoopservices:hadoopservices flume_alone
我进入水槽容器并检查env
和etc/hosts
条目。 hadoopservices有一个条目,并且会自动创建env
个变量。
我的core-site.xml
fs.defaultFS
hdfs://0.0.0.0:8020
我对其进行了修改,以便从8020接受来自所有容器的服务。
我在flume.conf中的源码和接收器
a2.sources.r1.type = netcat
a2.sources.r1.bind = localhost
a2.sources.r1.port = 5140
a2.sinks.k1.type = hdfs
a2.sinks.k1.hdfs.fileType = DataStream
a2.sinks.k1.hdfs.writeFormat = Text
a2.sinks.k1.hdfs.path = hdfs://hadoopservices:8020/user/root/syslog/%y-%m-%d/%H%M/%S
a2.sinks.k1.hdfs.filePrefix = events
a2.sinks.k1.hdfs.roundUnit = minute
a2.sinks.k1.hdfs.useLocalTimeStamp = true
我在更改core-site.xml
后重新启动了hadoop namenode。
我尝试使用
从水槽写入hdfs/usr/bin/flume-ng agent --conf-file /etc/flume-ng/conf/flume.conf --name a2 -Dflume.root.logger=INFO,console
它说
INFO hdfs.DFSClient: Exception in createBlockOutputStream
java.net.ConnectException:拒绝连接
所以我发现这两个联系人之间建立了联系的问题。我进入hadoop容器并检查端口连接
netstat -tna
tcp 0 0 127.0.0.1:52521 127.0.0.1:8020 TIME_WAIT
tcp 0 0 127.0.0.1:8020 127.0.0.1:52516 ESTABLISHED
tcp 0 0 127.0.0.1:52516 127.0.0.1:8020 ESTABLISHED
但我希望它是
tcp 0 0 172.17.1.XX:54342 172.17.1.XX:8020 TIME_WAIT
tcp 0 0 172.17.1.XX:54332 172.17.1.XX:8020 ESTABLISHED
tcp 0 0 172.17.1.XX:8020 172.17.1.XX:54332 ESTABLISHED
其中172.17.1.XX是我的hadoop容器的ip。
我找到了原因。是原因吗?
应该修改哪个配置?还是我的跑步声明?应该更改什么来建立这两个docker容器之间的连接,以便我能够从flume写入hdfs。
如果您需要更多信息,我会进一步修改。
请告诉我一些想法。
答案 0 :(得分:0)
如果有人遇到同样的问题,请执行以下步骤。
1) Check whether 0.0.0.0:8020 is updated in core-site.xml
2) If you update it inside running container, **I suggest you all to restart ALL the services NOT ONLY namenode**. [better do as part of Dockerfile]
3) Check for `env` and `etc/hosts` contents in flume container
4) And hostname in `etc/hosts` must be matched with the `hdfs path` parameter in flume.conf
5) Get into hadoop container and do `netstat -tna` and you must see connection established to <hadoop_container_ip>:8020. Not to your localhost[127.0.0.1].
我希望它对尝试链接容器和端口映射的人有所帮助。