03.01 浅析Alluxio写操作的四种不同方法

Alluxio是一个能够数据分析和人工智能工作负载的开源数据编排系统。像Apache Spark或Apache Hive这样的分布式应用程序可以通过Alluxio与兼容HDFS的接口访问Alluxio中的数据,而无需修改代码。我们将外部存储(如HDFS或S3)作为底层存储。Alluxio是底层存储系统之上的一个新的存储层,它不仅可以提高原始I/O的性能,还允许应用程序能够灵活地选择读、写和管理文件。本文重点描述了向Alluxio写人文件的不同方法,并分析了如何实现在性能、一致性以及与HDFS相比的容错级别方面的权衡。

给定一个应用程序(例如:一个将输出保存到外部存储的Spark作业),将输出写入到一个Alluxio节点的内存层将获得最佳的写入性能。由于内存存储数据存在易失性,当Alluxio中的一个节点宕机或重启时,该节点内存中的任何数据都会丢失。为了防止数据丢失,通过配置客户端写类型,Alluxio提供了同步或异步地将数据持久化到底层存储的能力,每种写类型都有与之相关的优点和缺点。写入Alluxio存储的应用程序应该考虑不同的写特性,并进行成本效益分析,以确定最适合应用程序需求的写类型。

可用的写类型

浅析Alluxio写操作的四种不同方法

写类型是客户端的属性,这意味着在提交应用程序时用户可以修改它们,而无需重新启动任何Alluxio进程。例如,要在提交Spark作业时将Alluxio写类型设置为CACHE_THROUGH,可以在Spark-submit中添加以下选项:

<code>$ spark-submit \\
--conf 'spark.driver.extraJavaOptions=-Dalluxio.user.file.writetype.default=CACHE_THROUGH' \\
--conf 'spark.executor.extraJavaOptions=-Dalluxio.user.file.writetype.default=CACHE_THROUGH' \\    /<code>

当为应用选择写类型时,以下是一些一般性的建议:

  • 对于不需要保存的临时数据或很容易重新生成的数据,可以使用MUST_CACHE直接写入Alluxio内存。随着时间的推移,它会复制副本,虽然最不安全,但性能最好。
  • 对于近期内不会使用的数据,使用THROUGH将其直接从客户端应用立即持久化到底层存储,而不缓存任何副本。这在Alluxio存储中为需要快速、频繁读取的数据留出了更多空间。
  • 对于必须在写入应用返回时被持久化,并且很快会被其它Alluxio应用使用的数据,使用CACHE_THROUGH将数据写入Alluxio和底层存储。注意,Alluxio可以根据数据访问模式在Alluxio中创建副本。
  • 对于需要持久化,并且不需要立即使用的数据,可以使用ASYNC_THROUGH直接将数据写入Alluxio,然后异步地将数据持久化到UFS。

最后,补充说明一点:Alluxio 2.0之后用户可以显式地在Alluxio内存空间中指定数据的副本数,这既能够提升写的性能,又可以利用多副本机制提升容错性。这为既追求写性能,又要求保障数据不丢失的用户提供了一种新的机制。


分享到:


相關文章: