【转】解决Maxwell发送Kafka消息数据倾斜问题
最近用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算法进行计算:
A binlog event's partition is determined by the selected hash function and hash string as follows
| HASH_FUNCTION(HASH_STRING) % TOPIC.NUMBER_OF_PARTITIONS
The HASH_FUNCTION is either java's hashCode or murmurhash3. The default HASH_FUNCTION
is hashCode. Murmurhash3 may be set with the kafka_partition_hash option.
…………
The HASH_STRING may be (database, table, primary_key, column). The default HASH_STRING
is the database. The partitioning field can be configured using the
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消息数据倾斜问题的更多相关文章
- 解决spark中遇到的数据倾斜问题
一. 数据倾斜的现象 多数task执行速度较快,少数task执行时间非常长,或者等待很长时间后提示你内存不足,执行失败. 二. 数据倾斜的原因 常见于各种shuffle操作,例如reduceByKey ...
- Hive 数据倾斜原因及解决方法(转)
在做Shuffle阶段的优化过程中,遇到了数据倾斜的问题,造成了对一些情况下优化效果不明显.主要是因为在Job完成后的所得到的Counters是整个Job的总和,优化是基于这些Counters得出的平 ...
- Hive数据倾斜和解决办法
转自:https://blog.csdn.net/xinzhi8/article/details/71455883 操作: 关键词 情形 后果 Join 其中一个表较小,但是key集中 ...
- Hadoop_22_MapReduce map端join实现方式解决数据倾斜(DistributedCache)
1.Map端Join解决数据倾斜 1.Mapreduce中会将map输出的kv对,按照相同key分组(调用getPartition),然后分发给不同的reducetask 2.Map输出结果的时候 ...
- Kafka消息队列初识
一.Kafka简介 1.1 什么是kafka kafka是一个分布式.高吞吐量.高扩展性的消息队列系统.kafka最初是由Linkedin公司开发的,后来在2010年贡献给了Apache基金会,成为了 ...
- uniapp 微信发送订阅消息
这篇主要针对小程序进行演示,既然是发送消息,那么就有三个问题.发送什么内容,给谁发送,怎么发送!往下一条一条解决. 发送什么消息内容 - 通过微信公众号平台 选择对应的消息模板 选择以后在我的模板里面 ...
- hive大数据倾斜总结
在做Shuffle阶段的优化过程中,遇到了数据倾斜的问题,造成了对一些情况下优化效果不明显.主要是因为在Job完成后的所得到的 Counters是整个Job的总和,优化是基于这些Counters得出的 ...
- Hive 大数据倾斜总结
在做Shuffle阶段的优化过程中,遇 到了数据倾斜的问题,造成了对一些情况下优化效果不明显.主要是因为在Job完成后的所得到的Counters是整个Job的总和,优化是基于这些 Counters得出 ...
- Hive学习之路 (十九)Hive的数据倾斜
1.什么是数据倾斜? 由于数据分布不均匀,造成数据大量的集中到一点,造成数据热点 2.Hadoop 框架的特性 A.不怕数据大,怕数据倾斜 B.Jobs 数比较多的作业运行效率相对比较低,如子查询比较 ...
随机推荐
- iptables 设置端口转发/映射
iptables 设置端口转发/映射 服务器A有两个网卡 内网ip:192.168.1.3 外网ip:10.138.108.103 本地回环:127.0.0.1 服务器B有网卡,8001提供服务 内网 ...
- Quartz动态添加定时任务执行sql(服务启动添加+手动添加)
系统用来每天插入视图数据... 一.数据库表设计 1.接口配置表(t_m_db_interface_config) 2.接口日志表(t_m_db_interface_log) 3.前端配置页面 查询页 ...
- ubuntu1604配置ss代理
1 安装ss 参考http://www.cnblogs.com/mdzz/p/10140066.html sudo apt install python3-pip sudo pip3 install ...
- Redo丢失的4种情况及处理方法
这篇文章重点讨论Redo丢失的几种情况,及每种情况的处理方法. 一.说明:1.以下所说的当前日志指日志状态为CURRENT,ACTIVE,非当前日志指日志状态为INACTIVE2.不用考虑归档和非归档 ...
- 学习! ! ! Study! ! !
我们是年轻人,钱不重要,前途才重要,干嘛着急挣钱啊. 学习!!! study!!!
- day92之支付宝支付
Python之支付宝支付 正式环境:用营业执照,申请商户号,appid 基于支付宝的测试环境:https://openhome.alipay.com/platform/appDaily.htm?tab ...
- 实战Asp.Net Core:DI生命周期
title: 实战Asp.Net Core:DI生命周期 date: 2018-11-30 21:54:52 --- 1.前言 Asp.Net Core 默认支持 DI(依赖注入) 软件设计模式,那使 ...
- .Net外包篇:我是如何看待外包的
前言 从工作至今,我在工作之余大大小小接了六次外包,不多不少,虽然没有为我带来很大收益,但也让我开拓了人脉,接触了不少知识,锻炼了全栈开发能力. 菜鸟时代 第一家客户(成功) 我接的第一个外包是为一家 ...
- python--__init__()方法和__new__()方法
这两个方法是python类中的基本方法,经常会在一些面试中问到.即便没有要面试之类的,学习一下其内部的原理和使用也是有必要的. 首先区分一下这两个方法: __init__:初始化方法 __new__: ...
- adb命令集合
1. 获取序列号: adb get-serialno 2. 查看连接计算机的设备: adb devices 3. 重启机器: adb reboot 4. 重启到bootloader,即刷机模式: ad ...