本文是详述数据仓库中 OLAP 多维数据集功能博文系列中的第五篇,OLAP 多维数据集是一项全新的功能,其可启用 SCSM 2012 中添加的自助报告功能。
OLAP 多维数据集处理
当系统部署完一个多维数据集,并创建了其所有分区后,则该多维数据集就已处于处理就绪状态,并可供用户浏览。处理多维数据集是在执行完 ETL 后的最后一个步骤。以下数据流图说明了整个过程:
图:说明源数据如何最终流入 OLAP 多维数据集的数据流图
当系统为多维数据集计算了所有聚合操作,且多维数据集加载了这些聚合和数据时,系统就将处理多维数据集。系统将读取维度表和事实数据表,计算该数据,并将该数据加载到多维数据集中。
由于处理过程可能对存在数百万条记录的生产环境形成重大影响,因此必须小心对待整个处理过程。处理此类环境中的所有分区可能随处发生,并有可能持续数天,甚至数周,因而导致最终用户无法使用系统和多维数据集。我们所提供的一项建议是针对当前未使用的任何多维数据集,禁用其处理计划,以降低系统的开销。
多维数据集的处理将被分解为两项独立的任务:
1) 维度处理
2) 分区处理
每个多维数据集将在 DW UI 中增加一个处理作业,并将根据用户配置的计划执行该作业。让我们一起来看一下如何处理每种类型的处理任务。
维度处理
当 AS DB 中被添加了一个新的维度时,系统必须在该维度上执行一项“Process Full MUST”处理,以将其调整为完全处理的状态。然而,在系统处理完一个维度后,系统并不能保证避免当处理针对相同维度的另一多维数据集时该维度会被再次处理。这是为了避免不必要的处理开销,我们希望避免重复处理每个多维数据集的每个维度,特别是在系统已经在最近处理过该维度的情况下,更是应避免重复处理,因为系统中不大可能存在尚未被处理过的新数据。为了优化处理效率,MP Microsoft.SystemCenter.Datawarehouse.OLAP.Base 中定义了一个名为 Microsoft.SystemCenter.Warehouse.Dimension.ProcessingInterval 的单独类:
<!-- This singleton class defines the minimum interval of time in minutes that must elapse before a shared dimension is reprocessed. -->
<ClassTypeID="Microsoft.SystemCenter.Warehouse.Dimension.ProcessingInterval" Accessibility="Public" Abstract="false" Base="AdminItem!System.AdminItem" Singleton="true">
<Property ID="IntervalInMinutes" Type="int" Required="true" DefaultValue="60"/>
</ClassType>
该单独类包含“IntervalInMinutes”属性,该属性描述了处理某一维度的频率,默认频率为每 60 分钟一次。例如,如果系统在下午 3:05 处理了一个维度,而且在下午 3:45 处理了针对相同维度的另一多维数据集,那么该维度将不会被重复处理。然而,这一方法有一个缺点,即其可能会增加维度键错误的可能性。系统实施了一个重试机制来处理将在实质上重新处理维度,然后进行多维数据集分区的维度键错误。有关更多信息,请参阅“调试与故障排除中的常见问题”章节中的“处理错误”部分。
当系统完整处理完一个维度后,系统将执行通过 ProcessUpdate 进行的增量处理。系统将执行 ProcessFull 的唯一其他时间是在某一维度架构发生更改时,这是因为这将导致维度返回到未处理的状态。用户需要注意,如果系统在某一维度上执行 ProcessFull,那么所有受影响的多维数据集(及其分区)随后将以未处理的状态存在,并需要在其下一次计划运行时进行完全处理。
分区处理
由于重复处理较大分区的速度较慢,并将消耗 AS 计算机中的大量 CPU 资源,因此必须小心对待整个分区处理过程。一般来说,分区处理所耗时间将长于维度处理过程。与维度处理不同的是处理分区对其他对象没有任何副作用。SCSM 2012 多维数据集上仅将执行两类处理,即 ProcessFull 和 ProcessAdd。
与维度类似,创建任何一个新分区都需要一个 ProcessFull,以使分区处于可查询状态。
由于 ProcessFull 是一个耗费较多资源的操作,因此我们的理念是仅在必要时执行 ProcessFull(即创建分区,更新某一行时)。当我们知道系统添加了行,或没有更新任何行时,我们可执行 ProcessAdd。为了进行这一操作,我们将使用水印,并利用其它元数据。更具体来说,系统需要查询 etl.cubepartition 和 the etl.tablepartition 表以确定执行哪类处理。下面的图中显示了来自这些表中的一些示例数据:
图:来自 etl.TablePartition 表的示例数据,其中多维数据集水印使用了 InsertedBatchId 和 UpdatedBatchId 列
图:来自 etl.CubePartition 表的示例数据,其中包含 WatermarkBatchId
以下关系图说明了我们如何基于水印数据确定执行哪类处理:
请注意,我们将在执行 ProcessAdd 时限制通过水印进行查询的范围。例如,如果 InsertedBatchId 为 100,而 WatermarkBatchId 为 50,那么查询仅将从 InsertedBatchId 大于 50,小于 100 的数据集市中加载数据。
最后,应注意在当前阶段,我们并不支持通过 AS 或 BIDS 来手动处理多维数据集。使用非 SCSM 2012 提供的方法(UI 或 cmdlet)来处理多维数据集将不会更新水印表,因而有可能导致数据完整性问题。如果某用户已经在意外情况下手动重复处理了多维数据集,那么您可采用的解决方法是使用相同的方式手动停止处理多维数据集,由于分区将处于未处理的状态,因此当下一次 SCSM 处理该多维数据集时,系统将自动执行 ProcessFull。这将正确更新所有水印和元数据,因此任何可能发生的数据完整性问题都将得以解决。