数据连接与集成优化管道Dataset projections高级细节

注意:以下翻译的准确性尚未经过验证。这是使用 AIP ↗ 从原始英文文本进行的机器翻译。

高级细节

本页面涵盖了关于数据集投影在实践中如何工作的高级细节,以便在数据集上实现更优化的查询。要了解更高层次的投影,请参阅此页面

在内部,投影是数据集的一个副本,优化为某种访问模式。Foundry 将数据集上的投影存储为子数据集。这些被称为“投影”数据集。父数据集被称为“规范”或“投影”数据集。

  • 投影包括一些列集。
    • 投影只能满足对这些列(或它们的一个子集)的读取。

搭建 使投影与主数据集中最新的数据保持同步。如果投影不是最新的,它仍然会被使用。然而,它可能不会提供太多好处。

如果投影数据集收到一个新的 SNAPSHOT 事务,任何下游投影都完全过时,并且在项目重建之前没有任何好处。如果投影数据集收到一个 APPEND 事务,下游投影只相对于新事务局部过时。Foundry 查询会被重写,以便在可能的情况下从投影中获益,同时仍然生成反映新数据的结果。

  • 投影搭建是按分支配置的。投影将被定期压缩以将较小的分区合并为较大的分区。
  • 添加投影不会更改数据集读取的结果。

在低层级上,投影是:

  • 一个大致全局排序的数据集。
  • 一个哈希分桶和局部排序的数据集(注意分桶和排序列可能不同)。

投影数据集

投影数据集存储为一个Foundry 数据集。此数据集不可见为一个资源,但可以通过 Projections 选项卡中的链接访问。

  • 对于每个启用投影搭建的分支,投影数据集中都有一个相应的分支。
  • 删除数据集将删除该数据集上的所有投影。
  • Noho 服务用于管理投影,并在设置投影时在数据集模式中引用。

投影搭建

为了保持其最新状态,投影通过正常的 Foundry 搭建系统异步搭建。这使得用户在搭建后可以一致和立即地读取投影数据集,但投影数据集必须定期搭建以防止过时。

为了在分配计算资源和控制成本方面提供灵活性,Foundry 不会自动创建这些搭建。要配置它们,请使用 Projections 选项卡中的调度器微件。

没有适当搭建节奏的通用规则。主要决定因素是查询需要能够在数据集的未投影部分内执行以达到其性能目标。例如,如果您的管道每小时写入 10 GB,并且您确定筛选读取应扫描不超过 100 GB 以达到您的性能目标,您应该确保投影至少每 10 小时搭建一次。

Spark 配置文件

投影使用自动扩展机制来寻找合适的执行器数量以搭建投影。除非投影搭建失败或耗时过长,否则您无需手动调整 Spark 配置文件。

成本

Foundry 将把与投影相关的任何成本(例如其存储和计算)归因于主数据集的项目。

投影压缩

压缩是投影上执行的主要维护操作。它指的是将大量小型排序文件合并为更大的排序文件的过程。压缩作为投影搭建过程的一部分自动发生在投影上。

压缩使读取性能独立于主数据集上的输入事务数量。这允许投影加速频繁增量写入或流式数据集的读取。投影搭建可能偶尔运行时间超过平均水平。这通常是由于压缩造成的。

投影查询计划

如果可以利用投影满足查询,它将始终在主数据集之前被选中,即使主数据集的写入方式在其他情况下可能更优化以支持给定查询。这极大地简化了查询计划的语义。

选择投影

对于以下查询,在查询计划过程中对各种投影分配的优先级如下:

  • 对列的筛选: 投影优先按最多的列进行排序,全局排序的投影优先于局部排序的投影。例如,如果筛选条件是 x = 1 AND y = 2,投影将按以下优先级选择:
    • 全局排序在列 xy
    • 局部排序在列 xy 上(并在任何列集上进行分桶)
    • 全局排序在列 x
    • 局部排序在列 x 上(并在任何列集上进行分桶)
  • 对列的合并: 优先选择在合并列集上进行分桶的投影。
  • 合并和筛选: 例如,如果查询在列 F 上进行筛选并在列 J 上进行合并,投影将按以下优先级选择:
    • J 上分桶并在列 F 上局部排序的投影
    • 在列 F 上全局排序的投影
    • 在列 F 上局部排序的投影(并在除了列 J 之外的任何列上进行分桶)
    • 在列 J 上分桶的投影(并在除了列 F 之外的任何列上局部排序)

这些优先级反映了这样一种观点,即筛选通常足够具有选择性,因此优化筛选比合并更好,尽管这可能并不总是如此。