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)
两个问题:
基于一个或多个字符串列在此 table 上应用分区是否明智?它符合文档中的建议:
- 大多数查询使用等式过滤器(==、in())。
- 大多数查询 aggregate/join 是针对大维度(基数为 10M 或更高)的特定字符串类型列,例如 application_ID、tenant_ID 或user_ID.
但是在页面后面,对于 MaxPartitionCount,他们说它不应高于 1024 且低于列的基数。由于我有高基数列,这不符合要求,所以我有点困惑。
- 在新列上摄取和分区之前连接字符串列是否最好?或者仅在 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
) - 您可能想澄清混淆的来源。
我在 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)
两个问题:
基于一个或多个字符串列在此 table 上应用分区是否明智?它符合文档中的建议:
- 大多数查询使用等式过滤器(==、in())。
- 大多数查询 aggregate/join 是针对大维度(基数为 10M 或更高)的特定字符串类型列,例如 application_ID、tenant_ID 或user_ID.
但是在页面后面,对于 MaxPartitionCount,他们说它不应高于 1024 且低于列的基数。由于我有高基数列,这不符合要求,所以我有点困惑。
- 在新列上摄取和分区之前连接字符串列是否最好?或者仅在 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
) - 您可能想澄清混淆的来源。