大数据架构师必懂的5大实时计算技术要点
|
跟产品吵完第三轮实时链路降级方案,我盯着他钉钉头像右下角那个绿色小点发了十八秒呆——其实不是在想方案,是琢磨他上周五凌晨三点给我发的那条“这个指标必须进T+0看板”,后面跟了个笑哭表情。笑哭?我原以为他真觉得这需求合理,结果翻Git记录发现他连Flink的checkpoint配置项都抄错了两行。 灰度开关没推完。不是全量切,就卡在Kafka consumer group重平衡那段——就那种老掉牙的“重启一半节点后group coordinator漂移”的事儿。PM蹲在监控大屏前念叨“延迟不能超两秒”,而大屏右下角第三块图里,一条标着“集群CPU idle%”的蓝线正毫无预兆地抖了一下,像被谁用指甲掐了一把。我没看它,但余光扫到了。咖啡杯上印的公司logo缺了右下角一小块漆,昨天还好好的,今早突然就掉了。 第一个要点:别信所谓“Exactly-Once语义”的PRD描述。Flink的end-to-end exactly-once成立条件比相亲对象提的择偶标准还细:上游得支持事务性写入、下游sink得可回滚、中间所有state backend得对齐、checkpoint interval得小于业务容忍的乱序窗口——漏一环,你上线那天运维半夜打来电话说“数据重复了”,你嘴上应着“马上查”,心里已经默念三遍“这锅归谁”。我敢打包票:上次双十一流量峰,重复计算那批订单,根因是MySQL binlog position提交和Flink checkpoint barrier到达之间的那十七毫秒窗口,不是代码,是MySQL的relay log刷盘策略。但没人提,因为DBA刚换了新人,还在背mysqld.cnf参数。 前端昨天把一个实时告警按钮藏进了二级菜单第三页,路径是「监控中心 > 高级设置 > 实时干预(实验性)」。测试顺手点了三次,触发了三百七十二次调用,全打到我们那个没加熔断的实时反作弊流上。没人报bug,因为指标曲线根本没跳——它太稳了,稳得像个假的。我说不准这是架构健壮还是压根没生效。后来查日志发现,那个接口底层调的是个MockService,返回的永远是{"risk_score": 0.42}。0.42?我也不知道为什么是这个数,但Mock脚本里就这么写的。反正KPI里只认告警触达率,不认真假。
文章配图,仅供参考 第二个要点:Kafka不是消息队列,是实时计算系统的状态缓存池。你当它是MQ用,它就用rebalance教你做人;你当它是WAL日志,它才肯陪你熬过扩容风暴。上周二我们做topic扩分片,没同步停掉Flink任务,只改了subscription。结果Flink taskmanager自己重新assign分区时,把三个已消费offset为127456的partition强行reset成earliest——不是配置错,是Flink版本升级后ConsumerGroupStateStore的restore逻辑变了。谁去倒了杯水?是新来的实习生,水刚倒完,oncall手机震了一下,他顺手捞起来看了眼——不是告警,是食堂订餐通知。他愣了一下,又放回去了。 第三个要点:维表Join不是功能,是定时炸弹。HBase维表缓存TTL设8分钟?那下游每八分钟必有一波毛刺。Redis维表用pipeline批量查?那bulk size超过512就大概率触发连接池阻塞。你说“加个缓存层”?拜托,你缓存命中的时候叫优化,未命中打穿维表那一刻,叫P0故障。我们上个月在生产环境跑的实时用户画像,就因为维表里的一个字段类型从String悄悄变成JSON Object,导致整个流解析器静默抛异常——没报错,就是不吐数据。Log里连warn都没,只有debug日志里一句“field not found: profile_v3.ext_info”。没人开debug日志,直到BI同事问:“今天画像标签怎么全是NULL?” 第四个要点:Watermark不是时间,是妥协的刻度尺。你说event time对齐?好,那你得接受窗口会迟到、会合并、会触发迟到数据丢弃。可一旦你改用processing time……PM会立刻截图你上周周报里写的“全链路event time驱动”发到大群。我原以为能靠调整allowedLateness硬扛,结果发现Flink内部watermark推进和window evictor的trigger check之间有竞态,特别是带session window的场景。这个我说不准是不是Bug,也没力气去Jira上提,因为上周四我们线上出的窗口聚合不全问题,最终定位到是YARN NodeManager GC暂停导致taskmanager心跳超时被杀,然后整个作业重启——但重启过程中watermark倒流了两秒。谁在乎呢?只要明天复盘会PPT第一页写着“稳定性99.98%”就行。 第五个要点:实时和离线不是两套架构,是一场优胜劣汰的淘汰赛。Flink能跑通的逻辑,Spark Structured Streaming未必撑得住;Kafka+Storm组合能扛住的峰值,Pulsar+Flink可能直接OOM。不是技术好坏,是生态咬合度——就像你拿M1芯片Mac装Windows,能跑,但风扇响得像要拆家。前天我帮DBA调参,他非要把Kafka broker的num.network.threads从3调成16,说“多线程肯定快”。我劝不动,他坚持。结果第二天凌晨两点,oncall手机震了一下,我看一眼——Kafka controller频繁切换,ZooKeeper session timeout。后来查出来是他改完参数忘了同步改server.properties里其他关联项。这事之后,我把所有实时组件的配置项清单打印出来贴在显示器边框上,左边印着“别动”,右边印着“动之前先找我”。印得太密,咖啡泼过一次,现在右边那行字有点晕染。 算了,今晚回去再看看能不能把Flink的savepoint机制和K8s liveness probe做个联动探测——至少让pod死得明白点。或者,干脆明早找DBA借个空闲的ZooKeeper集群,搭个临时zk,把controller迁过去试两周。不过得先问问PM,他下个迭代排期里有没有留出“给实时链路换心脏”的工时。没有的话……我先把灰度开关推完再说。 (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


大数据架构师避而不谈的3大代码陷阱
