热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

大规模集群下HadoopNameNode如何承载每秒上千次的高并发访问

欢迎关注个人公众号:石杉的架构笔记(ID:shishan100)周一至五早8点半!精品技术文章准时送

欢迎关注个人公众号:石杉的架构笔记(ID:shishan100)

周一至五早8点半!精品技术文章准时送上!

往期文章

  • 拜托!面试请不要再问我Spring Cloud底层原理

  • 【双11狂欢的背后】微服务注册中心如何承载大型系统的千万级访问?

  • 【性能优化之道】每秒上万并发下的Spring Cloud参数优化实战

  • 微服务架构如何保障双11狂欢下的99.99%高可用

  • 兄弟,用大白话告诉你小白都能看懂的Hadoop架构原理【石杉的架构笔记】

目录

一、写在前面

二、问题源起

三、HDFS优雅的解决方案:

(1)分段加锁机制+内存双缓冲机制

(2)多线程并发吞吐量的百倍优化

(3)缓冲数据批量刷磁盘+网络优化

一、写在前面

上篇文章我们已经初步给大家解释了Hadoop HDFS的整体架构原理,相信大家都有了一定的认识和了解。

如果没看过上篇文章的同学可以看一下: 《兄弟,用大白话告诉你小白都能听懂的Hadoop架构原理》 这篇文章。

本文我们来看看,如果大量客户端对NameNode发起高并发(比如每秒上千次)访问来修改元数据,此时NameNode该如何抗住?

二、问题源起

我们先来分析一下,高并发请求NameNode会遇到什么样的问题。

大家现在都知道了,每次请求NameNode修改一条元数据(比如说申请上传一个文件,那么就需要在内存目录树中加入一个文件),都要写一条edits log,包括两个步骤:

  • 写入本地磁盘。

  • 通过网络传输给JournalNodes集群。

但是如果对 Java 有一定了解的同学都该知道多线程并发安全问题吧?

NameNode在写edits log时的第一条原则:

必须保证每条edits log都有一个全局顺序递增的 transactionId (简称为txid),这样才可以标识出来一条一条的edits log的先后顺序。

那么如果要保证每条edits log的txid都是递增的,就必须得 加锁。

每个线程修改了元数据,要写一条edits log的时候,都必须按顺序排队获取锁后,才能生成一个递增的txid,代表这次要写的edits log的序号。

好的,那么问题来了, 大家看看下面的图。

如果每次都是在一个加锁的代码块里,生成txid,然后写磁盘文件edits log,网络请求写入journalnodes一条edits log,会咋样?

大规模集群下Hadoop NameNode如何承载每秒上千次的高并发访问

不用说,这个绝对完蛋了!

NameNode本身用多线程接收多个客户端发送过来的并发的请求,结果多个线程居然修改完内存中的元数据之后,排着队写edits log!

而且你要知道,写本地磁盘 + 网络传输给journalnodes,都是很耗时的啊! 性能两大杀手:磁盘写 + 网络写!

如果HDFS的架构真要是这么设计的话,基本上NameNode能承载的每秒的并发数量就很少了,可能就每秒处理几十个并发请求处理撑死了!

三、HDFS优雅的解决方案

所以说,针对这个问题,人家HDFS是做了不少的优化的!

首先大家想一下,既然咱们不希望每个线程写edits log的时候,串行化排队生成txid + 写磁盘 + 写JournalNode,那么是不是可以搞一个内存缓冲?

也就是说,多个线程可以快速的获取锁,生成txid,然后快速的将edits log写入内存缓冲。

接着就快速的释放锁,让下一个线程继续获取锁后,生成id + 写edits log进入内存缓冲。

然后接下来有一个线程可以将内存中的edits log刷入磁盘,但是在这个过程中,还是继续允许其他线程将edits log写入内存缓冲中。

但是这里又有一个问题了,如果针对同一块内存缓冲,同时有人写入,还同时有人读取后写磁盘,那也有问题, 因为不能并发读写一块共享内存数据!

所以HDFS在这里采取了 double-buffer双缓冲机制 来处理!将一块内存缓冲分成两个部分:

  • 其中一个部分可以写入

  • 另外一个部分用于读取后写入磁盘和JournalNodes。

大家可能感觉文字叙述不太直观,老规矩, 咱们来一张图 ,按顺序给大家阐述一下。

大规模集群下Hadoop NameNode如何承载每秒上千次的高并发访问

(1)分段加锁机制 + 内存双缓冲机制

首先各个线程依次第一次获取锁,生成顺序递增的txid,然后将edits log写入内存双缓冲的区域1,接着就立马第一次释放锁了。

趁着这个空隙,后面的线程就可以再次立马第一次获取锁,然后立即写自己的edits log到内存缓冲。

写内存那么快,可能才耗时几十微妙,接着就立马第一次释放锁了。所以这个并发优化绝对是有效果的,大家有没有感受到?

接着各个线程竞争第二次获取锁,有线程获取到锁之后,就看看, 有没有谁在写磁盘和网络?

如果没有,好,那么这个线程是个幸运儿!直接交换双缓冲的区域1和区域2,接着第二次释放锁。这个过程相当快速,内存里判断几个条件,耗时不了几微秒。

好,到这一步为止,内存缓冲已经被交换了,后面的线程可以立马快速的依次获取锁,然后将edits log写入内存缓冲的区域2,区域1中的数据被锁定了,不能写。

怎么样,是不是又感受到了一点点多线程并发的优化?

(2)多线程并发吞吐量的百倍优化

接着,之前那个幸运儿线程,将内存缓冲的区域1中的数据读取出来(此时没人写区域1了,都在写区域2),将里面的edtis log都写入磁盘文件,以及通过网络写入JournalNodes集群。

这个过程可是很耗时的!但是没关系啊,人家做过优化了,在写磁盘和网络的过程中,是不持有锁的!

因此后面的线程可以噼里啪啦的快速的第一次获取锁后,立马写入内存缓冲的区域2,然后释放锁。

这个时候大量的线程都可以快速的写入内存,没有阻塞和卡顿!

怎么样?并发优化的感觉感受到了没有!

(3)缓冲数据批量刷磁盘 + 网络的优化

那么在幸运儿线程吭哧吭哧把数据写磁盘和网络的过程中,排在后面的大量线程,快速的第一次获取锁,写内存缓冲区域2,释放锁,之后,这些线程第二次获取到锁后会干嘛?

他们会发现有人在写磁盘啊 ,兄弟们!所以会立即休眠1秒,释放锁。

此时大量的线程并发过来的话,都会在这里快速的第二次获取锁,然后发现有人在写磁盘和网络,快速的释放锁,休眠。

怎么样,这个过程没有人长时间的阻塞其他人吧!因为都会快速的释放锁,所以后面的线程还是可以迅速的第一次获取锁后写内存缓冲!

again!并发优化的感觉感受到了没有?

而且这时,一定会有很多线程发现,好像之前那个幸运儿线程的txid是排在自己之后的,那么肯定就把自己的edits log从缓冲里写入磁盘和网络了。

这些线程甚至都不会休眠等待,直接就会返回后去干别的事情了,压根儿不会卡在这里。这里又感受到并发的优化没有?

然后那个幸运儿线程写完磁盘和网络之后,就会唤醒之前休眠的那些线程。

那些线程会依次排队再第二次获取锁后进入判断,咦!发现没有人在写磁盘和网络了!

然后就会再判断,有没有排在自己之后的线程已经将自己的edtis log写入磁盘和网络了。

  • 如果有的话,就直接返回了。

  • 没有的话,那么就成为第二个幸运儿线程,交换两块缓冲区,区域1和区域2交换一下。

  • 然后释放锁,自己开始吭哧吭哧的将区域2的数据写入磁盘和网络。

但是这个时候没有关系啊,后面的线程如果要写edits log的,还是可以第一次获取锁后立马写内存缓冲再释放锁。以此类推。

四、总结

其实这套机制还是挺复杂的,涉及到了 分段加锁 以及 内存双缓冲 两个机制。

通过这套机制,NameNode保证了多个线程在高并发的修改元数据之后写edits log的时候,不会说一个线程一个线程的写磁盘和网络,那样性能实在太差,并发能力太弱了!

所以通过上述那套复杂的机制,尽最大的努力保证,一个线程可以批量的将一个缓冲中的多条edits log刷入磁盘和网络。

在这个漫长的吭哧吭哧的过程中,其他的线程可以快速的高并发写入edits log到内存缓冲里,不会阻塞其他的线程写edits log。

所以,正是依靠以上机制,最大限度优化了NameNode处理高并发访问修改元数据的能力!

END

《【性能优化的秘密】Hadoop如何将TB级大文件的上传性能提升上百倍?》敬请期待

如有收获,请帮忙转发,您的鼓励是作者最大的动力,谢谢!

一大波微服务、分布式、高并发、高可用的原创系列

文章正在路上, 欢迎扫描下方二维码 ,持续关注:

大规模集群下Hadoop NameNode如何承载每秒上千次的高并发访问

石杉的架构笔记(id:shishan100)

十余年BAT架构经验倾囊相授


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 我们


推荐阅读
  • 一次上线事故,30岁+的程序员踩坑经验之谈
    本文主要介绍了一位30岁+的程序员在一次上线事故中踩坑的经验之谈。文章提到了在双十一活动期间,作为一个在线医疗项目,他们进行了优惠折扣活动的升级改造。然而,在上线前的最后一天,由于大量数据请求,导致部分接口出现问题。作者通过部署两台opentsdb来解决问题,但读数据的opentsdb仍然经常假死。作者只能查询最近24小时的数据。这次事故给他带来了很多教训和经验。 ... [详细]
  • Java和JavaScript是什么关系?java跟javaScript都是编程语言,只是java跟javaScript没有什么太大关系,一个是脚本语言(前端语言),一个是面向对象 ... [详细]
  • Spring Batch中多线程配置及实现例子
    本文介绍了在Spring Batch中开启多线程的配置方法,包括设置线程数目和使用线程池。通过一个示例演示了如何实现多线程从数据库读取数据并输出。同时提到了在多线程情况下需要考虑Reader的线程安全问题,并提供了解决方法。 ... [详细]
  • ejava,刘聪dejava
    本文目录一览:1、什么是Java?2、java ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 本文介绍了Java高并发程序设计中线程安全的概念与synchronized关键字的使用。通过一个计数器的例子,演示了多线程同时对变量进行累加操作时可能出现的问题。最终值会小于预期的原因是因为两个线程同时对变量进行写入时,其中一个线程的结果会覆盖另一个线程的结果。为了解决这个问题,可以使用synchronized关键字来保证线程安全。 ... [详细]
  • 数字账号安全与数据资产问题的研究及解决方案
    本文研究了数字账号安全与数据资产问题,并提出了解决方案。近期,大量QQ账号被盗事件引起了广泛关注。欺诈者对数字账号的价值认识超过了账号主人,因此他们不断攻击和盗用账号。然而,平台和账号主人对账号安全问题的态度不正确,只有用户自身意识到问题的严重性并采取行动,才能推动平台优先解决这些问题。本文旨在提醒用户关注账号安全,并呼吁平台承担起更多的责任。令牌云团队对此进行了长期深入的研究,并提出了相应的解决方案。 ... [详细]
  • 2018深入java目标计划及学习内容
    本文介绍了作者在2018年的深入java目标计划,包括学习计划和工作中要用到的内容。作者计划学习的内容包括kafka、zookeeper、hbase、hdoop、spark、elasticsearch、solr、spring cloud、mysql、mybatis等。其中,作者对jvm的学习有一定了解,并计划通读《jvm》一书。此外,作者还提到了《HotSpot实战》和《高性能MySQL》等书籍。 ... [详细]
  • 深入理解Java虚拟机的并发编程与性能优化
    本文主要介绍了Java内存模型与线程的相关概念,探讨了并发编程在服务端应用中的重要性。同时,介绍了Java语言和虚拟机提供的工具,帮助开发人员处理并发方面的问题,提高程序的并发能力和性能优化。文章指出,充分利用计算机处理器的能力和协调线程之间的并发操作是提高服务端程序性能的关键。 ... [详细]
  • Sleuth+zipkin链路追踪SpringCloud微服务的解决方案
    在庞大的微服务群中,随着业务扩展,微服务个数增多,系统调用链路复杂化。Sleuth+zipkin是解决SpringCloud微服务定位和追踪的方案。通过TraceId将不同服务调用的日志串联起来,实现请求链路跟踪。通过Feign调用和Request传递TraceId,将整个调用链路的服务日志归组合并,提供定位和追踪的功能。 ... [详细]
  • 2021最新总结网易/腾讯/CVTE/字节面经分享(附答案解析)
    本文分享作者在2021年面试网易、腾讯、CVTE和字节等大型互联网企业的经历和问题,包括稳定性设计、数据库优化、分布式锁的设计等内容。同时提供了大厂最新面试真题笔记,并附带答案解析。 ... [详细]
  • ElasticSerach初探第一篇认识ES+环境搭建+简单MySQL数据同步+SpringBoot整合ES
    一、认识ElasticSearch是一个基于Lucene的开源搜索引擎,通过简单的RESTfulAPI来隐藏Lucene的复杂性。全文搜索,分析系统&# ... [详细]
  • 熟练掌握Spring Cloud,终于成为Java工程师的面试门槛 ... [详细]
  • Harmony 与 Game Space 达成合作,在 Shard1 上扩展 Web3 游戏
    旧金山20 ... [详细]
author-avatar
当个谎言家很不错非
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有