carbondata多线程执行单表segment合并时并发相关的问题?

功能

每天晚上对单表前一天的segment进行定制化合并.

现有逻辑:

1.使用apache.caacite.avatica.remote.Driver获取connection。

2.获取对应表所有segment,定制化分组

3.sql形式执行merge segments(compact)

瓶颈:

1.近期发现该功能每次执行时长过长,需要优化。

2.本人对carbondata的了解不深,网上对这一块的描述有很少。

 

暂时的思路:

多线程执行合并操作。

 

问题:

1. 单表的并发,官网描述很少,只是说明了一个参数指定local_lock还是hdfs_lock(global)。对于我这种只操作segment的操作是锁全表,还是锁对应的需要合并的segments?

2. 一旦使用并发,就要考虑connection的获取甚至重用。carbonData对于这种jdbc的connection数量有限制吗?或者可以参考那个配置参数吗?

3. 这种任务的提交会被yarn调度吗?需要考虑任务提交的数量吗?考虑的话这个临界值需要参考什么?

感谢您的提问。针对您的问题,我的回答如下:

  1. 在单表并发的情况下,CarbonData会锁定需要合并的segments,而不是锁定整张表。您可以在CarbonData的配置文件中,通过配置carbon.lock.type参数来指定锁类型,如果设置为local_lock表示使用本地锁机制,如果设置为hdfs_lock则表示使用全局锁机制。

  2. CarbonData对于jdbc的connection数量没有限制,但是您需要考虑到并发的场景下,connection的获取和重用问题,可以使用连接池机制来管理连接。您可以通过配置carbon.pool.size参数来控制连接池的大小。

  3. 任务提交是否会被yarn调度,需要您的具体情况来确定。如果您的任务量较大,可以考虑使用yarn来管理任务,通过配置yarn.scheduler.minimum-allocation-mbyarn.scheduler.maximum-allocation-mb参数来控制任务的内存分配。临界值需要根据您的应用场景和硬件资源来确定。

希望我的回答对您有所帮助,如有任何疑问,请随时追问。