- hadoop原理
- spark原理
- kafka原理
- 数据仓库部分
Hadoop原理
- MapReduce的原理
默认根据hdfs上文件的block来启动相应数量的mapTask,每个mapTask处理该分片文件时,以用户定义的inputFormat来读取,形成KV输入流,K为偏移量,V是数据,然后通过map函数处理逻辑,输出KV,以K来分区排序后不断溢写到磁盘文件。Map任务大概完成80%的时候,会启动ReduceTask去拉取数据,在本地做归并排序。
2.hdfs上传文件的原理
Client发起文件上传请求,Namenode将可存储的节点告知Client,Client与该DataNode联系,并向该节点写文件,DataNode同时会以流水线的方式写入到其他DataNode节点(副本数和配置有关)
3.hdfs副本存放策略
系统默认为每一个数据块存放3个副本,按照布署在NameNode上的默认机架感知策略存放数据块副本。其中:
第一个block副本放在client结点所在机架的datanode里(如果client不在集群范围内,则这第一个node是随机选取的,当然系统会尝试不选择哪些太满或者太忙的node)。
第二个block副本放置在与第一个datanode节点相同的机架中的另一个datanode中(随机选择)。
第三个block副本放置于另一个随机远端机架的一个随机datanode中。
4.MapReduce的shuffle是什么
将MapTask输出的结果数据分发给reduceTask,并且在分发的过程,对数据按照Key进行了分区和排序
5.MapReduce的shuffle调优
(1)可以设置Combiner
(2)压缩,减少磁盘IO和网络IO (适合IO瓶颈大的)
(3)给shuffle尽可能大的内存
spark原理
6.spark宽依赖和窄依赖
宽依赖也是ShuffleDependency,多个子RDD的分区会依赖于同一个父RDD分区
窄依赖也就是NarrowDependency,每一个父RDD的分区最多只被子RDD的一个分区所使用
7.stage的划分
遇到ShuffleDependency就形成stage,stage内部的计算是pipeline形式的,数据流是一条直接运行到底的(一个task)。
8.spark的shuffle和mapreduce的shuffle有什么区别?
(1)从high-level来看,没有很大的差别,都是将mapper(spark里是shuffleMapTask)的输出进行Partition,不同的Partition送到不同的reducer(spark里可能是下一个stage的shuffleMapTask,也可能是ResultTask)。Reducer以内存作为缓冲区,边shuffle边aggregate数据,等数据aggregate好以后进行reduce()
(2)Low-level上看,差别不小,MapReduce内部在归并之前必须做sort,而spark不会提前排序,它是基于hashMap来shuffle
(3)从实现角度上看,差别不小,MapReduce将处理流程分为明显的几个阶段,map/spill/merge/shuffle/sort/reduce等,各阶段各司其职,而spark没有这种,只有transformation,这些操作可能是藏在里面的。
9.shuffleRead fetch的问题
(1)在shuffleMapTask全部结束以后开始fetch
(2)是边fetch边处理的