最近用Maxwell解析MySQL的Binlog,发送到Kafka进行处理,测试的时候发现一个问题,就是Kafka的Offset严重倾斜,三个partition,其中一个的offset已经快200万了,另外两个offset才不到两百。
Kafka数据倾斜的问题一般是由于生产者使用的Partition接口实现类对分区处理的问题,一般是对key做hash之后,对分区数取模。当出现数据倾斜时,小量任务耗时远高于其它任务,从而使得整体耗时过大,未能充分发挥分布式系统的并行计算优势(参考Apache Kafka 0.10 技术内幕:数据倾斜详解)。
而使用Maxwell解析MySQL的Binlog发送到Kafka的时候,生产者是Maxwell,那么数据倾斜的问题明细就是Maxwell引起的了。

Maxwell官网查文档(Producers:kafka-partitioning Maxwell’s Daemon)得知,在Maxwell没有配置的情况下,默认使用数据库名作为计算分区的key,并使用Java默认的hashcode算法进行计算:

  1. A binlog event's partition is determined by the selected hash function and hash string as follows
  2. | HASH_FUNCTION(HASH_STRING) % TOPIC.NUMBER_OF_PARTITIONS
  3. The HASH_FUNCTION is either java's hashCode or murmurhash3. The default HASH_FUNCTION
  4. is hashCode. Murmurhash3 may be set with the kafka_partition_hash option.
  5. …………
  6. The HASH_STRING may be (database, table, primary_key, column). The default HASH_STRING
  7. is the database. The partitioning field can be configured using the
  8. producer_partition_by option.

而在很多业务系统中,不同数据库的活跃度差异是很大的,主体业务的数据库操作频繁,产生的Binlog也就很多,而Maxwell默认使用数据库作为key进行hash,那么显而易见,Binglog的操作经常都被分到同一个分区里面了。

于是我们在Maxwell启动命令中加入对应参数即可,这里我选择了Rowkey作为分区key,同时选用murmurhash3
哈希算法,以获得更好的效率和分布:

nohup /opt/maxwell-1.11.0/bin/maxwell --user='maxwell' --password='***' --host='***'
--exclude_dbs='/^(mysql|maxwell|test)/' --producer=kafka --kafka.bootstrap.servers=***
--kafka_partition_hash=murmur3 --producer_partition_by=primary_key >> /root/maxwell.log &

用此命令重新启动Maxwell之后,观察Offset的变化,隔一段时间之后,各分区Offset的增量基本一致,问题解决!

Reference:

https://leibnizhu.gitlab.io/2018/01/03/%E8%A7%A3%E5%86%B3Maxwell%E5%8F%91%E9%80%81Kafka%E6%B6%88%E6%81%AF%E6%95%B0%E6%8D%AE%E5%80%BE%E6%96%9C%E9%97%AE%E9%A2%98/index.html 转发此文 解决Maxwell发送Kafka消息数据倾斜问题

http://ningg.top/apache-kafka-10-best-practice-tips-data-skew-details/  Apache Kafka 0.10 技术内幕:数据倾斜详解

【转】解决Maxwell发送Kafka消息数据倾斜问题的更多相关文章

  1. 解决spark中遇到的数据倾斜问题

    一. 数据倾斜的现象 多数task执行速度较快,少数task执行时间非常长,或者等待很长时间后提示你内存不足,执行失败. 二. 数据倾斜的原因 常见于各种shuffle操作,例如reduceByKey ...

  2. Hive 数据倾斜原因及解决方法(转)

    在做Shuffle阶段的优化过程中,遇到了数据倾斜的问题,造成了对一些情况下优化效果不明显.主要是因为在Job完成后的所得到的Counters是整个Job的总和,优化是基于这些Counters得出的平 ...

  3. Hive数据倾斜和解决办法

    转自:https://blog.csdn.net/xinzhi8/article/details/71455883 操作: 关键词 情形      后果 Join 其中一个表较小,但是key集中   ...

  4. Hadoop_22_MapReduce map端join实现方式解决数据倾斜(DistributedCache)

    1.Map端Join解决数据倾斜   1.Mapreduce中会将map输出的kv对,按照相同key分组(调用getPartition),然后分发给不同的reducetask 2.Map输出结果的时候 ...

  5. Kafka消息队列初识

    一.Kafka简介 1.1 什么是kafka kafka是一个分布式.高吞吐量.高扩展性的消息队列系统.kafka最初是由Linkedin公司开发的,后来在2010年贡献给了Apache基金会,成为了 ...

  6. uniapp 微信发送订阅消息

    这篇主要针对小程序进行演示,既然是发送消息,那么就有三个问题.发送什么内容,给谁发送,怎么发送!往下一条一条解决. 发送什么消息内容 - 通过微信公众号平台 选择对应的消息模板 选择以后在我的模板里面 ...

  7. hive大数据倾斜总结

    在做Shuffle阶段的优化过程中,遇到了数据倾斜的问题,造成了对一些情况下优化效果不明显.主要是因为在Job完成后的所得到的 Counters是整个Job的总和,优化是基于这些Counters得出的 ...

  8. Hive 大数据倾斜总结

    在做Shuffle阶段的优化过程中,遇 到了数据倾斜的问题,造成了对一些情况下优化效果不明显.主要是因为在Job完成后的所得到的Counters是整个Job的总和,优化是基于这些 Counters得出 ...

  9. Hive学习之路 (十九)Hive的数据倾斜

    1.什么是数据倾斜? 由于数据分布不均匀,造成数据大量的集中到一点,造成数据热点 2.Hadoop 框架的特性 A.不怕数据大,怕数据倾斜 B.Jobs 数比较多的作业运行效率相对比较低,如子查询比较 ...

随机推荐

  1. 第23章 Spring MVC初体验

    23.1 鸟瞰Spring MVC 粗略的介绍了SpringMVC的主要组成部分,SpringMVC作为一个Web层的框架,最大的作用是把我从繁重的web.xml文件编写中解救出来,再也不要不停的添加 ...

  2. 【js】JS实现的base64加密、md5加密及sha1加密详解

    参考链接 http://www.jb51.net/article/82831.htm

  3. remix的使用

    remix首先,这个东西其实是有一个线上版本的,只要登录上网址:https://remix.ethereum.org就可以直接使用了,但是我更多用的是本地配置的remix-ideremix-ide的文 ...

  4. IndentationError 这个错误是缩进的问题

    1.自定义库导入时,提示这个错误,是缩进的问题

  5. c++中vector类的用法

    概括:向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence Container).跟任意其它类型容器一样,它能够存放各种类型的对象.可以简单的认为,向量是一个能够存放任意类型的动态 ...

  6. Unity热更新学习(一) —— AssetBundle 打包和加载

    理论不多说,网上,官方文档都有.  这里有一篇介绍很全面的文章:https://www.cnblogs.com/ybgame/p/3973177.html 示例和注意点记录一下,用到时以便查阅. 一. ...

  7. BZOJ3601 一个人的数论 莫比乌斯反演、高斯消元/拉格朗日插值

    传送门 题面图片真是大到离谱-- 题目要求的是 \(\begin{align*}\sum\limits_{i=1}^N i^d[gcd(i,n) == 1] &= \sum\limits_{i ...

  8. 【redis】1.redis-windows安装+配置介绍

    1.下载windows版本redis 官方下载地址:http://redis.io/download,不过官方没有64位的Windows下的可执行程序,目前有个开源的托管在github上, 地址:ht ...

  9. nodejs简单模仿web.net web api

    最近用了asp.net web api + EF开发一个项目,但是移植到linux时遇到问题(mono只支持EF6.0,但是mysql驱动不支持EF6.0).所以决定换个思路,用nodejs实现res ...

  10. 快速为git添加一个用户

    环境:用gitosis-admin管理git的权限. 前期git环境的搭建略去,主要给出快速添加一个用户的步骤: 在git bash中用“ssh-keygen -t rsa”生成公钥私钥,默认放到 “ ...