CC00056.hadoop——|Hadoop&MapReduce.V28|——|Hadoop.v28|源码剖析|NameNode如何支持高并发访问|双缓冲机制|

本文深入剖析了HDFS NameNode如何支持高并发访问,主要介绍了在高并发场景下遇到的数据多线程安全和操作效率问题。HDFS通过分段锁和双缓冲机制解决了这一难题。分段锁允许多线程并行写入内存,而双缓冲则避免了频繁的磁盘同步,显著提高了NameNode的性能。
摘要由CSDN通过智能技术生成
一、源码剖析之NameNode如何支持高并发访问:双缓冲机制:NameNode如何支撑高并发访问(双缓冲机制)
### --- 高并发访问NameNode会遇到什么样的问题:

~~~     经过学习HDFS的元数据管理机制,
~~~     Client每次请求NameNode修改一条元数据(比如说申请上传一个文件,
~~~     都要写一条edits log,包括两个步骤:
~~~     写入本地磁盘--edits文件
~~~     通过网络传输给JournalNodes集群(Hadoop HA集群--结合zookeeper来学习)。
~~~     高并发的难点主要在于数据的多线程安全以及每个操作效率!!
### --- 对于多线程安全:NameNode在写edits log时几个原则:

~~~     写入数据到edits_log必须保证每条edits都有一个全局顺序递增的transactionId(简称为txid),
~~~     这样才可以标识出来一条一条的edits的先后顺序。
~~~     如果要保证每条edits的txid都是递增的,就必须得加同步锁。
~~~     也就是每个线程修改了元数据,要写一条edits 的时候,都必须按顺序排队获取锁后,
~~~     才能生成一个递增的txid,代表这次要写的edits的序号。
### --- 产生的问题:

~~~     如果每次都是在一个加锁的代码块里,生成txid,然后写磁盘文件edits log,
~~~     这种既有同步锁又有写磁盘操作非常耗时!!
二、HDFS优化解决方案
### --- 问题产生的原因主要是在于,写edits时串行化排队生成自增txid + 写磁盘操作费时,
### --- HDFS的解决方案

~~~     串行化:使用分段锁
~~~     写磁盘:使用双缓冲
### --- 分段加锁机制

~~~     首先各个线程依次第一次获取锁,生成顺序递增的txid,然后将edits写入内存双缓冲的区域1,
~~~     接着就立马第一次释放锁了。趁着这个空隙,后面的线程就可以再次立马第一次获取锁,
~~~     然后立即写自己的edits到内存缓冲。
### --- 双缓冲机制

~~~     程序中将会开辟两份一模一样的内存空间,一个为bufCurrent,
~~~     产生的数据会直接写入到这个bufCurrent,而另一个叫bufReady,
~~~     在bufCurrent数据写入(达到一定标准)后,两片内存就会exchange(交换)。
~~~     直接交换双缓冲的区域1和区域2。保证接收客户端写入数据请求的都是操作内存而不是同步写磁盘。
二、双缓冲源码分析 找到FsEditLog.java
....
        void logEdit(final FSEditLogOp op) {
        boolean needsSync = false;//是否同步的标识
synchronized (this) {//
        assert isOpenForWrite() :
        "bad state: " + state;
// wait if an automatic sync is scheduled 如果当前操作被其它线程调度,则等待1s钟
        waitIfAutoSyncScheduled();
// check if it is time to schedule an automatic sync
        needsSync = doEditTransaction(op);
        if (needsSync) {
        isAutoSyncScheduled = true;//标识bufCurrent满了,进行双缓冲刷写
        }
        }
// Sync the log if an automatic sync is required.
        if (needsSync) {
        logSync();//将缓冲区数据刷写到磁盘
        }
        }
        ...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yanqi_vip

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值