我有一个HBase + HDFS设置,其中每个HBase主服务器,区域服务器,HDFS名称节点和数据节点都被容器化。
在单个主机VM上运行所有这些容器时,一切正常,因为我可以直接使用docker容器名称,并将配置变量设置为:
CORE_CONF_fs_defaultFS: hdfs://namenode:9000
对于regionserver和datanode。系统在此配置下可以正常工作。
但是,当尝试在多个主机VM上分发它们时,我遇到了问题。
我将上面的配置变量更新为:
CORE_CONF_fs_defaultFS: hdfs://hostname:9000
并确保namenode容器公开了端口9000,并将其映射到主机的端口9000。
使用主机名时,名称似乎无法正确解析,并且在datanode日志中看到的错误如下:
2019-08-24 05:46:08,630 INFO impl.FsDatasetAsyncDiskService: Deleted BP-1682518946-<ip1>-1566622307307 blk_1073743161_2337 URI file:/hadoop/dfs/data/current/BP-1682518946-<ip1>-1566622307307/current/rbw/blk_1073743161
2019-08-24 05:47:36,895 INFO datanode.DataNode: Receiving BP-1682518946-<ip1>-1566622307307:blk_1073743166_2342 src: /<ip3>:48396 dest: /<ip2>:9866
2019-08-24 05:47:36,897 ERROR datanode.DataNode: <hostname>-datanode:9866:DataXceiver error processing WRITE_BLOCK operation src: /<ip3>:48396 dst: /<ip2>:9866
java.nio.channels.UnresolvedAddressException
at sun.nio.ch.Net.checkAddress(Net.java:101)
at sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:622)
at org.apache.hadoop.net.SocketIOWithTimeout.connect(SocketIOWithTimeout.java:192)
at org.apache.hadoop.net.NetUtils.connect(NetUtils.java:531)
at org.apache.hadoop.net.NetUtils.connect(NetUtils.java:495)
at org.apache.hadoop.hdfs.server.datanode.DataXceiver.writeBlock(DataXceiver.java:786)
at org.apache.hadoop.hdfs.protocol.datatransfer.Receiver.opWriteBlock(Receiver.java:173)
at org.apache.hadoop.hdfs.protocol.datatransfer.Receiver.processOp(Receiver.java:107)
at org.apache.hadoop.hdfs.server.datanode.DataXceiver.run(DataXceiver.java:290)
at java.lang.Thread.run(Thread.java:748)
<hostname>-datanode
是数据节点容器的名称,而IP是各种容器IP。
我想知道是否遗漏了一些配置变量,该变量会让其他VM的容器连接到名称节点,或者是否进行了其他一些更改,以使此系统能够正确分发。我想知道系统是否期望以某种方式命名容器。