Azure 数据资源管理器分区策略

Azure Data Explorer partitioning strategy

我在 Azure 数据资源管理器中有一个 table,用于从 IoT 传感器收集数据。在不久的将来,它将每天收集数百万条记录。因此,为了获得最佳查询性能,我正在考虑设置分区策略:https://docs.microsoft.com/en-us/azure/data-explorer/kusto/management/partitioningpolicy

我的 table 有 5 个重要列:TenantId、DeviceId、SensorId、Value、Timestamp

(TenantId, DeviceId, VariableId) 的组合使得传感器在全球范围内是唯一的,几乎所有查询都会包含这样的部分:TenantId = 'xx' and DeviceId = 'xx' and VariableId = 'xx'。所有这些列都是字符串类型,并且具有高基数(10.000+ Tenants,1000+ DeviceIds,10.000+ VariableIds)

两个问题:

  1. 基于一个或多个字符串列在此 table 上应用分区是否明智?它符合文档中的建议:

    • 大多数查询使用等式过滤器(==、in())。
    • 大多数查询 aggregate/join 是针对大维度(基数为 10M 或更高)的特定字符串类型列,例如 application_ID、tenant_ID 或user_ID.

但是在页面后面,对于 MaxPartitionCount,他们说它不应高于 1024 且低于列的基数。由于我有高基数列,这不符合要求,所以我有点困惑。

  1. 在新列上摄取和分区之前连接字符串列是否最好?或者仅在 TenantId 上?

almost all queries will contain a part that says TenantId = 'xx' and DeviceId = 'xx' and VariableId = 'xx'.

鉴于此(假设您不经常 join 这 3 列中的任何一列),您可以使用新列扩展您的数据集,这是这 3 列的串联(例如 strcat_delim("_", TenantId, DevideId, VariableId).

您可以在摄取到 Kusto 之前执行此操作(更好),或者 - 在摄取时使用 update policy

然后,将该新列设置为 table 的 data partitioning policy 中的 hash partition key


for the MaxPartitionCount they say that it should be not higher than 1024 and lower than the cardinality of the column. As I have high-cardinality columns this does not comply, so I am a bit confused.

假设您有一个包含 20 个节点的集群,一个基数为 10,000,000 的列 C,并且您想将其设置为 table 的 hash partition key.

遵循文档中关于 MaxPartitionCount 的指南:

  • 支持的值在 (1,1024] 范围内。 -> MaxPartitionCount 应大于 1 且小于或等于 1024.
  • 该值预计大于集群中节点数 -> MaxPartitionCount应大于20.
  • 该值应小于列的基数 -> MaxPartitionCount 应小于 10,000,000
  • 我们建议您从值 256 开始。 根据上述考虑,或根据查询性能与分区数据开销的优势,根据需要调整值 post-ingestion.

因为我在这里没有看到任何冲突的信息 (256 > 1, 256 <= 1024, 256 > 20, 256 < 10M) - 您可能想澄清混淆的来源。