Alluxio源码分析定位策略:本地优先策略LocalFirstPolicy

简介:         LocalFirstPolicy是一个优先返回本地主机的定位策略,如果本地worker没有足够的容量,那么就会从活跃有效的workers列表随机选择一个worker用于每个块写入。

        LocalFirstPolicy是一个优先返回本地主机的定位策略,如果本地worker没有足够的容量,那么就会从活跃有效的workers列表随机选择一个worker用于每个块写入。在其内部,有一个关键的成员变量mLocalHostName,即本地主机名,它是用于选择本地本机worker的关键变量。其定义如下:

  // 本地主机名,用于选择本地本机worker的关键变量
  private String mLocalHostName = null;
        而在LocalFirstPolicy的唯一无参构造函数内,它所做的唯一一件事就是初始化这个本地主机名mLocalHostName,如下:

  /**
   * 构造函数
   * Constructs a {@link LocalFirstPolicy}.
   */
  public LocalFirstPolicy() {
	// 通过NetworkAddressUtils的getLocalHostName()方法,从客户端上下文的配置信息中获取本地主机名mLocalHostName
    mLocalHostName = NetworkAddressUtils.getLocalHostName(ClientContext.getConf());
  }
        既然是一个定位策略,那么它是如何对外提供选择服务的呢?答案就在核心方法getWorkerForNextBlock()中,它为下一个数据块选择一个Worker,返回Worker的网络地址WorkerNetAddress。代码如下;

  // 核心方法,为下一个数据块选择一个Worker,返回Worker的网络地址WorkerNetAddress
  @Override
  public WorkerNetAddress getWorkerForNextBlock(List<BlockWorkerInfo> workerInfoList,
      long blockSizeBytes) {
    // first try the local host
	// 首先尝试从本地主机中选择
	
	// 遍历BlockWorkerInfo列表workerInfoList,获取每个BlockWorkerInfo,即workerInfo
    for (BlockWorkerInfo workerInfo : workerInfoList) {
    	
      // 判断workerInfo所在主机名是否与mLocalHostName,且workerInfo的总字节数是否满足块需要的大小blockSizeBytes
      if (workerInfo.getNetAddress().getHost().equals(mLocalHostName)
          && workerInfo.getCapacityBytes() >= blockSizeBytes) {
        
    	// 满足条件则返回  
    	return workerInfo.getNetAddress();
      }
    }

    // otherwise randomly pick a worker that has enough availability
    // 否则随机挑选一个容量足够满足要求的worker
    
    // 先对workerInfoList进行shuffle,避免热点问题
    Collections.shuffle(workerInfoList);
    
    // 遍历BlockWorkerInfo列表workerInfoList,获取每个BlockWorkerInfo,即workerInfo
    for (BlockWorkerInfo workerInfo : workerInfoList) {
    	
      // 只要workerInfo的总字节数是否满足块需要的大小blockSizeBytes,就是我们需要的worker啦
      if (workerInfo.getCapacityBytes() >= blockSizeBytes) {
        return workerInfo.getNetAddress();
      }
    }
    return null;
  }
        它的逻辑很简单,总共分为两大步骤,如下:

        1、首先尝试从本地主机中选择:

              1.1、遍历BlockWorkerInfo列表workerInfoList,获取每个BlockWorkerInfo,即workerInfo:

                        1.1.1、判断workerInfo所在主机名是否与mLocalHostName,且workerInfo的总字节数是否满足块需要的大小blockSizeBytes,满足条件则返回,否则继续遍历;

        2、如果1未选择到满足条件的worker,则随机挑选一个容量足够满足要求的worker:

              2.1、先对workerInfoList进行shuffle,避免热点问题;

              2.2、遍历BlockWorkerInfo列表workerInfoList,获取每个BlockWorkerInfo,即workerInfo:

                        2.2.1、只要workerInfo的总字节数是否满足块需要的大小blockSizeBytes,就是我们需要的worker啦,否则继续遍历吧;

        3、再选不到就直接返回null喽!



相关文章
|
9月前
|
安全 Java 5G
从源码角度剖析 Elasticserach 段合并调优策略
从源码角度剖析 Elasticserach 段合并调优策略
88 0
|
6月前
|
Java
典型热点应用问题之启用增量编译的问题如何解决
典型热点应用问题之启用增量编译的问题如何解决
|
9月前
|
存储 缓存 中间件
中间件Cache-Aside策略特别适合“读多”的应用场景
【5月更文挑战第8天】中间件Cache-Aside策略特别适合“读多”的应用场景
71 2
|
9月前
|
监控 固态存储 安全
源码剖析:Elasticsearch 段合并调度及优化手段
源码剖析:Elasticsearch 段合并调度及优化手段
142 0
|
9月前
|
数据采集 Java 调度
深入解析Java线程池的扩容机制与拒绝策略
深入解析Java线程池的扩容机制与拒绝策略
445 0
|
存储 缓存 监控
10 分钟搞懂缓存设计策略
10 分钟搞懂缓存设计策略
918 0
|
缓存
GoFrame gcache使用实践 | 缓存控制 淘汰策略
gcache模块默认提供的是一个高速的内存缓存,操作效率非常高效,CPU性能损耗在ns纳秒级别。使用简单易上手,非常适合单机应用使用。
298 0
GoFrame gcache使用实践 | 缓存控制 淘汰策略
|
分布式计算 算法 调度
spark2.2以后版本任务调度将增加黑名单机制
spark2.2以后版本任务调度将增加黑名单机制
383 0
|
Java 应用服务中间件 开发者
JVM核心优化策略 | 学习笔记
快速学习JVM核心优化策略
103 0
Juc05_线程池概述、创建方式、七大参数、底层工作原理、拒绝策略(二)
③. 线程池的底层工作原理? ④. 线程池用过吗?生产上你是如何设置合理参数 ①. 线程池的拒绝策略请你谈谈 ②. 你在工作中单一的/固定数的/可变你的三种创建线程池的方法,你用哪个多?超级大坑
160 0
Juc05_线程池概述、创建方式、七大参数、底层工作原理、拒绝策略(二)