我正在加入两个表,其中SnappyData中的大量(当前为100M - 1B)行配置在一个服务器中,具有64个CPU内核和512GB内存,并且希望使用collocated join。但是,doc中的描述似乎意味着并置连接发生在每个节点级别。
我需要的是实际上类似于每个桶级并置连接(或分区连接),并且我没有充分利用服务器,因为大部分时间总CPU利用率约为10%或更低。 / p>
对于连接,我使用的是Rowstore和SQL语句。我使用单节点设置脚本(snappy-start-all.sh)设置SnappyData,其中包含一个主机,一个服务器和一个定位器,并通过一些定制来使用更多内存和CPU内核:
CONF /引线
localhost -locators=localhost:9999 -heap-size=200g -spark.executor.cores=30 -dir=/snappydata/lead1
CONF /服务器
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
我无法弄清楚如何解决这个问题,我的问题是:
任何上述任何问题的信息或指示(对于在一篇文章中提出很多问题感到抱歉)将不胜感激:)
更新:
两个行表的模式如下所示(列都是整数类型):
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%)非常频繁,而大多数则不是。
答案 0 :(得分:2)
仅当满足这两个托管标准时,才支持涉及两个或多个分区行表(包含或不包含其他复制表)的查询:
这些标准允许SnappyData将连接查询分发给托管数据的所有服务器。查询在每个本地数据存储上并发执行,而不必将表数据从一个成员移动到另一个成员以执行连接。连接在每个数据存储的本地数据集上执行,主查询成员聚合每个数据存储的结果以获取结果集。
答案 1 :(得分:2)
- 并置联接如何正常工作?并置连接是在每个节点级别还是每桶级别或之间发生的?除了设置桶号之外,还有什么可以调整的吗?
醇>
每个节点级别发生并置连接。
- 除了并置连接之外,在连接列上创建索引会有帮助吗?
醇>
这取决于您的加入查询。
- 配置是否适合我的工作量?或者我应该设置多个服务器来充分利用资源?
醇>
设置多个服务器应该有助于更好地利用资源。
- 如果我的设置似乎没问题,那么低CPU利用率可能是由于倾斜的散列分区方案造成的,我可以在哪里调整分区方案以避免偏差分区?
醇>
你可以从这个指针开始 - http://rowstore.docs.snappydata.io/docs/data_management/partitioning-about.html 您还可以根据范围或列表或表达式对数据进行分区,具体取决于数据的性质。通过这些示例了解如何实现这一目标 - http://rowstore.docs.snappydata.io/docs/developers_guide/topics/create-partition-tables/PartitioningExamples.html