SnappyData在一个物理服务器设置中并置了联接

时间:2017-04-18 17:23:00

标签: join snappydata

我正在加入两个表,其中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

我无法弄清楚如何解决这个问题,我的问题是:

  1. 并置联接如何正常工作?并置连接是在每个节点级别还是每桶级别或之间发生的?除了设置桶号之外,还有什么可以调整的吗?
  2. 除了并置连接之外,在连接列上创建索引会有帮助吗?
  3. 配置是否适合我的工作量?或者我应该设置多个服务器来充分利用资源?
  4. 如果我的设置似乎没问题,那么低CPU利用率可能是由于倾斜的散列分区方案造成的,我可以在哪里调整分区方案以避免偏差分区?
  5. 任何上述任何问题的信息或指示(对于在一篇文章中提出很多问题感到抱歉)将不胜感激:)

    更新:

    两个行表的模式如下所示(列都是整数类型):

    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%)非常频繁,而大多数则不是。

2 个答案:

答案 0 :(得分:2)

仅当满足这两个托管标准时,才支持涉及两个或多个分区行表(包含或不包含其他复制表)的查询:

  1. 查询的WHERE子句在查询中所有分区表的所有分区列上都有等值条件。
  2. 查询中的所有分区表都是共处的。
  3. 这些标准允许SnappyData将连接查询分发给托管数据的所有服务器。查询在每个本地数据存储上并发执行,而不必将表数据从一个成员移动到另一个成员以执行连接。连接在每个数据存储的本地数据集上执行,主查询成员聚合每个数据存储的结果以获取结果集。

答案 1 :(得分:2)

  
    
        
  1. 并置联接如何正常工作?并置连接是在每个节点级别还是每桶级别或之间发生的?除了设置桶号之外,还有什么可以调整的吗?
  2.        

每个节点级别发生并置连接。

  
    
        
  1. 除了并置连接之外,在连接列上创建索引会有帮助吗?
  2.        

这取决于您的加入查询。

  
    
        
  1. 配置是否适合我的工作量?或者我应该设置多个服务器来充分利用资源?
  2.        

设置多个服务器应该有助于更好地利用资源。

  
    
        
  1. 如果我的设置似乎没问题,那么低CPU利用率可能是由于倾斜的散列分区方案造成的,我可以在哪里调整分区方案以避免偏差分区?
  2.        

你可以从这个指针开始 - 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