一. 前言
本文将承接Presto 动态过滤之 动态过滤条件数据的生成_王飞活的博客-CSDN博客 继续通过走读代码来了解在Presto(OpenLookeng)中DynamicFilterService中的动态过滤数据合并功能是如何实现的。
二. 为什么要进行过滤数据合并
因为Build侧的数据可能是在多个worker,多个task执行的。在Presto中,动态过滤只有生成最终的结构后才能apply到connector进行过滤,因此需要等待Build侧的各个task任务都执行完,然后coordaintor进行一个合并的操作将数据聚合成BoolFilter或者HashSet,然后应用到connector。
三. 过滤数据合并流程代码走读
// 只有coordaintor会启动DynamicFilterService
binder.bind(DynamicFilterService.class).in(Scopes.SINGLETON)
filterMergeExecutor.scheduleWithFixedDelay
hasMergeCondition
// 判断是不是所有的worker都已经完成
finishedDynamicFilterNumber == dynamicFiltersToTask.get(xxx).size()
// 如果所有的worker都完成则执行如下的merge操作
mergeDynamicFilters
stateStoreProvider.getStateStore
// 此时获取的results就是Build侧上传的数据
Collection<Object> results = ((StateSet) stateStore.getStateCollection
if (filterDataType == BLOOM_FILTER) {
mergedBloomFilter = mergeBloomFilters
} else {
Set mergedSet = mergeHashSets
}
cachedDynamicFiltersForQuery.put // 至此,动态过滤的条件便完成合并,connector 后续将会从DynamicFilterService中拿到合并完成的过滤条件,完成动态过滤操作
removeFinishedQuery