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可用容量最大的定位策略。

        最大可用容量优先策略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,什么时候已用容量会大于总容量呢?留待以后再解决吧!

相关文章
|
API 索引
es实战-分片分配失败解决方案
分片无法分配情况的一些解决办法
2166 0
|
4月前
|
Kubernetes 监控 Perl
在k8S中,自动扩容机制是什么?
在k8S中,自动扩容机制是什么?
|
4月前
|
存储 运维 Kubernetes
在k8S中,生产环境的pv回收策略该如何选择?
在k8S中,生产环境的pv回收策略该如何选择?
|
存储 关系型数据库 MySQL
空闲空间管理和文件系统结构的优化策略
对于有科班背景的读者,可以跳过本系列文章。这些文章的主要目的是通过简单易懂的汇总,帮助非科班出身的读者理解底层知识,进一步了解为什么在面试中会涉及这些底层问题。否则,某些概念将始终无法理解。这些计算机基础文章将为你打通知识的任督二脉,祝你在编程领域中取得成功!
空闲空间管理和文件系统结构的优化策略
|
7月前
|
数据采集 Java 调度
深入解析Java线程池的扩容机制与拒绝策略
深入解析Java线程池的扩容机制与拒绝策略
352 0
|
运维 监控 Kubernetes
EKS自动扩容-方式一:ASG负载检测自动扩容功能
EKS自动扩容-方式一:ASG负载检测自动扩容功能
462 0
EKS自动扩容-方式一:ASG负载检测自动扩容功能
|
存储 编译器 程序员
C++内存分区模型分析与实例以及扩展
C++程序在执行时,将内存大方向划分为**5个区域** 运行前: - 代码区:存放**函数体的二进制代码**,由操作系统进行管理的 - 全局区(静态区):存放**全局变量和静态变量以及常量** - 常量区:**常量**存储在这里,不允许修改 运行后: - 栈区:由编译器自动分配释放, 存放**函数的参数值**,**局部变量等** - 堆区:**由程序员分配和释放**,若程序员不释放,程序结束时由操作系统回收
215 0
C++内存分区模型分析与实例以及扩展
|
编解码 算法 前端开发
Cartographer参数调整来降低延迟的策略
Cartographer参数调整来降低延迟的策略
|
安全 Java
Java集合类型的默认容量以及扩容机制
Java集合类型的默认容量以及扩容机制