当前位置: 首页 > 科技观察

关于Alluxio中元数据同步的设计、实现和优化_0

时间:2023-03-19 20:44:08 科技观察

关于Alluxio中元数据同步的设计、实现和优化【51CTO.com速译】元数据同步是Alluxio的一个重要特性。本文描述了用于调整性??能的设计、实现和其他内部过程。元数据同步(sync)是Alluxio的核心功能。它使文件和目录与存储系统下的真实来源保持一致,以便用户可以轻松地从Alluxio中检索到最新版本的数据。了解内部流程以调整性能也很重要。本文介绍Alluxio中元数据同步的设计与实现。为什么元数据同步在Alluxio中很重要在Alluxio中,元数据是指Alluxio文件系统中文件和目录的信息,包括它们的所有者、组、权限、创建和修改时间等信息。元数据独立于它的内容——即使一个文件或目录是空的,它仍然有关联的元数据。Alluxio维护着一份文件系统或底层存储系统的对象存储命名空间的副本。在Alluxio中,元数据一致性很重要,尤其是当不同的集群在数据管道中写入或读取数据并在Alluxio之外进行更改时。上图中是一个典型的场景,结合SparkETL和PrestoSQL的数据管道。ETL集群(没有Alluxio)写入数据,然后分析集群和Alluxio读取转换后的数据。由于Alluxio维护着底层存储的元数据副本,并对元数据进行管理,当底层存储中的数据通过ETL步骤发生变化时,需要让分析集群上的Alluxio实例感知并与底层存储中的元数据保持一致系统正常运行。Alluxio中元数据同步的工作原理Alluxio在一个或多个底层存储系统上的统一命名空间中提供文件系统抽象。通过Alluxio访问文件或目录将得到与直接访问存储下相同的结果。例如,如果挂载到Alluxio根目录的底层存储是s3://bucket/data,那么在Alluxio中列出“/”目录与在s3://bucket/data中列出对象并打印“/”是一样的file"init"产生与s3://bucket/data/file应该返回的结果相同的结果。在Alluxio中,元数据仅由Alluxiomaster存储和提供,但各个文件的内容由Alluxioworker提供。默认情况下,Alluxio按需从底层存储加载元数据。在上面的例子中,一个从空开始的Alluxiomaster没有任何关于s3://bucket/data/file的信息。只有当某些用户列出“/”目录或尝试访问Alluxio中的“/file”时,该文件才会被识别。这种“惰性”行为可以防止不必要的工作并可以显着提高性能,因为底层存储上的元数据操作可能很慢。请注意,更新元数据可以双向进行。如果对文件系统的所有修改都是通过Alluxio发生的,那么Alluxio只需要扫描底层存储一次以检索初始状态,然后将更改同步应用到Alluxio和底层存储中作为文件系统RPC调用的一部分。这将为用户提供一致的存储空间不足视图。然而在实际应用中,Alluxio外部的存储空间变化频繁,因此Alluxiomaster必须监控底层存储中文件和方向的增删改查,并将变化应用到Alluxio文件系统中。这个同步两个命名空间的过程称为元数据同步。如何触发元数据同步当应用程序更改Alluxio文件的元数据并且文件被持久化时,更改将始终同步传播到底层存储,而不会触发元数据同步。在Alluxio不知情的情况下,当应用程序在存储文件下更新时,有两种方法可以控制何时同步元数据。1.对于基于时间的自动同步,将同步间隔设置为Alluxio属性键“alluxio.user.file.metadata.sync.interval”。当值为-1(默认值)时,Alluxio将永远不会在初始加载后与底层存储重新同步;当它的值设置为0时,每当访问元数据时,Alluxio将始终与底层存储重新同步;当此值为正数(默认单位为毫秒)时,Alluxio将(尽力)在该时间间隔内不重新同步路径。请注意,如果从未以这种方式访问??Alluxio中的路径,则它永远不会触发同步。一旦在同步间隔到期后访问该路径,Alluxio将再次与底层存储同步。例如,在Presto作业中,查询计划阶段会列出作业所需的所有文件,如果最近未访问这些路径,则会触发同步。但除非作业持续时间超过同步间隔,否则作业的后续阶段将不会同步。所以从技术上讲,在这种情况下,我们可以比同步间隔更频繁地重新同步。可以使用新的全局默认值(在alluxio-site.properties中设置时)或通过在目录基础上递归地应用其所有子项来自定义此属性键。2.使用LoadMetadata标志手动同步如果由于同步间隔而没有发生元数据同步,大多数Alluxio操作将继续使用当前在Alluxio文件系统中的元数据执行,但有一些例外:对于大多数用户,Alluxio的CLI“loadMetadata"是手动触发同步的最简单方法。例如,您可以运行“bin/alluxiofsloadMetadata/path/to/sync”来强制更新Alluxio路径“/path/to/sync”的元数据;对于基于Alluxio文件系统SDK(Java)构建的应用程序,有两个API方法getStatus和listStatus可以检索路径或目录的元数据。在调用这些方法时,每次调用的option中都会多出一个LoadMetadataPType字段,可能会在查询到的Alluxio路径上触发master的“loadMetadata”进程。这个过程可以说是一个简化版的同步,只是从底层存储加载文件元数据。但是如果文件已经存在于Alluxio中,则不会修改文件的元数据。如果LoadMetadataPType设置为NEVER,则不会加载任何内容,如果文件不存在,则会抛出FileNotFound异常。当LoadMetadataPType为ONCE时,每个目录只会加载一次元数据。这只会影响对这两个文件系统的调用,并且只有在未发生同步时才会考虑此选项。如何实现元数据同步当Alluxiomaster收到一个RPC请求为该路径检索元数据时,Alluxiomaster可能会触发Alluxio路径上的元数据同步。与其使用遍历整个文件系统inode树并保持同步的专用服务,这项工作由master上的每个单独的Alluxio文件系统操作分摊。RPC请求中同步的高层流程是:给定一个Alluxio路径,判断它是否与对应的存储路径一致。这意味着存储不足的路径不存在或具有与Alluxio不同的元数据,这部分是使用RPC线程完成的;步骤1填充到一个同步队列中,我们遍历同步队列,并从一个单独的线程池中处理工作线程。遍历顺序是BFS顺序,因为在队列的末尾添加了额外的路径。并行性和执行器在并行部分有更详细的讨论。这部分由同步线程执行,使用出库预取线程读取出库信息。这样做的原因是通信与计算重叠。同步线程需要操作inode树,一旦我们确定我们在未来的某个时间点需要该信息,就可以启动存储不足的预取。预取线程将低存储状态信息加载到低存储状态缓存,在缓存部分讨论。请注意,如果涉及inode树的相同部分,元数据同步过程可能相对昂贵并且会阻塞其他操作。这是因为同步过程可能会写锁定它正在更新的文件系统的元数据部分。特别是,在同步树中的特定路径时,RPC处理线程会先获取文件整个路径的读锁。因为同步线程也需要创建路径的能力,所以需要同步根路径上的写锁。同步线程处理根路径下的每条路径时都会获取额外的锁,同步线程获取文件路径的写锁,处理完路径后立即释放。性能优化调整并行度。您可以通过控制三个配置参数来调整同步元数据的并行度:alluxio.master.metadata.sync.concurrency.level表示单个元数据同步请求(例如在一个目录上)要同步的文件数。alluxio.master.metadata.sync.executor.pool.size表示所有同步操作的并发线程数。alluxio.master.metadata.sync.ufs.prefetch.pool.size表示存储预取操作下可以执行所有同步操作的并发线程数。缓存结果在元数据同步过程中,存在三种不同的缓存,其目的和用途各不相同。这是所有这些的快速摘要。AbsentCache是一种负缓存,用于避免检查已知不存在的路径是否存储不足。它使用前缀匹配来确定路径是否在底层存储中。例如,如果路径/a/b在不存在的缓存中,我们就知道/a/b/c在底层存储中也不可能存在。AbsentCache条目也带有时间戳,以便我们知道上次检查底层存储的时间。当同步间隔是一段时间并且我们使用时间戳来确定是否需要重新检查文件或目录是否存在时,这很有用。UfsStatusCache是一个缓存,用于在同步期间从存储的状态中预取。我们往往可以在处理当前目录的时候预取一些文件状态,而不是在需要的时候去取路径信息。UfsSyncPathCache是一个正缓存,包含最近与底层存储同步的路径。当我们收到元数据操作时,我们会检查此缓存以确定是否需要同步特定路径。总结元数据同步是Alluxio中最重要的功能之一。有许多不同的方式来触发同步,具有不同的性能权衡。在Alluxiomaster中有一个优化列表来加速同步。译者介绍朱刚,51CTO社区编辑,2019年CSDN博客20强,2020年腾讯云+社区优秀作者,10年一线开发经验,曾参与猎头服务网站架构设计,企业智能客户服务及大型电子政务系统开发,主导建设某大型国有企业内部防泄密及电子文档安全监控系统,目前在某BIM龙头企业从事招投标软件开发。原标题:Alluxio中的元数据同步:设计、实现和优化,作者:DavidZhu