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类别)的更多相关文章

  1. Hadoop源代码分析

    http://wenku.baidu.com/link?url=R-QoZXhc918qoO0BX6eXI9_uPU75whF62vFFUBIR-7c5XAYUVxDRX5Rs6QZR9hrBnUdM ...

  2. Hadoop源代码分析(完整版)

    Hadoop源代码分析(一) 关键字: 分布式云计算 Google的核心竞争技术是它的计算平台.Google的大牛们用了下面5篇文章,介绍了它们的计算设施. GoogleCluster:http:// ...

  3. Hadoop集群-HDFS集群中大数据运维常用的命令总结

    Hadoop集群-HDFS集群中大数据运维常用的命令总结 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本篇博客会简单涉及到滚动编辑,融合镜像文件,目录的空间配额等运维操作简介.话 ...

  4. nodeks —— fs模块 —— 从流中 读取和写入数据

    Fs流读取和写入数据 使用文件流来读取大文件不会卡顿 1, 从流中读取数据 var fs = require("fs"); var data = ''; var count = 0 ...

  5. 转载-python学习笔记之输入输出功能读取和写入数据

    读取.写入和 Python 在 “探索 Python” 系列以前的文章中,学习了基本的 Python 数据类型和一些容器数据类型,例如tuple.string 和 list.其他文章讨论了 Pytho ...

  6. openVswitch(OVS)源代码分析之工作流程(数据包处理)

    上篇分析到数据包的收发,这篇开始着手分析数据包的处理问题.在openVswitch中数据包的处理是其核心技术,该技术分为三部分来实现:第一.根据skb数据包提取相关信息封装成key值:第二.根据提取到 ...

  7. 用OpenPyXL处理Excel表格 - 向sheet读取、写入数据

    假设一个名叫"模板"的excel表格里有四个sheet,名字分别是['平台', '制冷', '洗衣机', '空调'] 1.读取 from openpyxl import load_ ...

  8. Hadoop源代码分析【IO专题】

    由于Hadoop的MapReduce和HDFS都有通信的需求,需要对通信的对象进行序列化.Hadoop并没有采用Java的序列化(因为Java序列化比较复杂,且不能深度控制),而是引入了它自己的系统. ...

  9. HDFS 读取、写入、遍历文件夹获取文件全路径、append

    版权声明:本文为博主原创文章,未经博主同意不得转载.安金龙 的博客. https://blog.csdn.net/smile0198/article/details/37573081 1.从HDFS中 ...

随机推荐

  1. 7、基于嵌入式Linux的视频采集系统---UVC驱动模型介绍

    UVC 即 usb video class.USB协议中,除了通用的软硬件电气接口规范等,还包含了各种各样的Class协议,用来为不同的功能定义各自的标准接口和具体的总线上的数据交互格式和内容.这些C ...

  2. iOS进阶路线以及进阶书籍

    第一,熟悉ARC机制:首先要了解ARC的前世今生.假设了解不清楚会导致两种可能,1,一个对象的引用莫名奇异为空.或失效了.这个一般都能在开发阶段及时发现,由于会导致应用异常.2.导致内存溢出:不了解A ...

  3. php面试题四

    php面试题四 一.总结 二.php面试题四 01. 输出为 Mozilla/4.0(compatible;MSIE5.01;Window NT 5.0)时,可能的输出语句是:   A.$_S ...

  4. js获取浏览器和元素对象的尺寸

    1.屏幕尺寸 window.screen.height //屏幕分辨率的高 window.screen.width //屏幕分辨率的宽 window.screen.availHeight //屏幕可用 ...

  5. object.create(null) 和 {}创建对象的区别

    原文 简书原文:https://www.jianshu.com/p/43ce4d7d6151 创建对象的方法 如果要创建一个空的对象,可以使用如下的三种方法 var obj1 = {}; var ob ...

  6. Linux与Windows间使用git

    Linux与Windows间使用git Linux上架设git服务器,windows可以使用git从Linux上拉取/上传数据 windows使用工具:Git for Windows Linux上的用 ...

  7. ios开发核心动画五:图标抖动效果--CAKeyframeAnimation

    #import "ViewController.h" #define angle2Rad(angle) ((angle) / 180.0 * M_PI) @interface Vi ...

  8. 【p091】多项式输出

    一元 n 次多项式可用如下的表达式表示: 其中,aixi 称为i次项,ai称为i次项的系数.给出一个一元多项式各项的次数和系数,请按照如下规定的格式要求输出该多项式: 多项式中自变量为x,从左到右按照 ...

  9. php实现二叉树遍历

    php实现二叉树遍历 一.总结 关注输入输出 二.php实现二叉树遍历 题目描述 编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储). 例如如下的先序遍历字符串 ...

  10. js进阶正则表达式6转义字符(加\转义)(.符号)(|符号)

    js进阶正则表达式6转义字符(加\转义)(.符号)(|符号) 一.总结 转义字符:{} () / $ # & * . ....... //3.特殊字符,都要加转义\ 点符号:var reg2= ...