BloomFilter在Hudi中的应用 (3)

HoodieKeyLookupHandle#getLookupResult方法核心代码如下

public KeyLookupResult getLookupResult() { ... HoodieDataFile dataFile = getLatestDataFile(); List<String> matchingKeys = checkCandidatesAgainstFile(hoodieTable.getHadoopConf(), candidateRecordKeys, new Path(dataFile.getPath())); ... return new KeyLookupResult(partitionPathFilePair.getRight(), partitionPathFilePair.getLeft(), dataFile.getCommitTime(), matchingKeys); }

该方法首先获取指定分区下的最新数据文件,然后判断数据文件存在哪些recordKey,并将其封装进KeyLookupResult后返回。其中#checkCandidatesAgainstFile会读取文件中所有的recordKey,判断是否存在于candidateRecordKeys,这便完成了进一步确认。

到这里即完成了record存在于哪些文件的所有查找,查找完后会进行进一步处理,后续再给出分析。

总结

Hudi引入Bloom Filter是为了加速upsert过程,并将其存入parquet数据文件中的Footer中,在读取文件时会从Footer中读取该BloomFilter。在利用Bloom Filter来判断记录是否存在时,会采用二次确认的方式规避Bloom Filter的误判问题。

欢迎关注ApacheHudi

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zgydpg.html