Presto是一种流行的开源分布式SQL引擎,使组织可以在多个数据源上大规模运转交互式剖析查询。缓存是一种典型的进步 Presto 查询功能的优化技能。它为 Presto 渠道供给了明显的功能和功率改进。

缓存经过将频频拜访的数据存储在内存或快速本地存储中,避免了昂贵的磁盘或网络行程来重新获取数据,然后加快了全体查询的履行速度。在本文中,咱们将深入探讨 Presto 的缓存机制以及如何运用它们来进步查询速度并下降本钱。

缓存的好处

缓存供给了三个关键优势。经过在 Presto 中施行缓存,您可以:

  • 进步查询功能。 缓存频频拜访的数据使 Presto 可以从更快、更近的缓存中检索成果,而不是扫描速度较慢的存储。关于重复的剖析查询,这可以将查询速度进步几个数量级,然后削减整体推迟。经过加快查询履行,缓存可完成交互式查询和更快的洞察时刻。
  • 下降基础设施本钱。 缓存削减了从 S3 等长途存储系统读取的数据量,然后下降了出口费用和存储 API 恳求的费用。关于存储在云中的数据,缓存可以最大限度地削减经过网络重复检索数据。这可以节约大量本钱,尤其是关于大型数据集。
  • 最大限度地削减网络开支。 经过削减 Presto 组件和长途存储之间不必要的数据传输,缓存可以缓解网络拥塞。本地缓存可防止分布式 Presto 作业线程之间的网络链接出现瓶颈。它还削减了与外部数据源衔接的负载和带宽运用。

整体而言,缓存可以进步 Presto 查询的功能和功率,为依据 Presto 的剖析渠道供给巨大的价值和出资回报率。

Presto 中不同类型的缓存

Presto中有两种类型的缓存,内置缓存和第三方缓存。内置缓存包含Metastore缓存、文件列表缓存和Alluxio SDK缓存。它运用 Presto 集群的内存和 SSD 资源,与 Presto 在同一进程中运转,以获得最佳功能。

内置缓存的首要优点是推迟十分低并且没有网络开支,由于数据在 Presto 集群中本地缓存。但是,内置缓存容量遭到作业节点资源的约束。

第三方缓存,例如Alluxio分布式缓存,可以独立布置,并供给更好的可扩展性和更大的缓存容量。它们关于大规模剖析作业负载、跨区域/云布置以及下降云存储的 API 和出口本钱特别有利。

深入探讨 Presto 中的缓存

上图和下表总结了不同的缓存类型及其相应的资源类型和方位。

缓存类型 缓存方位 资源类型
元数据缓存 Presto 和谐器 内存
列表文件缓存 Presto 和谐器 内存
Alluxio SDK 缓存 Presto 作业节点 内存/SSD
Alluxio 分布式缓存 Alluxio 作业节点 内存/SSD/HDD

默许情况下,Presto 的缓存均未启用。您需求修改 Presto 的装备才干激活它们。咱们将在以下部分中更具体地解释不同的缓存类型以及如何经过装备特点启用它们。

元存储缓存

Presto 的元存储缓存将 Hive 元存储查询成果存储在内存中,以便更快地拜访。这削减了规划时刻和元存储恳求。

当 Hive 元存储过载时,元存储缓存十分有用。关于大型分区表,缓存将分区元数据存储在本地,然后完成更快的拜访和更少的重复查询。这削减了 Hive 元存储上的整体负载。

要启用元存储缓存,请运用以下设置:

hive.partition-versioning-enabled=true
hive.metastore-cache-scope=ALL
hive.metastore-cache-ttl=1d
hive.metastore-refresh-interval=1d
hive.metastore-cache-maximum-size=10000000

请注意,假如表频频更新,您应该为元存储版本化缓存装备较短的 TTL 或改写距离。较短的缓存改写距离可保证仅存储当时元数据,然后下降查询履行中元数据过期的风险。这可以防止 Presto 运用过期的数据。

列出文件状况缓存

列表文件缓存存储文件途径和特点,以避免从称号节点或对象存储中重复检索。

当 HDFS namenode 过载或对象存储的文件列表功能较差时,列表文件缓存可明显改进查询推迟。列表文件调用可能会成为 HDFS 的瓶颈,使称号节点不堪重负,并添加 S3 存储的本钱。启用列表文件状况缓存后,Presto 和谐器会在内存中缓存文件列表,以便更快地拜访常用数据,然后削减冗长的长途 listFile 调用。

要装备列表文件状况缓存,请运用以下设置:​​​​​​​

hive.file-status-cache-expire-time=1h
hive.file-status-cache-size=10000000
hive.file-status-cache-tables=*

请注意,列表文件状况缓存只能应用于密封目录,由于 Presto 会越过缓存敞开分区以保证数据新鲜度。

Alluxio SDK缓存(原生)

Alluxio SDK缓存是Presto内置缓存,可以削减表扫描推迟。由于 Presto 是一个与存储无关的引擎,因此其功能常常遭到存储的瓶颈。在 Presto 作业 SSD 上本地缓存数据可完成快速查询拜访和履行。经过最大限度地削减重复的网络恳求,Alluxio 缓存还可以下降云出口费用和长途数据的存储 API 本钱。

Alluxio SDK缓存关于查询长途数据(例如跨区域或混合云对象存储)特别有用。这明显下降了查询推迟以及相关的云存储出口本钱和 API 本钱。

运用以下设置启用 Alluxio SDK 缓存:​​​​​​​

cache.enabled=true
cache.type=ALLUXIO
cache.base-directory=file:///tmp/alluxio
cache.alluxio.max-cache-size=100MB

为了到达最好的缓存射中率,将节点挑选策略改为软亲和性:

hive.node-selection-strategy=SOFT_AFFINITY

深入探讨 Presto 中的缓存

上图展现了软亲和力节点挑选架构。软关联调度尝试依据文件途径向作业程序发送恳求,经过在作业程序缓存中定位数据来最大化缓存射中率。软亲和力之所以是“软”,是由于它不是一个严厉的规则——假如首选作业人员繁忙,则将分片发送到另一个可用作业人员而不是等待。

假如遇到诸如“Unsupported Under FileSystem”之类的错误,请从 Maven 存储库下载最新的Alluxio 客户端 JAR并将其放置在 {$presto_root_path}/plugin/hive-hadoop2/ 目录中。

Alluxio分布式缓存(第三方)

假如 Presto 内存或存储不足以容纳大型数据集,则运用第三方缓存解决方案可以为频频的数据拜访供给扩展缓存。第三方缓存可以为 Presto 供给多种优化:

  • 经过削减 I/O 推迟来进步功能
  • 加快长途跨数据中心或云数据存储的查询
  • 在 Presto 作业线程、集群和其他引擎(例如Apache Spark)之间供给同享缓存
  • 启用弹性缓存以节约现货实例的本钱

Alluxio 分布式缓存是第三方缓存的一个示例。如下图所示,Alluxio分布式缓存布置在Presto和S3等存储之间。Alluxio运用主从架构,其间主节点办理元数据,作业节点办理本地存储(内存、SSD、HDD)上的缓存数据。当缓存射中时,Alluxio作业线程将数据回来给Presto作业线程。不然,Alluxio作业线程从持久存储中检索数据并缓存数据以供将来运用。Presto 作业线程处理缓存的数据,和谐器将成果回来给用户。

深入探讨 Presto 中的缓存

以下是运用 Presto 布置 Alluxio 分布式缓存的步骤。

1.将Alluxio客户端JAR分发到所有Presto服务器

为了让 Presto 可以与 Alluxio 服务器通信,Alluxio 客户端 jar 必须坐落 Presto 服务器的类途径中。将 Alluxio 客户端 JAR /<PATH_TO_ALLUXIO>/client/alluxio-2.9.3-client.jar 放入所有 Presto 服务器上的目录 ${PRESTO_HOME}/plugin/hive-hadoop2/ 中。运用以下指令重新启动 Presto 作业线程和和谐器:

$ ${PRESTO_HOME}/bin/launcher restart

2.将Alluxio装备添加到Presto的HDFS装备文件中

您可以将Alluxio的特点添加到HDFS装备文件中,例如core-site.xml和hdfs-site.xml,然后在文件${PRESTO_HOME}/etc/catalog/hive.properties中运用Presto特点hive.config.resources指向每个 Presto Worker 上的 HDFS 装备文件的方位。

hive.config.resources=/<PATH_TO_CONF>/core-site.xml,/<PATH_TO_CONF>/hdfs-site.xml

然后,将该特点添加到 HDFS core-site.xml 装备中,该装备由 Presto 特点中的 hive.config.resources 链接。


<configuration>
  <property>
    <name>alluxio.master.rpc.addresses</name>
<value>master_hostname_1:19998,master_hostname_2:19998,master_hostname_3:19998</value>
  </property>
</configuration>

依据上面的装备,Presto可以定位Alluxio集群并将数据拜访转发给它。

要了解有关 Presto 的 Alluxio 分布式缓存的更多信息,请参阅此文档。

为您的用例挑选正确的缓存

缓存是进步 Presto 查询功能的有用办法。在本文中,咱们介绍了Presto中不同的缓存机制,包含元存储缓存、列表文件状况缓存、Alluxio SDK缓存和Alluxio分布式缓存。如下表所示,您可以依据您的用例运用这些缓存来加快数据拜访。

缓存类型 何时运用
元存储缓存 规划时刻 慢 Hive 元存储 具有数百个分区的大型表
列出文件状况缓存 重载的 HDFS namenode 重载的对象存储(如 S3)
Alluxio SDK缓存 外部存储缓慢或不稳定
Alluxio分布式缓存 跨区域、多云、混合云 与其他计算引擎同享数据

Presto 和 Alluxio 开源社区不断致力于改进现有的缓存功能并开发新的功能来增强查询速度、优化功率并进步系统的可扩展性和可靠性。

作者:Beinan Wang and Hope Wang

更多技能干货请关注公号【云原生数据库

squids.cn,云数据库RDS,迁移东西DBMotion,云备份DBTwin等数据库生态东西。