docker - HDFS 从 kafka 写入 : createBlockOutputStream Exception

标签 docker hadoop apache-kafka hdfs

我正在使用来自 docker swarm 的 Hadoop 和 1 个名称节点和 3 个数据节点(在 3 台物理机器上)。 我还使用 kafka 和 kafka connect + hdfs connector 以 parquet 格式将消息写入 HDFS。

我能够使用 HDFS 客户端 (hdfs put) 将数据写入 HDFS。 但是当kafka写消息的时候,它在一开始就工作,然后如果失败并出现这个错误:

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=/10.0.0.8:50010]
    at org.apache.hadoop.net.NetUtils.connect(NetUtils.java:534)
    at org.apache.hadoop.hdfs.DFSOutputStream.createSocketForPipeline(DFSOutputStream.java:1533)
    at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.createBlockOutputStream(DFSOutputStream.java:1309)
    at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.nextBlockOutputStream(DFSOutputStream.java:1262)
    at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.run(DFSOutputStream.java:448)
[2018-05-23 10:30:10,125] INFO Abandoning BP-468254989-172.17.0.2-1527063205150:blk_1073741825_1001 (org.apache.hadoop.hdfs.DFSClient:1265)
[2018-05-23 10:30:10,148] INFO Excluding datanode DatanodeInfoWithStorage[10.0.0.8:50010,DS-cd1c0b17-bebb-4379-a5e8-5de7ff7a7064,DISK] (org.apache.hadoop.hdfs.DFSClient:1269)
[2018-05-23 10:31:10,203] INFO Exception in createBlockOutputStream (org.apache.hadoop.hdfs.DFSClient:1368)
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=/10.0.0.9:50010]
        at org.apache.hadoop.net.NetUtils.connect(NetUtils.java:534)
        at org.apache.hadoop.hdfs.DFSOutputStream.createSocketForPipeline(DFSOutputStream.java:1533)
        at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.createBlockOutputStream(DFSOutputStream.java:1309)
        at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.nextBlockOutputStream(DFSOutputStream.java:1262)
        at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.run(DFSOutputStream.java:448)

然后数据节点对于该进程不再可达:

[2018-05-23 10:32:10,316] WARN DataStreamer Exception (org.apache.hadoop.hdfs.DFSClient:557)
org.apache.hadoop.ipc.RemoteException(java.io.IOException): File /topics/+tmp/test_hdfs/year=2018/month=05/day=23/hour=08/60e75c4c-9129-454f-aa87-6c3461b54445_tmp.parquet could only be replicated to 0 nodes instead of minReplication (=1).  There are 3 datanode(s) running and 3 node(s) are excluded in this operation.
        at org.apache.hadoop.hdfs.server.blockmanagement.BlockManager.chooseTarget4NewBlock(BlockManager.java:1733)
        at org.apache.hadoop.hdfs.server.namenode.FSDirWriteFileOp.chooseTargetForNewBlock(FSDirWriteFileOp.java:265)
        at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getAdditionalBlock(FSNamesystem.java:2496)
        at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.addBlock(NameNodeRpcServer.java:828)

但如果我查看 hadoop web 管理控制台,所有节点似乎都正常运行。

我已经检查了 hdfs 站点,并且名称节点和数据节点上的“dfs.client.use.datanode.hostname”设置都设置为 true。 hadoop 配置文件中的所有 ips 都使用 0.0.0.0 地址定义。

我也试过格式化namenode,但是又报错了。

会不会是 Kafka 在 HDFS 中写的太快了,压垮了?这会很奇怪,因为我在较小的集群上尝试过相同的配置,并且即使在 kafka 消息吞吐量很大的情况下它也能正常工作。

对于这个问题的根源,您还有其他想法吗?

谢谢

最佳答案

dfs.client.use.datanode.hostname=true 也必须配置到客户端,并且按照您的日志堆栈:

java.nio.channels.SocketChannel[connection-pending remote=/10.0.0.9:50010]

我猜 10.0.0.9 指的是私有(private)网络 IP;因此,该属性似乎未在 hdfs-client.xml 中的客户端中设置。

您可以找到更多详细信息 here .

关于docker - HDFS 从 kafka 写入 : createBlockOutputStream Exception,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50484864/

相关文章:

java - hadoop类路径

nginx - Docker nginx 代理到主机

r - 如何从本地 R 连接到在 Docker 容器中运行的 PostgreSQL?

linux - 以交互方式启动 docker 容器

java - 带有kafka主干的Activiti

java - 如何使用 Spark 的 Direct Stream for Kafka 设置消费者组提交的偏移量?

java - 将 Kafka Streams 用作 Kafka Consumer 应用程序中的状态存储

visual-studio - 在 Visual Studio 2019 中启动 Docker-compose 时无法启动调试适配器?

hadoop - 验证 Cloudera Hadoop 服务是否在容器中运行

hadoop - 具有 unix 时间戳的 Hive float 据类型