上下级平台之间数据同步方案_Alluxio与底层存储系统之间的元数据同步机制

请点击上方蓝字,关注我们哦!

作者简介:林意群,Apache Hadoop PMC member,Apache Ozone PMC member,拥有多年参与开源社区经验,主要专注于存储领域的研究和学习,目前任eBay Hadoop team 大数据研发工程师。

前 言

Alluxio作为一套构建于底层存储系统之上的中间层,它必不可少的会涉及到与底层系统之间metadata之间的同步问题。外部client请求访问Alluxio系统,然后Alluxio再从底层系统中(为称呼方便,后面都简称为Underlying FileSystem, UFS)查询真实的元数据信息,然后再返回给client。当然为了减少对于UFS的压力,我们当然不会每次都去查UFS。本文我们来聊聊Alluxio内部对此元数据同步处理的设计实现,它是最大可能性做到元数据请求处理的高效性以及数据的精准性的。

Alluxio内部的元数据同步行为

首先,这里我们需要想清楚一个基本的问题:作为一套构建于底层存储系统之上的Cache层,Alluxio内部会存在哪些元数据需要同步的情况。

从元数据同步的源头,目标来划分,总共为2类:

  • 1)Alluxio内部metadata先修改,UFS后修改,此过程是从Alluxio到UFS的metadata同步。

  • 2)UFS的metadata先被修改,Alluxio随后同步此修改,此过程则为从UFS到Alluxio的metadata同步。

在上述两种情形中,1)较之于2)来说同步控制更为简单一些,因为Alluxio本身作为外部请求的处理入口,它能第一时间知道请求的发生处理,然后它来自己控制后续如何做UFS底层存储系统的metadata同步。Alluxio率先更新metadata后,对于外界来说,其元数据已经是最新状态的了。这时Alluxio可以选择灵活的策略来更新UFS中滞后的metadata了,比如它可以采用异步更新的方式或者强制同步更新的方式。归纳起来一句话,1)情况下元数据同步更新的主动权完全掌握在Alluxio系统这边。

相比较而言,元数据同步较为复杂的是第二种情况:底层系统metadata发生改变(存在外部程序直接访问UFS导致metadata发生改变),又没有途径能够通知到Alluxio,而且Alluxio是外界请求访问的服务。

2)的情况如下图右半边图所示,1)则为下图左半图所示情形:

76650510ec383e1d4529b896061e7f53.png

上面右半图显示的就是底层存储系统HDFS存在额外更新的情况,需要Alluxio去同步来自Hive这边的对HDFS的额外更新。

下面我们来看看Alluxio内部是如何解决上面这种棘手的情况的。

基于给定时间,path粒度的UFS Status Cache

既然说存在UFS元数据意外更新的情况,为了保证Alluxio对外数据服务的准确性,我们很容易想到一种极端的做法,就是准实时地去同步HDFS中的metadata。

说到准实时的同步UFS中的metadata,就会涉及到两大核心问题:
  • 多久时间的同步,time interval是设定多少,时间过短会导致大量的RPC请求查询UFS,过长又会有数据延时性的问题。
  • 同步多少量的metadata,一个目录?一个文件?
针对上面2个主要问题,Alluxio内部实现了一套基于给定时间,Path粒度的UFS Status Cache实现,架构图设计如下所示:

19f70cae78bc4298af60ae5fa9c8eed1.png

有人可能会对上图理解上有点疑惑,Alluxio本身作为Cache层,为什么还在内部又做了一层Cache?注意这里Cache的对象已经不一样了,上图Cache显示的是从UFS查询到的metadata信息。

上述步骤过程如下所述:

(1)Client发起文件信息查询请求

(2)Alluxio收到请求,检查其内部UFS Status Cache是否存在未过期(在cache更新时间间隔内)的对应的UFS Status,如果有则返回给Client。

(3)如果没有,则发起请求到UFS,进行最新状态文件信息的查询,并加到UFS Status Cache中,同时更新此Path的Status的同步时间。

上图Alluxio内部角色介绍为:
  • UfsSyncPathCache,此类用于记录那些被Cache了的Status的Path路径,此类存有各Path最近一次的metadata同步时间。
  • UfsStatusCache, 此类cache了实际Path对应的metadata cache,此类同时cache了以及,path对应子文件status的映射关系。其中路径对应孩子文件信息的cache是为了加速目录级别的list查询。
以下是上面这2个类的定义说明:
/** * This cache maintains the Alluxio paths which have been synced with UFS. */@ThreadSafepublic final class UfsSyncPathCache {  private static final Logger LOG = LoggerFactory.getLogger(UfsSyncPathCache.class);  /** Number of paths to cache. */  private static final int MAX_PATHS =      ServerConfiguration.getInt(PropertyKey.MASTER_UFS_PATH_CACHE_CAPACITY);  /** Cache of paths which have been synced. */  private final Cache mCache;...}/** * This class is a cache from an Alluxio namespace URI ({@link AlluxioURI}, i.e. /path/to/inode) to * UFS statuses. * * It also allows associating a path with child inodes, so that the statuses for a specific path can * be searched for later. */@ThreadSafepublic class UfsStatusCache {  private static final Logger LOG = LoggerFactory.getLogger(UfsStatusCache.class);  private final ConcurrentHashMap mStatuses;  private final ConcurrentHashMap>> mActivePrefetchJobs;  // path对应children list的ufs status cache  private final ConcurrentHashMap> mChildren;  private final ExecutorService mPrefetchExecutor;...}

我们知道存储系统在list大目录情况时的开销是比较大的,因此上面的children file list的cache可以在一定程度上提升请求的响应速度的。

这里主要来看Alluxio是如何做基于时间粒度的metadata cache的,相关代码逻辑如下:

UfsSyncPathCache.java类

/**   * The logic of shouldSyncPath need to consider the difference between file and directory,   * with the variable isGetFileInfo we just process getFileInfo specially.   *   * There are three cases needed to address:   * 1. the ancestor directories   * 2. the direct parent directory   * 3. the difference with file and directory   *   * @param path the path to check   * @param intervalMs the sync interval, in ms   * @param isGetFileInfo the operate is from getFileInfo or not   * @return true if a sync should occur for the path and interval setting, false otherwise   */  public boolean shouldSyncPath(String path, long intervalMs, boolean isGetFileInfo) {    if (intervalMs < 0) {      // Never sync.      return false;    }    if (intervalMs == 0) {      // Always sync.      return true;    }    // 1)从cache中取出给定path的最近一次的同步时间    SyncTime lastSync = mCache.getIfPresent(path);    // 2)判断是否同步时间已经超过过期间隔时间    if (!shouldSyncInternal(lastSync, intervalMs, false)) {      // Sync is not necessary for this path.      return false;    }    int parentLevel = 0;    String currPath = path;    while (!currPath.equals(AlluxioURI.SEPARATOR)) {      try {        // 3)如果时间超出,则进行父目录的查找,判断父目录是否达到需要更新的时间        currPath = PathUtils.getParent(currPath);        parentLevel++;        lastSync = mCache.getIfPresent(currPath);        if (!shouldSyncInternal(lastSync, intervalMs, parentLevel > 1 || !isGetFileInfo)) {          // Sync is not necessary because an ancestor was already recursively synced          return false;        }      } catch (InvalidPathException e) {        // this is not expected, but the sync should be triggered just in case.        LOG.debug("Failed to get parent of ({}), for checking sync for ({})", currPath, path);        return true;      }    }    // trigger a sync, because a sync on the path (or an ancestor) was performed recently    return true;  }

如上如果需要进行metadata的sync操作,则会触发后续的ufs status的查询然后加到UfsStatusCache中。如果涉及到目录下的文件信息的查询,为了避免可能出现查询子文件数量很多,查询较慢的情况,alluxio做成了异步线程处理的方式。

UfsStatusCache.java

 /**   * Submit a request to asynchronously fetch the statuses corresponding to a given directory.   *   * Retrieve any fetched statuses by calling {@link #fetchChildrenIfAbsent(AlluxioURI, MountTable)}   * with the same Alluxio path.   *   * If no {@link ExecutorService} was provided to this object before instantiation, this method is   * a no-op.   *   * @param path the path to prefetch   * @param mountTable the Alluxio mount table   * @return the future corresponding to the fetch task   */  @Nullable  public Future> prefetchChildren(AlluxioURI path, MountTable mountTable) {    if (mPrefetchExecutor == null) {      return null;    }    try {      Future> job =          mPrefetchExecutor.submit(() -> getChildrenIfAbsent(path, mountTable));      Future> prev = mActivePrefetchJobs.put(path, job);      if (prev != null) {        prev.cancel(true);      }      return job;    } catch (RejectedExecutionException e) {      LOG.debug("Failed to submit prefetch job for path {}", path, e);      return null;    }  }
对于纯单个文件的查询请求,Alluxio采用了简单直接的办法,每次尝试做一次sync操作,如果cache在有效期内,则实际不会做实际metadata同步行为,然后从UFS cache中load metadata返回结果。
 @Override  public FileInfo getFileInfo(AlluxioURI path, GetStatusContext context)      throws FileDoesNotExistException, InvalidPathException, AccessControlException, IOException {    Metrics.GET_FILE_INFO_OPS.inc();    long opTimeMs = System.currentTimeMillis();    try (RpcContext rpcContext = createRpcContext();        FileSystemMasterAuditContext auditContext =            createAuditContext("getFileInfo", path, null, null)) {      // 执行sync metadata的操作,实际由cache interval时间控制      if (syncMetadata(rpcContext, path, context.getOptions().getCommonOptions(),          DescendantType.ONE, auditContext, LockedInodePath::getInodeOrNull,          (inodePath, permChecker) -> permChecker.checkPermission(Mode.Bits.READ, inodePath),          true)) {        // If synced, do not load metadata.        context.getOptions().setLoadMetadataType(LoadMetadataPType.NEVER);      }      LoadMetadataContext lmCtx = LoadMetadataContext.mergeFrom(          LoadMetadataPOptions.newBuilder().setCreateAncestors(true).setCommonOptions(              FileSystemMasterCommonPOptions.newBuilder()                  .setTtl(context.getOptions().getCommonOptions().getTtl())                  .setTtlAction(context.getOptions().getCommonOptions().getTtlAction())));...}

还有一种比较典型地需要load metadata的场景是文件或目录不存在于alluxio的情况。

以上就是本文所要简单阐述的Alluxio与底层存储系统间元数据的同步方式相关的内容,Alluxio本身作为底层存储cache层,在内部新维护了UFS的cache来做与底层UFS的status的同步。而且用户可以按照实际场景需要来设定这个cache需要同步的间隔时间。另外一方面,UFS status cache的引入也减少了list查询操作的代价,在这点上比client直接访问底层存储系统做大目录list要高效不少。

引 用

  • https://dzone.com/articles/two-ways-to-keep-files-in-sync-between-alluxio-and

更多精彩内容,请

f857ecdce27ef5232a0dc7a36ea9555a.png

·end·

—如果喜欢,快分享给你的朋友们吧—

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/562179.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于java SSM图书管理系统简单版设计和实现

本项目演示链接地址 》 主要技术&#xff1a;后台采用技术&#xff1a; SSM框架(SpringMVC Spring Mybatis) 前台采用技术&#xff1a; div css 功能比较简单、适合学习使用 主要功能&#xff1a;登录、图书类型添加、图书类型列表、编辑和删除、图书上传。图书列表、导出…

html中的行内标签吗,HTML标签中行内元素和块级元素详解

本文主要和大家详细介绍了HTML常用的标签中行内元素和块级元素&#xff0c;需要的朋友参考下吧&#xff0c;希望能帮助到大家。块元素(block element) HTML标签分类明细* address - 地址* blockquote - 块引用* center - 举中对齐块* dir - 目录列表* p - 常用块级容易&#xf…

基于javaweb jsp+servlet学生宿舍管理系统设计和实现

本项目演示链接地址 》 主要技术&#xff1a;spring、jsp、servlet、mysql、tomcat 、jsp、jquery、css、c390 、cookie、session等基本技术实现 主要功能:不同角色登录、宿舍管理员管理、学生信息管理、宿舍信息管理、学生缺勤管理、修改密码和退出功能。 系统功能截图&…

html泰勒展开,【转载】泰勒展开式

泰勒展开式对于利用FPGA实现算法来说非常实用&#xff0c;可以将除法等对硬件不友好的运算转变为乘加操作。特此转载以下博文&#xff0c;原文标题及链接为&#xff1a;泰勒展开式 - guoxiang - 博客园https://www.cnblogs.com/guo-xiang/p/6662881.html数学中&#xff0c;泰勒…

基于Java Swing五子棋小游戏设计和实现

本项目演示链接地址 》 前言: 五子棋相传起源于四千多年前的尧帝时期,比围棋的历史还要悠久,可能早在“尧造围棋”之前,民间就已有五子棋游戏。有关早期五子棋的文史资料与围棋有相似之处,因为古代五子棋的棋具与围棋是完全相同的。 在上古的神话传说中有“女…

ueditor工具栏弹出html,UEditor工具栏上自定义按钮、图标、事件、窗口页面

第一步&#xff1a;找到editor_config.js(或者ueditor.config.js)文件中的toolbars参数&#xff0c;增加一个“camnpr”字符串&#xff0c;对应着添加一个labelMap&#xff0c;用于鼠标移上按钮时的提示。1toolbars:[2[...,searchreplace,help,camnpr]3],4labelMap:{5anchor:,u…

junit 单元测试报错java.lang.NoClassDefFoundError

查看版本 junit-4.11以上版本不在包含hamcrest。 解决方法&#xff1a; 下载 junit-4.11以下版本或下载hamcrest-core-1.3.jar驱动包

aps后缀是什么文件_APS审核真的取消了么?

今天早上&#xff0c;留德朋友圈被一条看似惊人的消息刷爆了&#xff1a;APS审核取消了。从早上8点开始&#xff0c;老狗微信的提示音就没有消停过&#xff0c;很多学生抱着同样的问题过来询问&#xff1a;老师&#xff0c;APS是不是真的取消了&#xff1f;我马上爬了起来&…

基于java Springboot实现教务管理系统《视频版-建议收藏》

视频演示&#xff1a; 文末获取源码联系 java Springboot教务管理系统研究背景&#xff1a; 在当今信息社会发展中中&#xff0c;计算机科学的飞速发展&#xff0c;大多数学校开始注意办公效率的发展是很关键&#xff0c;对学校的管理起到举足轻重的作用。基于 Internet 网络的…

c调用python gensim包_Jupyter Notebooks嵌入Excel并使用Python替代VBA宏

以前&#xff0c;Excel和Python Jupyter Notebook之间我们只能选择一个。但是现在随着PyXLL-Jupyter软件包的推出&#xff0c;可以将两者一起使用。在本文中&#xff0c;我将向你展示如何设置在Excel中运行的Jupyter Notebook。在这两者之间共享数据&#xff0c;甚至可以从Exce…

基于java Springboot实现课程评分系统设计和实现

&#x1f345; 作者主页&#xff1a;Java李杨勇 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、Java李杨勇公号作者✌ 简历模板、学习资料、面试题库、技术互助【关注我&#xff0c;都给你】 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f…

百度-Java中级面试题分享-

BeanFactory 和 ApplicationContext 有什么区别 > BeanFactory 可以理解为含有 bean 集合的工厂类。BeanFactory 包含了种 bean 的定义&#xff0c; 以便在接收到客户端请求时将对应的 bean 实例化。 > BeanFactory 还能在实例化对象的时生成协作类之间的关系。此举将 b…

1t硬盘怎么分区最好_win7系统硬盘怎么分区 win7系统硬盘分区步骤【介绍】

我们在使用win7系统的过程当中&#xff0c;经常都会把硬盘分成几个盘&#xff0c;不过因为一些原因&#xff0c;需要把硬盘进行重新分区&#xff0c;不过很多用户都不知道在不重装系统的情况下进行分区&#xff0c;那么win7系统硬盘如何分区呢?今天为大家分享win7系统硬盘分区…

京东-Java中级面试题分享-

1、哪些情况下的对象会被垃圾回收机制处理掉&#xff1f; 利用可达性分析算法&#xff0c;虚拟机会将一些对象定义为 GC Roots&#xff0c;从 GC Roots 出发沿着引用链向下寻找&#xff0c;如果某个对象不能通过 GC Roots 寻找到&#xff0c;虚拟机就认为该对象可以被回收掉。 …

斑能不能彻底去掉_淡妆能不能只用洗面奶卸掉?

淡妆能不能只用洗面奶卸掉?洗面奶能卸妆吗?洗面奶不可以卸妆。洗面奶一般只能清除掉水溶性的污垢,对于油性的彩妆卸效果不大。如果是化妆之后单纯地用洗面奶洁面的话,彩妆不能清除干净容易堵塞毛孔,造成毛孔粗大,皮肤粗糙。卸妆洁面二合一效果的洗面奶能够清除一部分彩妆,但是…

台式电脑连接宽带远程计算机没反应怎么办,怎么处理宽带连接提示连接被远程计算机终止?...

现在有很多人使用宽带拨号上网&#xff0c;有个小伙伴的宽带有一天就出现了宽带被远程计算机终止&#xff0c;这是怎么一回事呢&#xff1f;这样一来他的宽带就无法上网了&#xff0c;电脑没了网基本什么也干不了。请大家和小编一起来看看这个问题有什么好办法可以解决呢&#…

❤️六W字《计算机基础知识》(一)(建议收藏)❤️

计算机简介&#xff1a; 计算机&#xff08;computer&#xff09;俗称电脑&#xff0c;是现代一种用于高速计算的电子计算机器&#xff0c;可以进行数值计算&#xff0c;又可以进行逻辑计算&#xff0c;还具有存储记忆功能。是能够按照程序运行&#xff0c;自动、高速处理海量…

语言中要输出表格_C语言 | 表格输出若干人的信息

“要成为绝世高手&#xff0c;并非一朝一夕&#xff0c;除非是天生武学奇才&#xff0c;但是这种人…万中无一”——包租婆这道理放在C语言学习上也一并受用。在编程方面有着天赋异禀的人毕竟是少数&#xff0c;我们大多数人想要从C语言小白进阶到高手&#xff0c;需要经历的是…

❤️六W字《计算机基础知识》(二)(建议收藏)❤️

上一篇&#xff1a; ❤️六W字《计算机基础知识》&#xff08;一&#xff09;❤️ 51、 Access是一种____数据库管理系统。 A、发散型 B、集中型 C、关系型 D、逻辑型 52、 用高级程序设计语言编写的程序&#xff0c;要转换成等价的可执行程序&#xff0c;必须经过____。 A、…

Oracle 数据怎么实时同步到 DM DB 达梦数据库 | 亲测干货建议收藏

摘要 很多 DBA 同学经常会遇到要从一个数据库实时同步到另一个数据库的问题&#xff0c;同构数据还相对容易&#xff0c;遇上异构数据、表多、数据量大等情况就难以同步。我自己亲测了一种方式&#xff0c;可以很方便地完成 Oracle 数据实时同步到 DM DB 达梦数据库&#xff0c…