大数据岗快手一面分享
今天下午面了一场快手的数据研发岗,面试官非常温和,没有问什么很偏的问题,体感还不错。最近准备大数据岗面试的这段时间,发现市面上并没有很多关于大数据的面试资料,所以我从现在开始想尝试着把每次面试官问的问题汇总给大家,供大家做一些参考。
- HDFS的存储机制是怎样的?
HDFS是为大规模数据(大文件,顺序读写)设计的分布式文件系统,它把文件切成块(block),分布存储在多台机器上,通过副本(replication)提供高可用。其中最主要就是NameNode 和 DataNode,NameNode 负责存储文件的元数据(block块的大小,block块存储在哪个DataNode负责的节点上等),DataNode就负责数据的存储与读写。
- HDFS是怎样进行副本管理的?
存储block数据块时,HDFS会根本设定的参数(副本数)对block数据块进行复制,存多份。在复制时,由NameNode指定这些副本要存储在哪些DataNode上,并在这些DataNode之间构建数据管道(pipeline)进行传输数据。
副本放置的策略是使用机架感知策略,尽可能将数据分布在不同的机架。
DataNode会定时向NameNode发送heartbeat,表示此节点上的block数据块仍然可用。
- HDFS是怎么对灾难进行恢复的?
(HA模式下)如果NameNode崩溃,Standby Namenode节点会立刻接管NameNode。
(非HA模式)hadoop集群会根据保存在fsimage中的日志信息再加上editsLog中的日志增量对NameNode进行恢复。
- YARN是怎么对计算任务进行调度的(也就是怎么对这些计算任务对应的Application分配container资源的)?
(1)CapacitySchedduler(容量调度):能保证各个计算任务的最低资源,队列间可以临时借用空余资源,也支持预占、保留等运维能力。
(2)FIFO:按提交顺序调度,先到先服务。存在先提交的作业会把后提交的作业阻塞的缺点。
(3)FairScheduler(公平调度):支持按权重(weight)、队列、用户、标签配置公平策略。
- Hive解决数据倾斜的常用方式有哪些?
要解决数据倾斜,最好先确定数据倾斜的类型,是Join导致的倾斜还是GroupBy/Aggregation导致的倾斜,又或者是数据表本身就是按少量值极端分布的倾斜。
如果是Join倾斜的话,
我们可能会使用skew join,Hive会对导致join倾斜的这些数据量很大的key做额外的reducer单独处理。
如果表是大小表的话,我们就可能会使用map join,把小表缓存起来(并广播),直接在map端完成两张表的join操作。
最后也是最常用的优化操作,就是Salt(打散、加盐)操作,把导致倾斜的这些key打散到多个子key上做局部计算,最后再汇总。
- Spark有哪些Shuffle调优手段呢?
所有的Shuffle调优手段都是为了减少Shuffle的数据量和Shuffle的次数。
(1)我们会尽量让数据的计算操作在Map task中多执行,这样shuffle的数据就会减少,比如使用reducyBy/combineByKey做map端的提前聚合,尽量少使用groupbyKey。
(2如果计算任务的表的join任务并且有一侧表足够小时,我们就可以把这张小表广播到每个executor,直接做Map join。
- Spark是怎么对数据的缓存和检查点策略是怎样的呢?
对于缓存,rdd可以调用cache()函数把RDD中的中间数据放到内存中,加速后续重复访问,缓存操作不会改变RDD的血缘,仅仅是对中间数据做个副本备份。
对于检查点,rdd可以调用checkpoint()函数将RDD中的数据持久化到磁盘中并截断RDD的血缘。当然,这个磁盘文件是由HDFS进行管理的。设置检查点可以避免重算代价过高。
这七个问题是比较考验hadoop和Spark的扎实基本功的,有些问题的答案可能不是很全面,但是在面试中进行临时回答还是足够的。期待快手的二面,到时我也会总结给大家。
【注意】:大家在看这些面试题的时候,一定要结合底层原理去看,可以用下面这MapReduce的经典案例去做分析。