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

相关文章
|
Linux
HDFS文件上传异常分析:put: `test.txt': No such file or directory
HDFS文件上传异常分析:put: `test.txt': No such file or directory
9541 0
HDFS文件上传异常分析:put: `test.txt': No such file or directory
|
12月前
|
存储 缓存 负载均衡
从零到一:分布式缓存技术初探
分布式缓存通过将数据存储在多个节点上,利用负载均衡算法提高访问速度、降低数据库负载并增强系统可用性。常见产品有Redis、Memcached等。其优势包括性能扩展、高可用性、负载均衡和容错性,适用于页面缓存、应用对象缓存、状态缓存、并行处理、事件处理及极限事务处理等多种场景。
676 1
|
存储 缓存 NoSQL
分布式缓存最全详解(图文全面总结)
关注【mikechen的互联网架构】,10年+ BAT架构经验倾囊相授。本文详细介绍分布式缓存的核心概念、特点及常见问题,如缓存雪崩、缓存穿透和缓存击穿,并探讨其应用场景和解决方案。欢迎交流。
|
存储 缓存 NoSQL
深入理解分布式缓存在现代后端系统中的应用与挑战
随着互联网技术的飞速发展,分布式缓存已成为提升后端系统性能的关键技术之一。本文将从数据导向和科学严谨的角度出发,探讨分布式缓存技术的原理、应用场景以及面临的主要挑战。通过对具体案例的分析和数据统计,我们旨在为读者提供一个全面而深入的理解框架,帮助开发者更好地设计和优化后端系统。 【7月更文挑战第20天】
280 0
|
Java Linux 网络安全
在Linux上搭建Maven仓库的实战教程
在Linux上搭建Maven仓库的实战教程
787 0
|
分布式计算 资源调度 Hadoop
Hadoop【环境搭建 02】【hadoop-3.1.3 单机版YARN】(配置、启动及验证)
Hadoop【环境搭建 02】【hadoop-3.1.3 单机版YARN】(配置、启动及验证)
251 0
|
Oracle Java 关系型数据库
jdk17安装全方位手把手安装教程 / 已有jdk8了,安装JDK17后如何配置环境变量 / 多个不同版本的JDK,如何配置环境变量?
本文提供了详细的JDK 17安装教程,包括下载、安装、配置环境变量的步骤,并解释了在已有其他版本JDK的情况下如何管理多个JDK环境。
21666 0
|
存储 缓存 NoSQL
深入理解分布式缓存——使用Spring Boot+Redis实现分布式缓存解决方案
在微服务飞速发展的今天,在高并发的分布式的系统中,缓存是提升系统性能的重要手段。没有缓存对后端请求的拦截,大量的请求将直接落到系统的底层数据库。系统是很难撑住高并发的冲击,下面就以Redis为例来聊聊分布式系统中关于缓存的设计以及过程中遇到的一些问题。
10967 58
深入理解分布式缓存——使用Spring Boot+Redis实现分布式缓存解决方案
同一局域网内通过发送广播,同网段IP都能收到信息
广播概述:由一台主机向该主机所在子网内的所有主机发送数据的方式
|
存储 缓存 分布式计算
使用Alluxio高效存储Spark RDD
在这篇文章中,我们将介绍如何使用Alluxio帮助Spark变得更高效,介绍多种将Alluxio应用在Spark上的方法。
4251 0