数仓开发那些事(6)

作为一名在年前找实习生工作的22年应届生,今天的我被鸽子了.

数仓开发那些事(6)

注意我的用词,我用的是"又",只不过这次的更狠心,约了今天上午线上面试,一点通知没有,白等了一个上午,其实我很不喜欢线上面试,主要是它会影响我和面试官吹牛.

实习生的面试,其实没有什么太多技术上的问题,就是问你有没有兴趣去学,去接触他们公司的业务,只要你老老实实回答问题,表现出一些掌握的专业技术,其实是没有多大问题的(4.5k还想招到啥大牛)

就在我绝望的时候,接到了杭州一家公司的面试通知,明天下午三点.感觉好多了

数仓开发那些事(6)

还记得那位不愿透露姓名的神州集团实习生问过我一些问题.今天来分享一下.

日志数据为什么要用到flume+kafka+flume+hdfs的架构,直接flume+hdfs不行吗?

可以,但是flume常常挂掉.kafka在这套采集架构中主要起到削峰作用.但是在实时中Kafka的作用会更重要一点,毕竟在实时项目中我们是强依赖于消息队列的.

你们公司虽然采集是一套架构,但是离线和实时,一套指标,两套代码,两个引擎来跑,维护和开发的成本不高吗,组件又怎么选?

总体上来说用的是lambda架构,所以维护和开发的成本不低.而且因为是两套引擎,在某个时间点的数据一致性也不会很好.这些都是架构上的问题,很显然不是我一个实习生能解决的(水平摆在这,什么水平做什么事)
对于Kappa了解一些,可以说这个架构是面向消息队列开发.在整个的链路当中,是没法直接通过OLAP引擎分析MQ的数据的.别的MQ我不了解,但是对于Kafka,这玩意是分区间乱序的,并且随着数据流动,只会越来越乱,所以很多时候思考量不能少.
采集使用同一套已经是尽力的节省成本了

对于离线数仓,基本就是Hive,没有啥好说的

对于实时数仓:因为强依赖于消息队列,但是本身又不能做OLAP,所以涉及到的第三方框架会很多
先说ODS层,用的是Kafka,参考的是阿里云的数仓解决方案,但是里头用的是DataHub,这玩意收钱,暂时pass,等咱公司从1到N的时候如果涉及到框架升级再考虑吧.
下面就是DWD和DIM
DWD,直接扔在Kafka里就行了,大部分只要消费一次就行了
对于DIM,首先明确需求,我们需要用id字段,查询到维度表的单条数据,与事实进行关联.明确了需求,就开始选型了,简单列举几个常用的:
Redis.Hbase.Kafka.Mysql.ClickHouse.ES,然后一个个去分析
Redis.不合适,因为用户维度是一个大维度,Redis的存储量堪忧
Hbase.好像还行,先暂放
Kafka.文件有保存时效,但是很明显我们的维度信息是需要持久保存的
Mysql.可以直接把查询打到mysql上,就不用对dim层进行一个设计,但是后端的人不会同意你这么干,因为会导致Mysql压力陡增,就算公司中用到的是主从Mysql,但是据我所知很多公司都会选择从库延迟一段时间再更新,为了防止主库的误操作.所以从库的数据不能保证实时准确性.
ClickHouse.经典的列式存储引擎,对比我们的需求,列式存储并不合适,因为我们是需要读出一条维度数据进行关联.
最后好像就只剩下Hbase了,Hbase可以通过对列族和列的设置实现类似于行存列存的机制,比如每个列族里只放一个列,就相当于列存,如果所有列都放在一个列族里,就相当于行存.最后就敲定用Hbase来存放维度数据,但是很明显它的访问效率是不行的,所以就用Redis做缓存,结合异步IO,这个在之前也提到了,就不细讲了
中间DWM层,主要存放一些经过处理的中间数据,增加复用性,还是放在Kafka
DWS层,对于每个窗口求得的指标,是需要分主题分字段累加的,或者是求平均值,或者是其他的操作,可以想到的就是ClickHouse,列存的数据库对这些操作的相应是很快的,这里就没必要用到Hbase了,因为ClickHouse也有ReplacingMergeTree来提供去重
ADS层就是一个前端的展示了,就不多说了

数仓开发那些事(6)

你遇到过最难的Sql?

其实就是我经常说的一句话,很少有代码实现不了的需求,真正麻烦的是晦涩的业务.就比如说实习生出去找工作吧,技术上磕磕绊绊,业务上还一问三不知,其实这就是一个痛点.
如果真的要说一个很困难的Sql....其实力扣里的困难题很多都比生产环境中的难,实话实说的(但是我现在力扣会员过期了,不然怎么的也给你们占个链接)
也有可能老员工没把难的需求给我???!!!!
怪不得他们给我单独创了个任务提交队列(15%的资源)....

数仓开发那些事(6)

你经常提到几种事实表,有什么区别?

事务型事实表--一旦插入不会有变化的事实,比如说评论.订单明细
周期型快照事实表--不关心变化过程,只关心某个特定时间点的结果,比如收藏.架构
累计型快照事实表--一条记录中的数据会不断更新,比如订单表的下单时间.支付时间.到货时间.确认收货时间中的某几列可能在某个时间点还不能完全确定

使用Flink中遇到过什么难题?

最后一个窗口关不上.其实这根本不算一个问题,因为只在后续没有数据进来的情况下,才有可能关不上窗口(用的是事件时间).但是有一次老员工问我这个问题,说老实话根本没有想过.最后想了半天,还是面向百度.抄了个自定义的WaterMark策略,解决了这个问题

上一篇:HBase ImportTSV工具使用


下一篇:06