聊聊复杂网络环境下hdfs的BlockMissingException异常|参数dfs.client.use.datanode.hostname
1 从一个复杂网络环境下的 hdfs 报错问题聊起
大家知道,企业真实的网络环境是复杂多变的,这可能有多种原因:
- 一方面,单台服务器可以安装多块网卡配置多个IP,而且还可以做网卡绑定NIC bonding/NIC teaming,链路聚合Link Aggregation等;
- 另一方面,容器技术如 docker/k8s,也通过 linux 的 network namespace 提供了多个隔离的网络命名空间和对应的多个IP;
- 还有一个原因,在采用公有云私有云混合云的部署架构时,单台服务器经常会配置一个面向外部的公网IP,和面向内部的私网IP。
在复杂的网络环境中部署并使用 hadoop 时,如果服务端的配置或客户端的使用不当,就可能会遇见各种问题:
- 其中一个常见的问题是,hdfs 客户端读写 datanode 数据时报错 BlockMissingException- 在公有云如 aws EC2或阿里云 ecs上搭建 hadoop 集群时,就经常会出现该错误;
- 某示例报错的详细错误信息如下:
读取文件错误: xxx - org.apache.hadoop.hdfs.BlockMissingException: could not obtain block: BP-XXXX-10.46.10.80-XXXX:blk_xx_xx file=xxxxx: no live nodes contain current block Block locations: DatanodeInfoWithStorage[10.46.10.80:50010,DS-XX,DISK] DatanodeInfoWithStorage[10.46.10.81:50010,DS-XX,DISK] DatanodeInfoWithStorage[10.46.10.82:50010,DS-XX,DISK] Dead nodes: DatanodeInfoWithStorage[10.46.10.82:50010,DS-XX,DISK] DatanodeInfoWithStorage