我正在连接两个表,其中 SnappyData 中的大量行(当前为 100M - 1B)配置在一台具有 64 个 CPU 内核和 512GB 内存的服务器中,并且希望使用并置连接。然而,文档中的描述似乎暗示并置连接发生在每个节点级别。
我需要的实际上是每个桶级别的并置连接(或分区连接),并且我没有充分利用服务器,因为大部分时间总 CPU 利用率约为 10% 或更少。
对于连接,我使用的是 Rowstore 和 SQL 语句。我使用单节点设置脚本 (snappy-start-all.sh) 设置了 SnappyData,其中包含一个线索、一个服务器和一个定位器,并进行了一些自定义以使用更多的内存和 CPU 内核:
会议/领导
localhost -locators=localhost:9999 -heap-size=200g -spark.executor.cores=30 -dir=/snappydata/lead1
配置/服务器
localhost -locators=localhost:9999 -heap-size=200g -spark.executor.cores=30 -dir=/snappydata/server1
conf/定位器
localhost -peer-discovery-port=9999 -heap-size=2048m -dir=/snappydata/locator1
我无法弄清楚如何解决这个问题,我的问题是:
- 并置连接究竟是如何工作的?并置连接发生在每个节点级别或每个存储桶级别还是介于两者之间?除了设置桶号之外,我还有什么可以调整的吗?
- 除了并置连接之外,在连接列上创建索引是否有帮助?
- 配置是否适合我的工作量?还是应该设置多个服务器以充分利用资源?
- 如果我的设置看起来没问题,低 CPU 利用率可能是由于偏斜的哈希分区方案,我在哪里可以调整分区方案以避免偏斜分区?
任何关于上述任何问题的信息或指针(很抱歉在一篇文章中提出了很多问题)将不胜感激:)
更新:
两行表的 schema 是这样的(列都是 Integer 类型):
Table_A(key1, key2, value1, value2, value3)
USING ROW OPTIONS (partition_by 'key1, key2')
Table_B(key1, key2, value4, value5)
USING ROW OPTIONS (partition_by 'key1, key2', colocate_with 'Table_A').
连接结果将包含: Table_C(key1, key2, value1, value2, value3, value4, value5)
key1 可以是~200 个不同的值,key2 可以是~2M 个不同的值。并且 (key1, key2) 分布是倾斜的并且不是唯一的——少数(<5%)非常频繁,而大多数不是。