某不愿意透露姓名的神州实习生:一闪,我也想去搭数仓,我觉得我的水平应该能加2k
我:憋baba.你知道窗口函数咋写吗
Flume-tailDir Source
在离线数仓的采集流程中,我们使用Flume来对落盘的行为日志文件进行采集,但是会发现一个问题,就是每天的数据都会完完整整的重复一遍.简单的lou一眼,并没有发现问题.监控目录也没写错,这是啥情况
某不知名的老程序员:小伙子你这就不懂了吧,先来问问你TailDir Source的监控有啥作用?
我:当然是断点续传和多目录啊
老程序员:Ok,那断点续传的位置是怎么保存的
我:(这你还想难到我?)一个KV结构 K是inode(Linux文件唯一标识)拼接上绝对路径 V是position
老程序员:那你知不知道后端用的日志框架是啥?
我:(???)我猜是log4j
老程序员:那你知道log4j的日志文件每天会滚动一次吗
我:(-_-!)当然,比如说server.log就是当天的,到了第二天就会把它更名为server.log-2021-12-08 慢!
照这么说是不是绝对路径变了导致tailDir Source觉得它是一个新文件,然后就从头重新读了一遍?
老程序员:小伙子还可以
我:多谢多谢.我这就让后端把日志框架改了.
老程序员:(笑笑)
我:(鼻青脸肿的回来了)他们说我脑子有包,让我自己想办法
老程序员:不要急,我这里正好有一个我修改过源码的jar包,拿去用吧,里面把绝对路径这个判断条件给去掉了,所以只会判断inode,就不会导致重复了.
叮.下载成功.谢谢大佬
Kafka—ack设置为-1
老程序员:你觉得ack = -1就能精准一次了吗
我:可不咋地
老程序员:那ack = -1的概念是什么
我:就是等待leader和全部follower的ack到齐才继续发送
老程序员:你再想想?从同步队列的角度
我:哦哦哦,是等待ISR中全部的ack到齐.
老程序员:所以我来描述这样一个场景,假如是三个副本,两个follower因为同步的比较慢,但是没挂,因为超过了延迟时间,被踢出ISR了,现在ISR中只剩下一个leader.知道接下来会发生什么吗
我:这样的话,ISR中只有leader,不就是ack=1吗,leader收到了数据就会返回ack....这时候如果leader挂掉,那么数据就丢失了!(但是这个情况也太极端了吧,但是确实能记录一下,要是以后跳槽被问到呢)
老程序员:小伙子还可以,世界观被刷新了没
我:我还行..
Kafka的过期策略
老程序员:那我再问你,Kafka默认是7天过期,我使用了delete策略,那假设我们的程序一直在跑.没有出现过问题,那我有没有可能消费到7天前的数据?
我:(可恶,这么问的话肯定可以消费到,但是我不知道为什么啊)一二三四五..上山打老虎…
老程序员:提醒你一下log的存储形式
我:不就是以segement的形式吗.1G一个文件…哦哦哦因为它是一个文件全部超出7天才会删除,所以对跨天的log文件,就有可能会消费到7天前的数据了.
老程序员:理解能力还行(装逼成功,美滋滋)
Order By
老程序员:小伙子,又在写bug啦?HQL里面用order by,你想提桶跑路吗?
我:这不是还没写完吗,我加个limit就可以了,Hive的优化器也不是吃素的
老程序员:(哟,被他装到了)你之前也在实时组干过,你知道Spark中的Order By是可以起多个Task的吗?
我:(有这事?全局无序的order by用多个Task,怎么能保证排序结果呢.我师傅也没告诉我啊....)
老程序员:提醒你一下,这个和分区器有关(不能让他没面子)
我:好像是Ranger Partitioner范围分区器...噢噢噢噢这相当于他们是分区间和分区内有序的,到时候只要根据分区顺序拼接起来就行了.好像用的还是叫水滴抽样
老程序员:(怎么还学会抢答了?)