aggregate - Azure 数据资源管理器分区策略
问题描述
我在 Azure 数据资源管理器中有一个从 IoT 传感器收集数据的表。在不久的将来,它将每天收集数百万条记录。因此,为了获得最佳查询性能,我正在考虑设置分区策略:https ://docs.microsoft.com/en-us/azure/data-explorer/kusto/management/partitioningpolicy
我的表有 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)
两个问题:
基于一个或多个字符串列在此表上应用分区是否明智?它符合文档中的建议:
- 大多数查询使用相等过滤器 (==, in())。
- 大多数查询在特定的大维度(基数为 10M 或更高)的字符串类型列上聚合/连接,例如 application_ID、tenant_ID 或 user_ID。
但在页面后面,他们说 MaxPartitionCount 不应高于 1024 且低于列的基数。由于我有高基数列,这不符合要求,所以我有点困惑。
- 在新列上摄取和分区之前最好连接字符串列吗?或者仅在 TenantId 上?
解决方案
几乎所有查询都会包含一个部分,即 TenantId = 'xx' and DeviceId = 'xx' and VariableId = 'xx'。
鉴于此(并且假设您不经常join
使用这 3 列中的任何一个),您可以使用新列扩展您的数据集,该列是这 3 列的串联(例如strcat_delim("_", TenantId, DevideId, VariableId
)。
您可以在摄取到 Kusto 之前执行此操作(更好),或者 - 使用update policy
摄取时。
然后,将该新列设置为hash partition key
表中的data partitioning policy
.
对于 MaxPartitionCount,他们说它不应高于 1024 且低于列的基数。由于我有高基数列,这不符合要求,所以我有点困惑。
假设您有一个带有20
节点的集群,一个C
带有 cardinality的列10,000,000
,并且您希望将其设置为表的hash partition key
.
遵循文档中有关以下内容的指南MaxPartitionCount
:
- 支持的值在范围内
(1,1024]
。->MaxPartitionCount
应大于1
且小于或等于1024
。 - 该值应大于集群中的节点数->
MaxPartitionCount
应大于20
. - 该值应小于列的基数->
MaxPartitionCount
应低于10,000,000
。 - 我们建议您从 的值开始
256
。根据上述考虑,或根据查询性能的优势与摄取后数据分区的开销,根据需要调整该值。
由于我在这里没有看到任何相互矛盾的信息(256
> 1
、256
<= 1024
、256
> 20
、256
< 10M
) - 您可能想澄清混淆的来源。
推荐阅读
- python - 将python嵌入到json文件中
- javascript - 选择器选项未显示
- javascript - 如何返回附加到数组中最大整数的字符串(Javascript)
- typescript - 通过传入构造函数来检测类型的工作不一致
- python - 优化python中的自定义排名函数
- vb.net - 协调后台工作人员
- asp.net-core - Asp.net Core 没有序列化我的新类型
- spring - 在 Spring Reactor 中获取对上下文的引用
- c# - WCF - 使用命名空间对服务进行版本控制时生成平面 WSDL 时出错
- python - TypeError:使用 Otsu 阈值的内置操作的参数类型错误