目录
现象总结
攻坚
总结
解决
首页 数据库 mysql教程 解决HDFS磁盘扫描导致死亡结点的问题

解决HDFS磁盘扫描导致死亡结点的问题

Jun 07, 2016 pm 04:32 PM
hdfs 导致 扫描 磁盘 结点 解决 问题

在Hadoop集群从1.0升级到2.0之后,我们一直在解决很多很多的问题。在今年8月初,我们检测到线上频繁有机器变成死亡结点,一段时间后自动恢复。进入死亡结点状态的DataNode将不能读写数据块。我们观察了一下日志,看到DataNode中打印出很多接受数据快传输的线

在Hadoop集群从1.0升级到2.0之后,我们一直在解决很多很多的问题。在今年8月初,我们检测到线上频繁有机器变成死亡结点,一段时间后自动恢复。进入死亡结点状态的DataNode将不能读写数据块。我们观察了一下日志,看到DataNode中打印出很多接受数据快传输的线程(DataXceiver),线程都是在Receiving的状态,而没有结束。估摸了一下在死亡结点发生的阶段大约有300个左右的线程积累下来。但是,没找到其它突破口。

由于,HDFS的Client会自动重试。如果一个结点进入死亡结点,只要另外的数据块的结点依然可读,Client还是可以读取到数据块的。所以,死亡结点的问题对线上业务没有造成影响。当时,还有其它优先级更高的事情,所以,问题转为观察状态。

然后终于在一次机房意外断电,集群重启之后,一个线上的作业报找不到数据块。经日志确认,产生的原因是拥有这个数据块副本的两个机器同时进入死亡结点! 于是,问题转入高优先级,优先解决。

现象总结

  • 出现死亡结点的机器集中在磁盘数量较多的机器。
  • 死亡结点跟机器的CPU,内存或者网络关系不大。
  • 出现死亡结点的时候,DataNode有大量DataXceiver的线程积压。
  • 虽然,总体上机器出现死亡结点的时间比较分散。但是,单一的DataNode上出现死亡结点的间隔必然是6小时或者6小时的整数倍。

攻坚

首先知道,DataNode进入死亡结点状态是因为NameNode长期接收不到DataNode的心跳包,就会把DataNode归入死亡结点。而DataNode的心跳线程是单独一个线程。

现象的最后一点,6小时的间隔,可谓是这个问题的突破点。在配置文件中找到6小时的间隔的工作有两种:

  1. DataNode和NameNode的6小时一次的心跳报告。用于更新NameNode上的Block信息。
  2. DataNode每6小时一次的磁盘扫描。用于更新内存中的信息和磁盘中信息的不一致。

根据两者打印的日志和死亡结点发生的时间进行精确对比,发现后者的时间基本吻合。 然后,我们在集中查看磁盘扫描(DirectoryScanner)的代码。

描述一下磁盘扫描的工作流程:

  1. 启动一个主线程和一个线程池。
  2. 主线程往线程池提交多个磁盘扫描的任务。任务是遍历整个数据目录记录所有的数据块的信息和对应的Meta信息
  3. 主线程等待线程池的任务返回,收集扫描结果。
  4. 将扫描结果和内存中的数据块进行对比,得到DiffRecord,算法复杂度O(n),数据块越多速度越慢。
  5. 根据DiffRecord修改对应的内存数据。

第一步,主线程和线程池的线程都是Daemon线程。Daemon线程的默认优先级比较低。

第二步,由于涉及到磁盘读写。如果,外部磁盘压力大的时候,会拖慢整个进度。但是,整个过程没有加锁。不可能对其它线程产生影响。

第四步,数据块对比过程,为了阻止对blockMap的修改,整个过程针对DataSet对象加锁(DataSet对象是DataNode中保存所有数据块信息的内存对象)。

那心跳进程为什么会使用DataSet的对象锁? 我们写了个小程序测试,在对DataSet加锁的情况下,启动心跳线程。发现心跳线程在获取磁盘的可用空间的时候,需要获得DataSet的锁。

于是,问题变得清晰了:在6小时一次的磁盘扫描中,由于DirectoryScanner长久占用了DataSet的锁,导致心跳线程不能发出心跳包。DataNode进入死亡结点状态。而问题频发在磁盘较多的机器是因为,数据块数量和对比的过程的耗时相关。那是什么原因导致DirectoryScanner长久占用了DataSet的锁呢?

我们观察了加锁部分的代码,没有找到磁盘操作。我们估摸了下,最多数据块的机器也才80W左右各数据块。如果是纯内存操作,不可能占用锁长达10分钟甚至30分钟之久。

然后我们将怀疑的地方锁定在主线程的Daemon属性。因为,Daemon属性的线程优先级较低,怀疑是主线程在多线程的情况下,分配不到CPU时间片。

于是,我们作出第一个修改:将主线程改为普通线程的优先级

上线第二天,死亡结点现象还是出现,现象出现的时间相对来说是短了点,但还是不能解决问题。

于是,我们开了个大招:针对死亡结点频发的结点,加上一个每分钟打印一次DataNode的jstack的脚本。

终于我们捕获了在死亡结点发生时候的几个堆栈。经过对比分析,得出的结论是:

(呵呵)数据块对比过程中,有一个使用Java的File对象的获取文件长度的getlength方法。而这个方法是直接调用一个native方法,获取磁盘上文件的长度。

当初我们就猜想,加锁部分是否有磁盘的IO操作。因为IO操作的快慢,会受到当时的机器状态影响很大。不得不说,这个位置太隐蔽了。看了很久都没发现,还好有jstack截获出来。

总结

6小时一次的DirectoryScanner在数据块对比过程中,会对DataSet加锁。如果,机器的磁盘压力很高的情况下,对比过程中的磁盘操作十分耗时。导致DirectoryScanner长期持有DataSet的锁,阻塞心跳线程和所有的DataXceiver的线程。DataNode变成死亡结点。一段时间后,对比过程结束。DataSet锁释放,DataNode回归正常工作。

解决

知道问题了就好解决了。我们采取的方式是把getlength操作提取到第二步的线程池的异步磁盘扫描中进行

部署到线上后,数据对比时间降低到2秒左右。至此,死亡结点问题解决!

后续我们把Patch提交到Hadoop社区HDFS-5341,其中蹩脚的英语语法请大家无视。

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
威尔R.E.P.O.有交叉游戏吗?
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

Win11系统无法安装中文语言包的解决方法 Win11系统无法安装中文语言包的解决方法 Mar 09, 2024 am 09:48 AM

Win11系统无法安装中文语言包的解决方法随着Windows11系统的推出,许多用户开始升级他们的操作系统以体验新的功能和界面。然而,一些用户在升级后发现他们无法安装中文语言包,这给他们的使用体验带来了困扰。在本文中,我们将探讨Win11系统无法安装中文语言包的原因,并提供一些解决方法,帮助用户解决这一问题。原因分析首先,让我们来分析一下Win11系统无法

五招教你解决黑鲨手机开不了机的问题! 五招教你解决黑鲨手机开不了机的问题! Mar 24, 2024 pm 12:27 PM

随着智能手机技术的不断发展,手机在我们日常生活中扮演着越来越重要的角色。而作为一款专注于游戏性能的旗舰手机,黑鲨手机备受玩家青睐。然而,有时候我们也会面临到黑鲨手机开不了机的情况,这时候我们就需要采取一些措施来解决这一问题。接下来,就让我们来分享五招教你解决黑鲨手机开不了机的问题:第一招:检查电池电量首先,确保你的黑鲨手机有足够的电量。可能是因为手机电量耗尽

无法在此设备上加载驱动程序怎么解决?(亲测有效) 无法在此设备上加载驱动程序怎么解决?(亲测有效) Mar 14, 2024 pm 09:00 PM

  大家都知道,如果电脑无法加载驱动程序,该设备可能就无法正常工作或与计算机进行正确的交互。那在电脑上弹出无法在此设备上加载驱动程序的提示框,我们要如何解决呢?下面小编就教大家两招轻松解决问题。  无法在此设备上加载驱动程序解决方法  1、开始菜单搜索“内核隔离”。  2、将内存完整性关闭,上方提示“内存完整性已关闭。你的设备可能易受攻击。”点击后方忽略即可,不会对使用有影响。  3.重启机器之后即可解决问题。

小红书发布自动保存图片怎么解决?发布自动保存图片在哪里? 小红书发布自动保存图片怎么解决?发布自动保存图片在哪里? Mar 22, 2024 am 08:06 AM

随着社交媒体的不断发展,小红书已经成为越来越多年轻人分享生活、发现美好事物的平台。许多用户在发布图片时遇到了自动保存的问题,这让他们感到十分困扰。那么,如何解决这个问题呢?一、小红书发布自动保存图片怎么解决?1.清除缓存首先,我们可以尝试清除小红书的缓存数据。步骤如下:(1)打开小红书,点击右下角的“我的”按钮;(2)在个人中心页面,找到“设置”并点击;(3)向下滚动,找到“清除缓存”选项,点击确认。清除缓存后,重新进入小红书,尝试发布图片看是否解决了自动保存的问题。2.更新小红书版本确保你的小

将VirtualBox固定磁盘转换为动态磁盘,反之亦然 将VirtualBox固定磁盘转换为动态磁盘,反之亦然 Mar 25, 2024 am 09:36 AM

在创建虚拟机时,系统会要求您选择磁盘类型,您可以选择固定磁盘或动态磁盘。如果您选择了固定磁盘,后来意识到需要动态磁盘,或者相反,该怎么办?好!你可以把一种转换成另一种。在这篇文章中,我们将看到如何将VirtualBox固定磁盘转换为动态磁盘,反之亦然。动态磁盘是一种虚拟硬盘,它最初具有较小的大小,随着您在虚拟机中存储数据,其大小会相应增长。动态磁盘在节省存储空间方面非常高效,因为它们只占用所需的主机存储空间。然而,随着磁盘容量的扩展,可能会稍微影响计算机的性能。固定磁盘和动态磁盘是虚拟机中常用的

华为浏览器已停止访问该网页怎么解决 华为浏览器已停止访问该网页怎么解决 Feb 26, 2024 pm 01:28 PM

华为浏览器已停止访问该网页怎么解决?在使用华为手机浏览器访问某些网站时,可能会出现禁止访问的提示,使用户无法正常浏览相关内容。这对用户而言非常不便。那么,当我们遇到华为手机浏览器网站禁止访问的情况时,该怎么办呢?下面小编将为您提供华为浏览器网站禁止访问解决方法,希望对您有所帮助。华为浏览器网站禁止访问解决方法1、打开华为手机浏览器后,点击下方的三点图标,然后点击设置。2、进入设置后,点击【安全与隐私】3、将【安全浏览】右侧的开关关闭,即可解除网站访问限制。以上便是华为浏览器网站禁止访问解决方法的

解读Oracle错误3114:原因及解决方法 解读Oracle错误3114:原因及解决方法 Mar 08, 2024 pm 03:42 PM

标题:分析Oracle错误3114:原因及解决方法在使用Oracle数据库时,常常会遇到各种错误代码,其中错误3114是比较常见的一个。该错误一般涉及到数据库链接的问题,可能导致访问数据库时出现异常情况。本文将对Oracle错误3114进行解读,探讨其引起的原因,并给出解决该错误的具体方法以及相关的代码示例。1.错误3114的定义Oracle错误3114通

WordPress安装问题解决指南,一文搞定 WordPress安装问题解决指南,一文搞定 Feb 29, 2024 am 11:06 AM

WordPress是一款非常流行的开源内容管理系统,许多个人用户和企业选择使用WordPress来建立和管理自己的网站。然而,在安装WordPress的过程中,有时会遇到一些问题,例如数据库连接错误、文件权限问题等。本文将针对常见的WordPress安装问题进行解决指南,通过具体的代码示例帮助用户快速解决问题。问题一:数据库连接错误当在安装WordPress

See all articles