Flink 使用 murmurhash3 做KeySelector

本文介绍了在Flink中使用MurmurHash3作为KeySelector来提升性能的原因和优势。针对报文排重需求,通过对比MD5和MurmurHash3的性能,展示MurmurHash3在处理不定长报文时的高效性。文中提供了测试源码,并讨论了Key长度对Redis性能的影响。同时推荐了相关Flink资源和最佳实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

由于项目中有报文排重需求,所以会将报文字符串作为分布式锁key。
考虑到报文不定长并且散列性不太好,如其作为锁key,特别是当key值过大时,使用redis进行读写都会有相对的性能下降。

  1. 参考文献里测试对比:

  2. 长度为10:写平均耗时0.053ms,读0.040ms

  3. 长度为20000:写平均耗时0.352ms,读0.084ms

一种简单的方案是对报文进行一次md5,然后拿来做key。
考虑到md5的性能并不高,找到了更合适的murmurhash3非加密哈希算法:

Screen Shot 2018-09-10 at 5.46.22 PM.png

算法图例

murmurhash_diagram.png

(可以看到里面有c1, c2, n 三个很特别的常量,据算法作者Austin Appleby讲,都是他血汗地用大量测试数据调测出来的,为了不被其他好事之徒当头一暴击,他保留继续微调的权利。)

参考文档里都说murmurhash3棒棒的,但是不实践下还是不能随意拿来进献给Boss, 我找了一个代码,做了一个性能对比,测试使用了Google的guava里的Hashing.murmur3_32(),对比apache的commons-lang3的md5Hex算法。

测试源码

public class HashTest {
 
    public static String md5Test(String primaryKey) {
        return DigestUtils.md5Hex(primaryKey).substring(0, 4) + "_" + primaryKey;
    }
 
    public static String murmur3Test(String primaryKey) {
        return Hashing.mur
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值