大数据架构师必懂的5大实时计算技术要点
|
去年暑假,我蹲在IDC三号机房听kafka consumer lag报警响了十七次——不是那种滴一声就完事的,是带混响的,像老式电梯开门前那声“叮——呜——”,每次我都以为是隔壁组又把checkpoint路径写错了。结果发现是Flink SQL里一个over window没加parallelism hint,水位线漂移两秒,下游所有实时UV都虚高。当时老何正蹲在机柜缝里用热风枪吹一个焊锡点,衬衫第三颗扣子绷开了,他抬头说:“你这流批一体,批倒是挺体,流嘛……”后面半句被空调外机启动的轰鸣吞了。
文章配图,仅供参考 五大要点?哈。我原以为只要能把Flink作业压进128GB容器、让State TTL扛住七十二小时重放、把Kafka分区数和并行度对齐,再搞个带version vector的CDC schema registry,就稳了。结果上季度末,运营半夜拉我开电话会,说裂变活动看板UV比埋点上报多出三百七十二,而那个“多出来的”,全是凌晨三点注册的手机号带六个零的羊毛党——但日志里查不到他们触发event time watermark的动作。查到⭐️⭐️⭐️⭐️是Kudu connector读取时默认用了local time,而机器时钟同步服务那周被运维手动停过——就停了十八秒。这个我敢打包票,因为那天我盯着NTP日志看了四十分钟,中间外卖盒盖没掀开,冷油浮在表面,像一层薄薄的沥青。所以你看,什么叫“优胜劣汰”?不是谁模型新、谁吞吐高、谁SQL支持窗口函数就活下来。是那个在凌晨三点三十七分,能一眼认出watermark卡在17:03:59.999而不是17:04:00.000的人活下来;是那个知道当Flink job重启时,如果RocksDB local state没清理干净,哪怕只残留三十七个key,就会让第二天的同比环比全错的人活下来;是那个在AB实验分流桶里发现redis pipeline返回了空数组却不报错,只是默默填了个默认值,导致对照组流量实际漏进实验组的人活下来。可没人教这个。培训材料还在讲Exactly-once语义怎么实现,没人提生产里八成失败是因为taskmanager内存配置刚好处在GC临界点,JVM参数调得再准,碰上宿主机OOM killer半夜抽风,照样滚雪球。上个月我们组小张在grafana里画了个“watermark延迟分布直方图”,好看得很,柱状图尖得像钉子——后来发现那只是因为metrics reporter batch flush被他设成了30秒,而Flink自己的watermark生成是每200毫秒一次。他说:“哎呀,反正P99不飘就行。” 对了,那天机房停电前五分钟,保洁阿姨推着拖把经过我们工位,她左脚拖鞋带断了,一边走一边低头把带子绕手指上打了个死结,绕了四圈,还舔了下舌尖。她没看我们,但手里的拖把杆碰歪了我桌上那支红笔,滚到键盘缝隙里去了。我就一直没捡。现在它还在那儿。 其实最荒唐的是口径问题。两个部门同一指标差一倍?呵,那是幸福的。我们去年双十一,增长中台和BI团队对着同一张Doris表跑同样的SQL,一个跑出来DAU涨12%,另一个跑出来跌3%——就因为前者JOIN order用了broadcast,后者没关broadcast hint,join key里有null,Null-aware hash join和普通hash join对null的处理逻辑根本不同。查到这儿,DBA老李直接合上笔记本,掏出一包瓜子开始嗑,边嗑边说:“我去年修过三次MySQL binlog格式化bug,这次?不修了,你们改SQL。”他嗑瓜子的声音很脆,第二颗壳崩到我左手边第三格键盘帽上,弹了一下,掉进缝隙里,和那支红笔作伴去了。 所以说“必懂”?懂了也白搭。你懂了Watermark、懂了Chandy-Lamport、懂了Log-structured Merge Tree底层compaction触发时机,可当运维把Flink的restart-strategy配成fixed-delay但max-attempts设为1,而你的job恰好卡在checkpoint写一半时网络抖动——这时候“懂”有什么用?不如懂怎么写一段shell脚本,监控taskmanager.log里连续出现三行“Failed to trigger checkpoint”就自动curl告警接口。我试过。但那个脚本跑了三天后,自己因为磁盘满了挂了。没人告诉我/proc/sys/fs/inotify/max_user_watches默认值会被Flink的watchService干爆。 哦,刚才老何接了个电话,说他女儿奥数班老师打电话问为什么孩子总把“概率”写成“概率×100%”,他答:“可能因为班上只有她一人学过实时计算里的latency distribution?”老师没笑。我也没笑。空调外机又响了,这次是单音,短促,像一声叹气。 下回我要试试在Kafka consumer端加个自定义partition assignor,把热点partition强制绑到低负载TM上——当然,前提是得先说服运维别再偷偷给YARN队列加resource limits。我现在就想翻出那支红笔,在纸上画个圆,不标圆心,也不写半径。就画。画完就算。 (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


大数据架构师亲授:建站三年服务器优化五大关键点
运营中心大数据架构:毫秒级交互响应之道
大数据架构师避而不谈的3个致命代码陷阱

