Hadoop源代码分析:HDFS读取和写入数据流控制(DataTransferThrottler类别)
DataTransferThrottler类别Datanode读取和写入数据时控制传输数据速率。这个类是线程安全的,它可以由多个线程共享。
用途是构建DataTransferThrottler对象,并设置期限period和带宽bandwidthPerSec,际读写前调用DataTransferThrottler.throttle()方法。假设I/O的速率相对给定的带宽太快,则该方法会将当前线程wait。
两个构造函数
- 双參构造函数,能够设置周期period和带宽bandwidthPerSec。
public DataTransferThrottler( long period,
long bandwidthPerSec)
- 单參构造函数,能够设置带宽bandwidthPerSec, 周期period默认被设置为500ms。
public DataTransferThrottler( long bandwidthPerSec)
重要属性
| period | 周期,单位毫秒 |
| periodExtension | 周期扩展时间。单位毫秒 |
| bytesPerPeriod | 一个周期内能够发送/接收的byte总数 |
| curPeriodStart | 当前周期開始时间,单位毫秒 |
| curReserve | 当前周期内还能够发送/接收的byte数 |
| bytesAlreadyUsed | 当前周期内已经使用的byte数 |
带宽bandWidthPerPerSec = bytesPerPeriod * period/1000
DataTransferThrottler.throttle()方法
该方法有两个入參:
- numOfBytes是自从上次throttle被调用到如今,须要发送/接收的byte数;
- canceler是一个外部取消器,能够用来检測是否取消流量控制。
DataTransferThrottler.throttle()方法会先将curReserve减去numOfBytes。接着运行例如以下逻辑。
- 假设curReserve大于0,则说明当前周期还有余量,throttle方法直接返回。
- 假设curReserve小于等于0,则说明当前周期已经没有余量,会运行以下逻辑。
>假设当前时间now小于当前周期结束时间curPeriodEnd,则wait到下一个周期
>假设当前时间now大于当前周期结束时间curPeriodEnd而且小于curPeriodStart+periodExtension。说明已经进入下一个周期而且throttle应该不是非常长时间没有使用,则将curReserve加上下一个周期能够传输的byte总数bytesPerPeriod,并将curPeriodStart设置到下一个周期的開始。
>假设当前时间now大于curPeriodStart+periodExtension。则可能Throttler非常长时间没有使用。则抛弃上一个周期。
DataTransferThrottler.throttle()方法源代码例如以下:
public synchronized void throttle(long numOfBytes , Canceler canceler) {
if ( numOfBytes <= 0 ) {
return;
}
//当前周期余量减去须要发送/接收的byte数numOfBytes
curReserve -= numOfBytes ;
bytesAlreadyUsed += numOfBytes;
//假设curReserve小于等于0,则说明当前周期已经没有余量
while ( curReserve <= 0) {
//假设传入了有效取消器canceler,而且取消器的取消状态isCancelled是true,则直接退出while循环
if (canceler != null && canceler.isCancelled()) {
return;
}
long now = monotonicNow();
//计算当前周期结束时间。并存放在curPeriodEnd变量中
long curPeriodEnd = curPeriodStart + period ;
if ( now < curPeriodEnd ) {
//等待下一个周期,这样curReserve就能够添加
try {
wait( curPeriodEnd - now );
} catch (InterruptedException e) {
//终止throttle, 而且重置interrupted状态来确保在调用栈中其他interrupt处理器能够正确运行
Thread. currentThread().interrupt();
break;
}
}
//假设当前时间now比当前结束时间curPeriodEnd晚,而且小于curPeriodStart+periodExtension(周期3倍时间),则进入下一个周期
//并添加bytesPerPeriod到curReserve
else if ( now < (curPeriodStart + periodExtension)) {
curPeriodStart = curPeriodEnd;
curReserve += bytesPerPeriod ;
}
//假设当前时间now大于curPeriodStart+periodExtension,则可能Throttler非常长时间没有使用。抛弃上一个周期
else {
curPeriodStart = now;
curReserve = bytesPerPeriod - bytesAlreadyUsed;
}
}
bytesAlreadyUsed -= numOfBytes;
}
总结
DataTransferThrottler类能够控制传输数据在一段时期内的平均速率。但可能在一个周期结束时瞬时速率会失控。
參考资料
hadoop-release-2.5.0源代码
转载请附上原博客地址:http://blog.csdn.net/jeff_fangji/article/details/44258827
版权声明:本文博客原创文章,博客,未经同意,不得转载。
Hadoop源代码分析:HDFS读取和写入数据流控制(DataTransferThrottler类别)的更多相关文章
- Hadoop源代码分析
http://wenku.baidu.com/link?url=R-QoZXhc918qoO0BX6eXI9_uPU75whF62vFFUBIR-7c5XAYUVxDRX5Rs6QZR9hrBnUdM ...
- Hadoop源代码分析(完整版)
Hadoop源代码分析(一) 关键字: 分布式云计算 Google的核心竞争技术是它的计算平台.Google的大牛们用了下面5篇文章,介绍了它们的计算设施. GoogleCluster:http:// ...
- Hadoop集群-HDFS集群中大数据运维常用的命令总结
Hadoop集群-HDFS集群中大数据运维常用的命令总结 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本篇博客会简单涉及到滚动编辑,融合镜像文件,目录的空间配额等运维操作简介.话 ...
- nodeks —— fs模块 —— 从流中 读取和写入数据
Fs流读取和写入数据 使用文件流来读取大文件不会卡顿 1, 从流中读取数据 var fs = require("fs"); var data = ''; var count = 0 ...
- 转载-python学习笔记之输入输出功能读取和写入数据
读取.写入和 Python 在 “探索 Python” 系列以前的文章中,学习了基本的 Python 数据类型和一些容器数据类型,例如tuple.string 和 list.其他文章讨论了 Pytho ...
- openVswitch(OVS)源代码分析之工作流程(数据包处理)
上篇分析到数据包的收发,这篇开始着手分析数据包的处理问题.在openVswitch中数据包的处理是其核心技术,该技术分为三部分来实现:第一.根据skb数据包提取相关信息封装成key值:第二.根据提取到 ...
- 用OpenPyXL处理Excel表格 - 向sheet读取、写入数据
假设一个名叫"模板"的excel表格里有四个sheet,名字分别是['平台', '制冷', '洗衣机', '空调'] 1.读取 from openpyxl import load_ ...
- Hadoop源代码分析【IO专题】
由于Hadoop的MapReduce和HDFS都有通信的需求,需要对通信的对象进行序列化.Hadoop并没有采用Java的序列化(因为Java序列化比较复杂,且不能深度控制),而是引入了它自己的系统. ...
- HDFS 读取、写入、遍历文件夹获取文件全路径、append
版权声明:本文为博主原创文章,未经博主同意不得转载.安金龙 的博客. https://blog.csdn.net/smile0198/article/details/37573081 1.从HDFS中 ...
随机推荐
- [NIO]用dawn发送接收HTTP请求
HTTP协议的下层使用的是tcp.所以我们建立一个tcp连接就能发送接收http请求.dawn底层使用了nio.可是经过dawn的封装之后,我们在编写代码的时候,就和使用普通的堵塞式socket一样 ...
- [Angular2 Animation] Use Keyframes for Fine-Tuned Angular 2 Animations
When easing isn’t enough to get the exact animation you want, you can leverage keyframes to define a ...
- [AngularFire2] Auth with Firebase auth -- email
First, you need to enable the email auth in Firebase console. Then implement the auth service: login ...
- Node.js日志框架选型比較:Bunyan
前一篇Node.js日志框架选型比較:Winston Bunyan Bunyan(by Trent Mick)是另外一个值得考虑的日志框架,以稍微不同的方式处理结构化,机器可读性被重点对待. 其结果是 ...
- windows phone 2048 源代码奉上
小梦今天把2048的游戏源代码给大家分享一下,其实感觉这个重在算法,UI很简单,而且几乎没有用到什么windows phone的API.小梦遇到最主要的问题就是对触摸事件的处理,我刚开始想到的就是 M ...
- 【u009】瑞瑞的木板
Time Limit: 1 second Memory Limit: 128 MB [问题描述] 瑞瑞想要亲自修复在他的一个小牧场周围的围栏.他测量栅栏并发现他需要N(1≤N≤20,000)根木板,每 ...
- 七个帮助你处理Web页面层布局的jQuery插件
1.UI.Layout jQuery UI布局插件 官方网站:http://layout.jquery-dev.com/index.cfm 使用大小可折叠的嵌套面板和大量选项创建高级UI布局.布局可 ...
- 你的薪水增速跑赢GDP了没
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZm9ydW9r/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/d ...
- [Postgres] Group and Aggregate Data in Postgres
How can we see a histogram of movies on IMDB with a particular rating? Or how much movies grossed at ...
- Net程序调试
Net程序调试 前言 作为一个.net开发工程师,不管是在写桌面程序.服务程序或web程序,在开发阶段,我们必须非常熟悉vs的动态调试技能,当然web程序可能还需要调试前端的脚本或样式,这不在本文的讨 ...