聊聊复杂网络环境下hdfs的BlockMissingException异常|参数dfs.client.use.datanode.hostname

news2024/11/27 15:41:24

聊聊复杂网络环境下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[10.46.10.80:50010,DS-XX,DISK] DatanodeInfoWithStorage[10.46.10.81:50010,DS-XX,DISK]
at org.apache.hadoop.hdfs.DFSInputStream.refetchLocations(DFSInputStream.java:1109)
at org.apache.hadoop.hdfs.DFSInputStream.chooseDataNode(DFSInputStream.java:1093)
at org.apache.hadoop.hdfs.DFSInputStream.chooseDataNode(DFSInputStream.java:1072)
at org.apache.hadoop.hdfs.DFSInputStream.blockSeekTo(DFSInputStream.java:673)
at org.apache.hadoop.hdfs.DFSInputStream.readWithStrategy(DFSInputStream.java:971)
at org.apache.hadoop.hdfs.DFSInputStream.read(DFSInputStream.java:1029)

2 BlockMissingException 的问题原因和解决方案

BlockMissingException 的问题原因,主要有两个:

  • 第一个原因是,hdfs 文件系统发生了异常,报错信息中所提示的 hdfs 块确实丢失了:此时通过命令 “hdfs fsck /”验证文件系统的完整性时,会报告丢失的块信息;(也可以由系统管理员通过命令 “hadoop dfsadmin -report”检查文件系统状态);
  • 第二个原因是,hdfs 文件系统正常且没有 hdfs 块丢失,但是报错信息中所提示的 hdfs 块(比如BP-XXXX-10.46.10.80-XXXX:blk_xx_xx file=xxxxx),客户端无法通过特定的IP或HOSTNAME创建到对应 datanode 的 TCP 连接进而读取hdfs 块数据:此时通过命令 “hdfs fsck /”或 “hadoop dfsadmin -report” 检查hdfs文件系统健康状况时,都是提示文件系统时健康且完整的;

对应于上述 BlockMissingException 的两个原因,主要的解决方案也有两大类:

  • 对于真实发生了hdfs block 块丢失的情形:可以进一步分析 hdfs block 丢失的原因,常见的有部分 datanode 进程启动异常,或部分 datanode节点的磁盘故障,此时针对性地进行修复并重启即可(如果丢失的数据确实无法修复,在业务确认后,可能不得不通过命令 “hdfs fsck / -delete” 删除损坏的 block对应的上层hdfs文件;)
  • 对于没有发生 hdfs block 块丢失,而仅仅是由于hdfs客户端无法通过特定的IP或HOSTNAME创建到 datanode 的 TCP 连接进而读取 hdfs 块数据的情形:可能需要检查并修复客户端和 datanode之间的端口级别的网络连通性(ping datanode-ip, telnet datanode-ip datanode-port),也可能需要配置客户端参数 dfs.client.use.datanode.hostname=true;

3 参数 dfs.client.use.datanode.hostname 的技术背景

  • 根据 hdfs 读写文件的内部机制: hdfs 客户端读写 hdfs 文件时,客户端首先需要创建到 namenode 的 TCP 连接,然后由 namenode 告知客户端该文件特定 block 对应的 datanode 信息,此后客户端才会去创建到特定 datanode 的 TCP 连接进而读写特定 block数据(其实这里还有个细节:namenode 会告知客户端特定 block 对应的多个 datanode,而客户端只需要创建到其中某一个 datanode 的 TCP 连接就可以读写数据了);
  • 默认情况下,上述读写流程中,namenode 告知客户端该文件特定 block 对应的 “datanode 信息",该 “datanode 信息" 就是 datanode 节点的IP地址,可能是内网IP,也可能是外网IP,如果是内网IP,外部的客户端读写block数据时,就会因无法访问指定的内网IP而报错 BlockMissingException;
  • 当配置参数 dfs.client.use.datanode.hostname=true时,上述读写流程中,namenode 告知客户端该文件特定 block 对应的 “datanode 信息",该 “datanode 信息" 返回的就是 datanode节点的 hostname了,如果客户端正确地配置了/etc/hosts文件或ndns服务,就可以解析该 hostname 为可访问的公网IP,就能够正常创建连接读写 block 数据了;
  • 可以通过如下命令,查询相关参数的配置值:
- hdfs getconf -confKey dfs.client.use.datanode.hostname
- hdfs getconf -confKey dfs.datanode.use.datanode.hostname
  • 所以概括起来,在复杂的网络环境中搭建 hadoop 集群时,比如公有云 aws EC2或阿里云 ecs,为确保不会出现上述 BlockMissingException问题:
    • hadoop 服务端配置namenode/datanode 监听 wildcard 通配符地址:绑定到通配符地址"0.0.0.0" 后,私网IP和公网IP都会被监听;(set the value of dfs.namenode.rpc-bind-host to 0.0.0.0 and Hadoop will listen on both the private and public network interfaces allowing remote access and datanode access; The wildcard is a special local IP address, It usually means “any” and can only be used for bind operations.)
    • (可选)hadoop 服务端配置dfs.datanode.use.datanode.hostname=ture:表示datanode之间的通信也通过域名方式,这样能够使得更换内网IP变得十分简单、方便,而且可以让特定datanode间的数据交换变得更容易,但与此同时也存在一个副作用,当DNS解析失败时会导致整个Hadoop不能正常工作,所以要保证DNS的可靠;
    • 客户端配置 dfs.client.use.datanode.hostname=true;
    • 客户端配置/etc/hosts文件或dns服务,将主机名与DataNode服务器的公网ip进行映射;

      其实关于 Namenode 返回 datanode 信息给客户端时,到底应该用 hostname 还是 IP 来标识 datanode,不同时期 hadoop 有不同考量:
  • 早期 nn 使用 hostName 来标志 dn,但为了减轻 dns 解析带来的性能下降,hadoop 通过 HADOOP-985 提供了通过IP 标识 dn 的功能;
  • 后期在面对云原生和容器化带来的复杂的网络环境时,hadoop 又通过 HDFS-3150 添加了通过 hostname 标识 dn 的功能,并提供了可配置参数 dfs.client.use.datanode.hostname/dfs.datanode.use.datanode.hostname
  • 其它相关jira:Using socket address for datanode registry breaks multihoming:https://issues.apache.org/jira/browse/HADOOP-6867
- Namenode should identify DataNodes as ip:port instead of hostname:port:https://issues.apache.org/jira/browse/HADOOP-985
- Add option for clients to contact DNs via hostname:https://issues.apache.org/jira/browse/HDFS-3150
- dfs.client.use.datanode.hostname: whether clients should use datanode hostnames when connecting to datanodes. default false. (clients outside cluster may not be able to route the IP)
- dfs.datanode.use.datanode.hostname:Whether datanodes should use datanode hostnames when connecting to other datanodes for data transfer.default false.
- Using socket address for datanode registry breaks multihoming:https://issues.apache.org/jira/browse/HADOOP-6867

4 相关源码与参考链接

##参考连接:
- https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/HdfsMultihoming.html
- https://stackoverflow.com/questions/25135183/hadoop-binding-multiple-ip-addresses-to-a-cluster-namenode
- https://rainerpeter.wordpress.com/2014/02/12/connect-to-hdfs-running-in-ec2-using-public-ip-addresses/
##相关源码:
org.apache.hadoop.hdfs.DFSInputStream#getBestNodeDNAddrPair
org.apache.hadoop.hdfs.DFSInputStream#readBlockLength
org.apache.hadoop.hdfs.DFSInputStream#allBlocksLocal
org.apache.hadoop.hdfs.DFSClient#connectToDN
org.apache.hadoop.hdfs.DFSUtilClient#connectToDN
org.apache.hadoop.hdfs.protocol.DatanodeID#getXferAddr(boolean)
org.apache.hadoop.hdfs.DataStreamer#createSocketForPipeline
org.apache.hadoop.hdfs.client.impl.BlockReaderLocalLegacy#getBlockPathInfo
org.apache.hadoop.hdfs.client.impl.DfsClientConf#isConnectToDnViaHostname
org.apache.hadoop.hdfs.protocolPB.ClientDatanodeProtocolTranslatorPB#ClientDatanodeProtocolTranslatorPB(org.apache.hadoop.hdfs.protocol.DatanodeID, Configuration, int, boolean)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1042282.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

国产32位单片机 普冉PY32F002B 适用于LED灯驱,控制器等

PY32F002B 系列单片机采用高性能的 32 位 ARM Cortex-M0内核,宽电压工作范围的 MCU。嵌入了24Kbytes Flash 和 3Kbytes SRAM 存储器,最高工作频率 24MHz。有TSSOP20, QFN20, SOP16, SOP14,MSOP10多种不同封装类型多款产品。 芯片集成了I2C、SPI、USART 等…

C#程序中很多ntdll.dll、clr.dll的线程

VS中调试缓慢,如下图 需要“右键工程——调试——取消勾选‘启用本地代码调试’”即可。

划片机是用于半导体芯片和其它电子元件切割的设备

划片机是用于半导体芯片和其它电子元件切割的设备。在电子行业中,划片机广泛应用于半导体器件、LED芯片、功率器件等多个领域。通过划片机,可以将芯片或其它电子元件从其母片或衬底上切割下来,以便进一步的使用和加工。 半导体芯片是现代电子…

瑞芯微RK3568|SDK开发之环境安装及编译操作

1. SDK简介 一个通用 Linux SDK 工程目录包含有buildroot、app、kernel、device、docs、external 等目录。其中一些特性芯片如RK3308/RV1108/RV1109/RV1126等,会有所不同。 ● app:存放上层应用 app,主要是 qcamera/qfm/qplayer/settings 等…

Docker 安装MYSQL 5.7.38

首先创建临时容器 docker run -d -p 3318:3306 --name mysql -e MYSQL_ROOT_PASSWORD123456 mysql:5.7.38创建mysql文件挂载目录,然后从临时容器中拷贝出配置文件 mkdir -p /data/docker/mysql/log mkdir -p /data/docker/mysql/data mkdir -p /data/docker/mysql…

人力资源行业HR从业现状,这份报告了解下

人力资源(Human Resource ,简称HR)指在一个国家或地区中,处于劳动年龄、未到劳动年龄和超过劳动年龄但具有劳动能力的人口之和。或者表述为:一个国家或地区的总人口中减去丧失劳动能力的人口之后的人口。人力资源也指一定时期内组织中的人所拥…

2023年信创云管平台选哪家?咨询电话多少?

随着云计算和信创国产化的快速发展,越来越多企业需要支持信创系统的云管平台。但很多企业不知道市面上信创云管平台有哪些,也不知道选哪家?这里我们小编就给大家来回答一下。 2023年信创云管平台选哪家?咨询电话多少?…

Python第二次作业(4)【矩形面积与周长】

作业要求:求任意矩形的面积与周长 代码如下: len int(input("请输入矩形的长:")) wid int(input("请输入矩形的宽:")) area len * wid per (len wid) * 2 print("矩形面积:",area) print("矩形周长…

【Linux】socket网络编程

文章目录 1. 网络进程的端口号2. 认识UDP和TCP3. 网络字节序4. socket通信5. UDP服务器和客户端5.1 基础UDP服务器和客户端5.2 群聊服务器和客户端 6. TCP服务器和客户端6.1 TcpServer6.2 TcpClient6.3 TcpServer的优化引入线程池日志系统服务器守护进程化 1. 网络进程的端口号…

Unity Game FrameWork—框架学习—ab打包流程解析

UGF资源更新与管理 https://www.jianshu.com/p/80bff8c9004a 打包配置 ResourceBuilder.xml文件保存了打包配置信息 参数: InternalResourceVersion:内部版本号 Platforms:生成的ab资源所对应平台编号,二进制左移,与…

中睿天下受邀参加2023北京数字交通大会暨博览会并发表主题演讲

2023年9月11号由中国交通报社、中国交通运输协会联合主办的2023北京数字交通大会暨博览会(简称大会暨博览会)在北京中国国际展览中心(新馆)举行。这次大会主题是“数字新时代、交通新未来”,将聚焦数字交通创新发展&am…

国货拟人AI绘图;500+AI岗位合辑;百川x亚马逊AI黑客松;企业级AI行业图谱;100+LLM面试题与答案 | ShowMeAI日报

👀日报&周刊合集 | 🎡生产力工具与行业应用大全 | 🧡 点赞关注评论拜托啦! 🔥 上万人涌入抖音国货直播间,朴实「商战」带火国民品牌 谁能想到,李佳琦「华西子事件」意外带火了一众国货品牌的…

C#源码 LIS实验室(检验科)信息系统源码 SaaS模式的Client/Server架构

LIS实验室(检验科)信息系统,一体化设计,与其他系统无缝连接,全程化条码管理。集申请、采样、核收、计费、检验、审核、发布、质控、查询、耗材控制等检验科工作为一体的网络管理系统。 技术细节: 体系结构…

什么是RPA机器人流程自动化软件?

泽众RPA机器人流程自动化软件,是一种能够模拟人类来执行重复性任务的软件;它通过驱动对于系统业务进行统筹安排、协调处理、自动执行以此提升业务处理效率。借助RPA用户可以提高工作效率、节省成本、降低出錯率、节省时间、并从重复性的后台任务中解放劳…

《学术小白学习之路12》进阶-基于Python实现中文文本的DTM主题动态模型构建

《学术小白学习之路》基于Python实现中文文本的DTM主题动态模型构建 一、数据选择二、数据预处理三、输入数据ID映射词典构建四、文档加载成构造语料库五、DTM模型构建与结果分析六、结果进行保存七、保存模型一、数据选择 所选取的数据集是论文摘要,作为实验数据集,共计12条…

中国人民大学与加拿大女王大学金融硕士为何占据在职读研人的心?一起来看看

说起北京地区的中外合作办学在职硕士项目哪个最受欢迎呢?无疑是中国人民大学与加拿大女王大学金融硕士项目,它已经深深占据在职读研人的心。项目历经十年的风雨,有口皆碑。一起去人大女王金融硕士项目为什么这么受青睐。 一、名校光环 女王金…

基于微信小程序的校园代送跑腿系统(源码+lw+部署文档+讲解等)

文章目录 前言系统主要功能:具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计…

Python和Scrapy构建可扩展的框架

构建一个可扩展的网络爬虫框架是利用Python和Scrapy实现高效数据采集的重要技能。在本文中,我将为您介绍如何使用Python和Scrapy搭建一个强大灵活的网络爬虫框架。我们将按照以下步骤展开: 1. 安装Scrapy: 首先,确保您已经安装了…

QT配置FFmpeg出现错误原因

文章目录 QT配置ffmpeg出现: undefined reference to "avcodec_version"没有配置环境变量QT和FFmpeg的版本不对应直接添加FFmpeg的头文件没有在.pro文件添加路径 QT 程序异常退出没有在debug文件里面存放dll库 QT配置ffmpeg出现: undefined re…

优思学院|怎样制定有效的质量管控措施?要善用六西格玛思维!

要看质量管控措施行不行,关键在于这些措施是不是经过认真分析才定的。分析要严谨,就可以用DMAIC这六个步骤,它是六西格玛方法的核心。DMAIC是六西格玛分析过程中的步骤,就是:定义(Define)、测量…