Alluxio源码分析定位策略:最大可用容量优先策略MostAvailableFirstPolicy

        最大可用容量优先策略MostAvailableFirstPolicy是一种worker可用容量最大的定位策略。如果没有worker合格的话该策略返回null。它的核心方法getWorkerForNextBlock()实现如下:

/**
 * A policy that returns the worker with the most available bytes. The policy returns null if no
 * worker is qualified.
 * 一种worker可用容量最大的定位策略。如果没有worker合格的话该策略返回null。
 */
@ThreadSafe
public final class MostAvailableFirstPolicy implements FileWriteLocationPolicy {

  @Override
  public WorkerNetAddress getWorkerForNextBlock(List<BlockWorkerInfo> workerInfoList,
      long blockSizeBytes) {

	// 将输入参数BlockWorkerInfo列表workerInfoList转换成ArrayList形式的列表inputList
    List<BlockWorkerInfo> inputList = Lists.newArrayList(workerInfoList);

    // 标志变量:最大可用容量
    long mostAvailableBytes = -1;

    // 被选中的worker地址
    WorkerNetAddress result = null;

    // 遍历BlockWorkerInfo列表inputList,取出每个BlockWorkerInfo,即workerInfo:
    for (BlockWorkerInfo workerInfo : inputList) {

      // 如果该workerInfo的可用容量(总容量减去已用容量)大于最大可用容量mostAvailableBytes,则
      // 设置标志变量最大可用容量mostAvailableBytes为当前worker的可用容量,设置被选中的worker地址result为当前worker的网络地址
      if (workerInfo.getCapacityBytes() - workerInfo.getUsedBytes() > mostAvailableBytes) {
        mostAvailableBytes = workerInfo.getCapacityBytes() - workerInfo.getUsedBytes();
        result = workerInfo.getNetAddress();
      }
    }

    // 返回被选中的worker地址
    return result;
  }
}

        大体流程如下:

        1、将输入参数BlockWorkerInfo列表workerInfoList转换成ArrayList形式的列表inputList;

        2、初始化标志变量:最大可用容量mostAvailableBytes为-1;

        3、初始化被选中的worker地址result为null;

        4、遍历BlockWorkerInfo列表inputList,取出每个BlockWorkerInfo,即workerInfo:

              4.1、如果该workerInfo的可用容量(总容量减去已用容量)大于最大可用容量mostAvailableBytes,则:

                       4.1.1、设置标志变量最大可用容量mostAvailableBytes为当前worker的可用容量;

                       4.1.2、设置被选中的worker地址result为当前worker的网络地址;

        5、返回被选中的worker地址(有可能为null)。

        这里,有个问题:什么时候所有worker已用容量会大于总容量,也就是workerInfo.getCapacityBytes() - workerInfo.getUsedBytes()的值会小于等于-1,而导致最终结果返回null呢?即便是某一个worker,什么时候已用容量会大于总容量呢?留待以后再解决吧!

时间: 2024-09-21 23:23:54

Alluxio源码分析定位策略:最大可用容量优先策略MostAvailableFirstPolicy的相关文章

Alluxio源码分析定位策略:指定主机策略SpecificHostPolicy

        指定主机策略SpecificHostPolicy是一种总是返回一个指定主机名的worker的定位策略.如果在那个主机名对应机器上没有活跃worker的话则返回null.在SpecificHostPolicy内部,封装了一个成员变量,如下: // 主机名 private final String mHostname;         这个mHostname就是SpecificHostPolicy策略实现所依赖的主机名,在SpecificHostPolicy构造方法中,就会根据外部传

Alluxio源码分析定位策略:循环遍历策略RoundRobinPolicy

        循环遍历策略RoundRobinPolicy是一种通过循环遍历方式并且跳过没有足够空间workers的为下一个数据块选择worker的策略.如果没有worker被找到,该策略会返回null.在RoundRobinPolicy内部,有三个十分重要的成员变量,如下: // 初始化的BlockWorkerInfo列表,每次都从这个列表中选择BlockWorkerInfo private List<BlockWorkerInfo> mWorkerInfoList; // mWorker

Alluxio源码分析:RPC框架浅析(一)

        Alluxio源码分析是一个基于内存的分布式文件系统,和HDFS.HBase等一样,也是由主从节点构成的.而节点之间的通信,一般都是采用的RPC通讯模型.Alluxio中RPC是基于何种技术如何实现的呢?它对于RPC请求是如何处理的?都涉及到哪些组件?本文将针对这些问题,为您一一解答.         一.Alluxio中RPC实现技术支持         Alluxio中的RPC是依靠Thrift实现的,Apache Thrift 是 Facebook 实现的一种高效的.支持多

Alluxio源码分析:RPC框架浅析(三)

        Alluxio源码分析是一个基于内存的分布式文件系统,和HDFS.HBase等一样,也是由主从节点构成的.而节点之间的通信,一般都是采用的RPC通讯模型.Alluxio中RPC是基于何种技术如何实现的呢?它对于RPC请求是如何处理的?都涉及到哪些组件?本文将针对这些问题,为您一一解答.         继<Alluxio源码分析:RPC框架浅析(二)>一文后,本文继续讲解Alluxio中RPC实现.         4.Client端实现        以FileSystemM

Alluxio源码分析:RPC框架浅析(二)

        Alluxio源码分析是一个基于内存的分布式文件系统,和HDFS.HBase等一样,也是由主从节点构成的.而节点之间的通信,一般都是采用的RPC通讯模型.Alluxio中RPC是基于何种技术如何实现的呢?它对于RPC请求是如何处理的?都涉及到哪些组件?本文将针对这些问题,为您一一解答.         继<Alluxio源码分析:RPC框架浅析(一)>一文后,本文继续讲解Alluxio中RPC实现.         3.Server端实现:RPC Server端口绑定.传输协议

Alluxio源码分析读数据:打开文件选项OpenFileOptions

        OpenFileOptions是为读数据打开一个文件方法的选项,提供了打开文件的多种选择.在OpenFileOptions内部,封装了两个重要的成员变量,如下: // 定位策略 private FileWriteLocationPolicy mLocationPolicy; // 读取类型 private ReadType mReadType;         其中mLocationPolicy为FileWriteLocationPolicy类型的定位策略,而mReadType为

OkHttp 3.7源码分析(四)——缓存策略

OkHttp3.7源码分析文章列表如下: OkHttp源码分析--整体架构 OkHttp源码分析--拦截器 OkHttp源码分析--任务队列 OkHttp源码分析--缓存策略 OkHttp源码分析--多路复用 合理地利用本地缓存可以有效地减少网络开销,减少响应延迟.HTTP报头也定义了很多与缓存有关的域来控制缓存.今天就来讲讲OkHttp中关于缓存部分的实现细节. 1. HTTP缓存策略 首先来了解下HTTP协议中缓存部分的相关域. 1.1 Expires 超时时间,一般用在服务器的respon

jQuery1.9.1源码分析系列(十六)ajax之ajax框架_jquery

AJAX 简介 AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术. 您应当具备的基础知识 在继续学习之前,您需要对下面的知识有基本的了解: HTML / XHTML CSS JavaScript / DOM 如果您希望首先学习这些项目,请在我们的首页访问这些教程. 什么是 AJAX ? AJAX = 异步 JavaScript 和 XML. AJAX 是一种用于创建快速动态网页的技术. 通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这意味着可以在不重

深入理解Spark:核心思想与源码分析

大数据技术丛书 深入理解Spark:核心思想与源码分析 耿嘉安 著 图书在版编目(CIP)数据 深入理解Spark:核心思想与源码分析/耿嘉安著. -北京:机械工业出版社,2015.12 (大数据技术丛书) ISBN 978-7-111-52234-8 I. 深- II.耿- III.数据处理软件 IV. TP274 中国版本图书馆CIP数据核字(2015)第280808号 深入理解Spark:核心思想与源码分析 出版发行:机械工业出版社(北京市西城区百万庄大街22号 邮政编码:100037)