大数据开发,不知道叫什么帖
前天刚签完三方,秋招也算正式结束了,我找的是大数据开发岗位(偏平台开发/框架开发,非数仓(数仓理论不会)),秋招投了:阿里、腾讯、字节、快手、华为,拿了字节、快手、华为的offer。一路过来受到很多人的帮助,所以也想写一贴(算是分享贴?)分享下之前自己的学习途径。如果对读者有帮助,那太好了哈哈哈哈哈,很开心。如果有错,欢迎批评指正!帖子分两部分吧:个人学习经历和框架学习建议(感觉也不算建议,大家互相探讨就行)
面经相关:
牛客上在大数据方面其实大佬很多很多,之前我也是看了他们的面经贴学了很多,在这列举下哈哈哈哈哈哈(一定不全,欢迎补充): reswqa, InstantCWeed, 优秀的张先生, Commando201804,啊猩猩星星(牛客指导老师,感觉如果是大数据开发,可以以该老师为目标(3年P7 XDDD)https://www.nowcoder.com/discuss/607015), Offer快来吧please(大佬,非科班转码,希望大佬有时间发个帖子), BowenXiao(如果也是知乎上的id,那这人是个巨佬!!!) , 星河弱水,机智多(算是我Flink的引路人,哈哈哈哈哈哈哈), 胡胡达 (大佬,很多面经),superpen, MarshalJS , 林子啦啦啦, 魔力鸟flying,Chihyung (巨巨巨佬,校招时就已经是Spark的contributor了),TD2022(大数据引路人,哈哈哈哈哈哈),kumo_ 还有好多好多。。。
ps 本科很水,试了计算机中很多很多方向,基本简历是一穷二白。最后一年也是随大流,咬咬牙靠运气上了985硕(用哥哥和阿sam的《沉默是金》中一句话形容" 受了教训 得了书经的指引 ... 不再像以往那般笨"), 所以研一入学我拼命地想学技术。然后导师给了个CV项目,当时我想的是以后要做CV算法工程师!!! 但是学长找工作的艰难和我偷偷去面试商汤实习的失败,以及当时看了很多深度学习相关的数学推导(告辞),我直接放弃了,太难了。。。 然后偶然遇到talkdata(b站上up,我还买了他两本笔记XDDDD非广告)的视频,发现居然还有大数据这个方向,当时是想选后端,但是想了想,别人如果也算法劝退,那么估计都会去走后端,那我这之后加上不能实习不得被卷死?所以走了大数据
我的大数据学习路线:
首先你得会Java(一定要会!!!),这部分主要就是Java语法,集合,并发,JVM(基本就是八股文水平,这几块大家可以看其他人怎么学的,然后对照比如JavaGuide、Java3y八股文,理解性记忆 一定要形成自己一套东西,这样你面试时候才能扯!!!!!!!!!),比如举个例子:
JVM中GC?
这块首先你得明确什么是垃圾?两种判断方式的优缺点:计数法,不止循环引用的缺点!,然后可达性分析,具体三色标记法的实现,并发标记情况下三色标记法的问题,然后多标、漏标带来的问题,如何解决,不同的解决的思路就对应着后面的CMS和G1.... (可能有错,我已经很久没看八股文了 orz)这些就是需要自己去理解才能串起来,这样你嘴巴才能像机枪,哒哒哒哒哒哒哒哒
这种串起来的方法也适用于后面大数据组件的学习!!!
------------------------学完Java八股文后,这里就是大数据和后端的分水岭:如果走后端,那就SSM一套(当然可能会学redis、kafka、mysql),如果走大数据,那就开始学习大数据组件---------------------------
我的大数据组件学习顺序:
- mysql(会sql,leetcode上sql 2020.2月前的题基本都刷完了,会八股文)
- redis(看了,后面一直没复习,就没用了,简历也没写)
- hive(看了,后面一直没复习,就没用了,简历也没写)
- hadoop(MR: 原先看了源码,没什么卵用,直接说自己会Spark源码,Yarn:八股文水平,但是注意cgroup和namespace机制,HDFS:八股文水平(美团两篇文章+https://www.imbajin.com/tags/hdfs/ 够够的了!))
- spark(core 源码层面)
- flink(datastream源码层面)
- kafka(基本原理+高级特性(事务、时间轮)+一点点的源码)
- hbase (基本原理+基本特性(二级索引)+一点点源码)
- zk(基本原理+基本操作+zab协议)
- paxos/raft/zab(看知乎上朱一聪 paxos 整整看了两天的水平,看哭了。。。不推荐面试说paxos,反而说raft更好,推荐知乎丁凯+原论文)
框架学习建议:
- mysql: 这个我不太行,我就是看完《Mysql必知必会》后刷了好久的sql(其实到面试时,因为自己一直没复习sql,所以还是说sql不太会,各位一定要注意复习啊啊啊!),然后底层的存储引擎基本不怎么了解,事务、锁这些八股文一定要像前面那样,串起来
- redis:talkdata说要学,我感觉随便吧,我这种情况基本算是没学
- hive:走数仓的同学一定要学。对于有时间的同学,可以稍微了解下底层sql到具体mr任务的实现(快手三面问到了)
- hadoop:我看了《Hadoop权威指南》(这本书一定不能从头看到尾,里面有很多过时东西,按照上面几个组件挑着看就行),hadoop其实就三块,MR(这块的源码,如果你会Spark源码,那直接跳过这部分,如果你是走数仓那条,那MR源码这块最好要会,毕竟之后数据倾斜一些原理其实从源码上就能看出来什么原因了,我看很多面试官会纠结内存中环形缓冲区怎么实现,具体可以看看),Yarn这块就是调度器的调度机制,以及稍微深一点的cgroup、namespace( 内存隔离、CPU隔离),HDFS就按照上面资料,重点可以关注:NN、DN结构,作用,读写过程(能说到API最好),读写容错,HA,联邦这些
- spark:首先可以看看尚视频(很粗浅的,尽量倍数)有个大概印象,然后看《大数据处理框架Apache Spark设计与实现》(为数不多需要全部看完的书)《Spark技术内幕》(部分), 基本上看完这两本就会在原有的视频基础上有个拔高(这时候可以跟着刷刷spark一些经典题),至于SparkSQL(如果有时间可以学学,推荐《 Spark SQL内核剖析》),之后就到源码层面的了,此时就需要《Spark内核设计的艺术》很厚很厚的书,大概800多页,不是全看(注意前面的书,一定不要全看。。。还是那句话挑重点,重点哪里来?面经里来,面经哪里来?牛客里来... ),Spark源码可以关注几个部分:RDD的五大特性、宽窄依赖的实现(reducebykey一定会产生shuffle???什么情况不会产生shuffle?), SparkContext(也就是Driver, TaskScheduler、DAGScheduler、SchedulerBackend各个职责), shuffle过程(三种shuffle write+一种shuffle read,其实三种write中主要还是BypassMergeSortShuffleWriter+SortShuffleWriter, 剩下那个UnsafeShuffleWriter,要看你spark内存管理掌握如何了,如果可以那就说,如果不可以就不说,面试可不能玩火,言多必失拉低面试官好感),blockManager,Broadcast变量实现,checkpoint实现,Spark内存管理( 说实话,这部分我也不太熟,我也只了解到每个Executor进程有个MemoryManager,其内部包含MemoryManager,包含:四个memoryPool,两个MemoryAllocator 各自作用。。。)最后就是在这些源码基础上的一些引申题了,比如RDD为什么不可变啊,Spark频繁GC什么问题啊,最后学完Spark一定要问自己一个问题,为什么Spark能够处理TB、PB级别的数据而不会发生溢出?ans:分区、流水线、迭代器模式三个方面去考虑,这样整个数据在框架中怎么流动就基本掌握清楚了
- flink:插曲:原先面的flink-runtime团队,很可惜,马哥把我挂了,这也直接把我之后方向也改变了,orz 变数太大了。 flink这块的资料,首推b站上flink官方视频,看完基础部分后看committer崔星灿翻译的《基于Apache Flink的流处理》,还是不用看完,看到连接器哪章就差不多了。然后可以做一做https://github.com/ververica/flink-training-exercises 里面的练习。之后如果感兴趣就可以开始阅读源码了。推荐几个flink源码资料:https://blog.jrwang.me/tags/flink/(*) 、http://www.whitewood.me/ 、http://wuchong.me/、 flink官方文章、 https://www.jianshu.com/u/49e6a4e2bf69(如果挂了百度搜索littlemagic)公众号推荐:大数据渣渣瑞、zhisheng, 章鱼沉思录。 源码这块的话我看了很多,我也不知道哪些是重点哪些不是重点,基本上就是按照 * 的过程去看的。首先你得知道基本原理,然后对照着 * 的内容一步步下来,第一次看完后,你绝逼会看很细很细,然后你需要看第二次,这时候你要做抽象,做总结,比如你只要关注某个类,某个类中的成员变量,以及一些重要的方法,像我这样:
最后第三遍整张A4纸,假装你要说给别人听,然后在A4纸上疯狂地说,疯狂的画就行,然后面试遇到面试官就可以哒哒哒哒哒哒哒哒,对于flink中一些论文可以去读读,像C_L、ABS算法还是很巧妙的,之后有些特性就是要完善这些算法的缺点,有时间可以阅读试试,还是能让你变得会扯
之后flink这块的话可以结合源码,然后比如尝试分析出现反压可以怎么去分析,通过Java bin工具或者linux 命令去定位,然后解决。。。
7. kafka: kafka这块其实就围绕几个问题:
为什么使用kafka?然后就高吞吐、高可靠、高可用三点
高吞吐:生产者异步、压缩、批量发送啦、网络模型I/O多路复用高效啦、写入pageCache啦、顺序I/O啦、baseOffset形成跳表啦、零拷贝啦、批量拉取啦,一条龙整上,爽歪歪
高可靠:如何做到不重不漏不乱序?典中典了
高可用:Controller HA、PartitionHA(可以说到ISR、ISR概念,为什么设定ISR、如何保证消费一致性啦.............)
这几个点理解完后基本没啥问题,然后其他问题,可以看看面经进行查漏补缺,原谅我是八股文砖家哈哈哈
8. hbase:
HBase的学习需要从它的本质(多维 排序 稀疏 分布式Map),架构入手,表分region,region分store,store分memstore,diskstore,然后各个的作用,可能会出现什么操作(region merge、split、memstore的flush),然后到Hbase的写入读取过程,最后rowkey热点问题,如何实现二级索引,事务等等。这个推荐范欣欣《HBase原理与实践》(也是不全看,因为我们没那时间,重点调前面讲过的几点)和 http://hbasefly.com/author/libisthanksgmail-com/他个人博客的评论(注意是评论,文章内容就是书籍内容,都一样,评论才精彩!!!可以学到很多)
9. zk:
首先了解下zab协议,然后可以参考下面我总结的这些内容来看
ZooKeeper是一个可用于维护配置信息,命名,提供分布式同步等功能的高可用分布式协调服务。为了实现这些功能,其首先设定了自己的存储数据的数据结构ZnodeZnode主要包含三个部分stat: 包含Znode的版本(CAS)、权限(读写,创建子节点,删除子节点...)等信息data:Znode中存储的数据children:Znode的子节点节点的种类主要分成临时节点(不能在其下面创建子节点),持久节点,顺序节点。临时节点和客户端-服务端的会话有关,会话结束(不是连接结束,导致结束有宕机、网络超时等原因)则临时节点会被删除,持久节点则不会。)比如0000000001, 0000000002加以区分,这样节点种类就被区分成临时节点、临时顺序节点、持久节点、持久顺序节点(顺序节点假如设置成W0000000001,W0000000002,之后如果全部删除,下一个创建的顺序节点序列号将从W0000000003开始,zk肯定维护了这个序列号)
当然zookeeper还提供了使用这些节点的操作(创建create()、获取子节点getChildren()、获取节点数据getData()、更新数据setData())
多个Znode会组成一种类似文件系统中目录树结构,保存在内存中。内存数据丢失可以靠history回放,同时zookeeper会将这些数据定期保存快照到磁盘中,也能从其恢复。为什么同时将快照、事务日志落盘,落盘一个不就好了?出于数据粒度的考虑。。。
树的操作有些约束:1. 节点只能通过绝对路径访问2. 不能递归创建、也不能递归删除节点(删除有子节点的节点)3. 临时节点下不能创建子节点
上面说的这些功能都以某种形式被分布式应用程序(zk客户端)使用, 这就涉及到zk客户端和zk服务端之间通信? 除了正常心跳外就是通过watcher对象。zk客户端在自己所要关注的Znode上注册Watcher对象,一旦Znode的data、children发生变化时(stat中权限改变不会触发NodeDataChangedWatcher),或者连接状态变化,注册在其上的Watcher对象触发,zk客户端将会收到通知从而做出反应。Watcher是一次性的, 触发后就会被移除,如果还需要继续监听则客户端需重新注册,zk客户端收到的通知不会包含具体的内容(现在的data、现在的children,只能再次getData、getChildren获取),而仅仅是节点路径, 连接状态,事件类型(data变化、children变化,节点增删)
zookeeper是高可用的服务运行在奇数数量的集群上,要保持高可用就往往需要多副本,如何保持多副本之间数据的一致?zookeeper使用zab算法
zookeeper集群节点分成三种角色leader、follower、observer 。。。使用observer的原因:。。。
zab算法主要分成4个阶段:leader election + discovery + synchronization(recovery) + broadcast。。。 实现是3个阶段只有处在broadcast阶段中集群才能向外提供服务
基于以上的这些,zookeeper实现了上述配置中心,命名服务,分布式锁/队列等功能
如果有空可以使用zk实现个分布式锁。zk操作可以推荐《从paxos到zookeeper分布式一致性》,前面2pc,3pc,zab理论就别看了,乱的一批给我看懵了。这些理论部分去知乎上看大V文章(比如丁凯,范斌。。。)
10.raft:
看知乎文章+原论文