我有麻烦,使我的hdfs设置工作在码头群。为了理解这个问题,我将我的设置降到了最低限度:
1台物理机
1名称节点
1个数据节点
这个设置在docker compose中运行良好,但在docker swarm中使用相同的compose文件时失败。
以下是撰写文件:
version: '3'
services:
namenode:
image: uhopper/hadoop-namenode
hostname: namenode
ports:
- "50070:50070"
- "8020:8020"
volumes:
- /userdata/namenode:/hadoop/dfs/name
environment:
- CLUSTER_NAME=hadoop-cluster
datanode:
image: uhopper/hadoop-datanode
depends_on:
- namenode
volumes:
- /userdata/datanode:/hadoop/dfs/data
environment:
- CORE_CONF_fs_defaultFS=hdfs://namenode:8020
为了测试它,我在我的主机(物理)上安装了一个hadoop客户机,在core-site.xml中只有以下简单配置:
<configuration>
<property><name>fs.defaultFS</name><value>hdfs://0.0.0.0:8020</value></property>
</configuration>
然后运行以下命令:
hdfs dfs -put test.txt /test.txt
使用docker compose(仅运行docker compose up)它可以工作,并且文件是用hdfs编写的。
我和docker swarm一起跑:
docker swarm init
docker stack deploy --compose-file docker-compose.yml hadoop
然后,当所有服务都启动时,我将文件放在hdfs上,它会像这样失败:
INFO hdfs.DataStreamer: Exception in createBlockOutputStream
org.apache.hadoop.net.ConnectTimeoutException: 60000 millis timeout while waiting for channel to be ready for connect. ch : java.nio.channels.SocketChannel[connection-pending remote=/x.x.x.x:50010]
at org.apache.hadoop.net.NetUtils.connect(NetUtils.java:534)
at org.apache.hadoop.hdfs.DataStreamer.createSocketForPipeline(DataStreamer.java:259)
at org.apache.hadoop.hdfs.DataStreamer.createBlockOutputStream(DataStreamer.java:1692)
at org.apache.hadoop.hdfs.DataStreamer.nextBlockOutputStream(DataStreamer.java:1648)
at org.apache.hadoop.hdfs.DataStreamer.run(DataStreamer.java:704)
18/06/14 17:29:41 WARN hdfs.DataStreamer: Abandoning BP-1801474405-10.0.0.4-1528990089179:blk_1073741825_1001
18/06/14 17:29:41 WARN hdfs.DataStreamer: Excluding datanode DatanodeInfoWithStorage[10.0.0.6:50010,DS-d7d71735-7099-4aa9-8394-c9eccc325806,DISK]
18/06/14 17:29:41 WARN hdfs.DataStreamer: DataStreamer Exception
org.apache.hadoop.ipc.RemoteException(java.io.IOException): File /test.txt._COPYING_ could only be replicated to 0 nodes instead of minReplication (=1). There are 1 datanode(s) running and 1 node(s) are excluded in this operation.
如果我在web ui中查看数据节点似乎已启动,并且没有报告任何问题。。。
更新:swarm似乎忽略了dependson,但这似乎不是我问题的原因:我在namenode启动时重新启动了datanode,但效果并不好。
感谢您的帮助:)
1条答案
按热度按时间knpiaxh11#
整个混乱源于docker swarm使用覆盖网络之间的交互,以及hdfs名称节点如何跟踪其数据节点。namenode根据datanode的覆盖网络ip记录datanode ip/主机名。当hdfs客户机直接请求对datanodes执行读/写操作时,namenode根据覆盖网络报告datanodes的ip/主机名。由于外部客户端无法访问覆盖网络,因此任何rw操作都将失败。
我使用的最终解决方案(在努力使覆盖网络正常工作之后)是让hdfs服务使用主机网络。以下是来自compose文件的片段: