Hadoop 准备
运行hadoop集群需要哪些守护进程?
DataNode,NameNode,TaskTracker和JobTracker都是运行Hadoop集群需要的守护进程。
hadoop和spark都是并行计算,那么他们有什么相同和区别?
两者都使用mr模型来进行并行计算,hadoop的一个作业称为job,job里面分为map task和reduce task,每个task都是在自己的进程中运行的,当task结束时,进程也会结束。
Spark用户提交的任务称为application,一个application对应一个SparkContext,app中存在多个job,没触发一个action操作就会产生一个job。
这些job可以并行或者串行执行,每个job有多个stage,stage是shuffle过程中DAGSchaduler通过RDD之间的依赖关系划分job而来的,每个stage里面有多个task,组成taskset有TaskSchaduler分发到各个executor中执行,executor的生命周期是和application一样的,即使没有job运行也是存在的,所以task可以快速启动读取内存进行计算的。
Hadoop的job只有map和reduce操作,表达能力比较欠缺而且在mr过程中会重复的读写hdfs,造成大量的io操作,多个job需要自己管理关系。
Spark的迭代计算都是在内存中进行的,API中提供了大量的RDD操作join,groupby等,而且通过DAG图可以实现良好的容错。
hadoop的TextInputFormat作用是什么,如何自定义实现?
InputFormat会在map操作之前对数据进行两方面的预处理。
1.是getSplits,返回的是InputSplit数组,对数据进行Split分片,每片交给map操作一次。
2.是getRecordReader,返回的是RecordReader对象,对每个Split分片进行转换为key-value键值对格式传递给map常用的InputFormat是TextInputFormat,使用的是LineRecordReader对每个分片进行键值对的转换,以行偏移量作为键,行内容作为值。
自定义类继承InputFormat接口,重写createRecordReader和isSplitable方法在createRecordReader中可以自定义分隔符。
HDFS
1)NameNode 和 SecondaryNameNode区别 ?
NameNode
NameNode主要是用来保存HDFS的元数据信息,比如命名空间信息,块信息等。当它运行的时候,这些信息是存在内存中的。但是这些信息也可以持久化到磁盘上
上面的这张图片展示了NameNode怎么把元数据保存到磁盘上的。这里有两个不同的文件:
fsimage - 它是在NameNode启动时对整个文件系统的快照
edit logs - 它是在NameNode启动后,对文件系统的改动序列
只有在NameNode重启时,edit logs才会合并到fsimage文件中,从而得到一个文件系统的最新快照。但是在产品集群中NameNode是很少重启的,这也意味着当NameNode运行了很长时间后,edit logs文件会变得很大。在这种情况下就会出现下面一些问题:
edit logs文件会变的很大,怎么去管理这个文件是一个挑战。
NameNode的重启会花费很长时间,因为有很多改动[笔者注:在edit logs中]要合并到fsimage文件上。
如果NameNode挂掉了,那我们就丢失了很多改动因为此时的fsimage文件非常旧。
因此为了克服这个问题,我们需要一个易于管理的机制来帮助我们减小edit logs文件的大小和得到一个最新的fsimage文件,这样也会减小在NameNode上的压力。这跟Windows的恢复点是非常像的,Windows的恢复点机制允许我们对OS进行快照,这样当系统发生问题时,我们能够回滚到最新的一次恢复点上。
现在我们明白了NameNode的功能和所面临的挑战 - 保持文件系统最新的元数据。那么,这些跟Secondary NameNode又有什么关系呢?
secongNamenode
SecondaryNameNode就是来帮助解决上述问题的,它的职责是合并NameNode的edit logs到fsimage文件中。
首先,它定时到NameNode去获取edit logs,并更新到fsimage上。
一旦它有了新的fsimage文件,它将其拷贝回NameNode中。
NameNode在下次重启时会使用这个新的fsimage文件,从而减少重启的时间。
Secondary NameNode的整个目的是在HDFS中提供一个检查点。它只是NameNode的一个助手节点。这也是它在社区内被认为是检查点节点的原因。
2)块存储好处、HDFS默认块大小是多少?window block是多大 32MB
默认块的大小为 128MB
hdfs 会将文件划分为块(block),进行存储,每个块默认会备份成三份存储在不同的DataNode节点上,一般情况下块的默认大小是 64MB或者128MB,这样做的好处是
- 减少磁盘寻址时间
- 减少NameNode记录block和DataNode的开销
注意 如果一个文件小于块的默认大小,不会占据整个块.另外块的大小不能过于大因为
- mapreduce中 map任务通常一次只处理一个块中的数据,因此如果任务太少 少于集群中的节点数,作业的运行速度会比较慢
- 块过大不利于节点检查块是否丢失,因为预设的检查时间是根据块的大小决定的,如果过大时间会很长,影响精确性
- HDFS 为何不能存储小文件?
小文件过多会占用namenode的内存,浪费block
HDFS适用于高吞吐量,而不适合低时间延迟的访问,文件过小,录道时间大于数据的读写时间,这不符合HDFS的设计原则
解决方案:
a、HAR文件方案
为了缓解大量小文件带给namenode内存的压力,Hadoop 0.18.0引入了Hadoop Archives(HAR files),其本质就是在HDFS之上构建一个分层文件系统。通过执行hadoop archive 命令就可以创建一个HAR文件。在命令行下,用户可使用一个以har://开头的URL就可以访问HAR文件中的小文件。使用HAR files可以减少HDFS中的文件数量。
下图为HAR文件的文件结构,可以看出来访问一个指定的小文件需要访问两层索引文件才能获取小文件在HAR文件中的存储位置,因此,访问一个HAR文件的效率可能会比直接访问HDFS文件要低。对于一个mapreduce任务来说,如果使用HAR文件作为其输入,仍旧是其中每个小文件对应一个map task,效率低下。所以,HAR files最好是用于文件归档。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3tvEtSbL-1577523586165)(C:\Users\jiawangli\Desktop\面试题 data\assets/20180415113904442)]
b、Sequence Files方案
除了HAR files,另一种可选是SequenceFile,其核心是以文件名为key,文件内容为value组织小文件。10000个100KBde 小文件,可以编写程序将这些文件放到一个SequenceFile文件,然后就以数据流的方式处理这些文件,也可以使用MapReduce进行处理。一个SequenceFile是可分割的,所以MapReduce可将文件切分成块,每一块独立操作。不像HAR,SequenceFile支持压缩。在大多数情况下,以block为单位进行压缩是最好的选择,因为一个block包含多条记录,压缩作用在block智商,比reduce压缩方式(一条一条记录进行压缩)的压缩比高。
把已有的数据转存为SequenceFile比较慢。比起先写小文件,再将小文件写入SequenceFile,一个更好的选择是直接将数据写入一个SequenceFile文件,省去小文件作为中间媒介。
下图为SequenceFile的文件结构。HAR files可以列出所有keys,但是SequenceFile是做不到的,因此,在访问时,只能从文件头顺序访问
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3RUuWusA-1577523586166)(C:\Users\jiawangli\Desktop\面试题 data\assets/20180415115244180)]
4)什么是Rack机架?
5) HDFS HA:NameNode、journalnode、zkfc、zookeeper、datanode
MapReduce
1)MapReduce任务执行11步骤:
- 运行Job
- 获取ApplicationID | JobID
- Copy Job资源到HDFS - 切片、代码、配置
- 提交任务给Resource Manager
- RM->NM 消耗一个Container资源,用于启动MRAppMaster
- MRAppMaster初始化任务,完成任务调度前的准备工作
- MRAppmaster 查询输入切片信息 | 配置,进而获取第1、2阶段任务并行度
- MRAppmaster 连接RM获取计算资源
- MRAppmaster 连接NM消耗Container | YarnChild
- YarnChild获取代码片段和切片信息
- YarnChild调用MapTask后者Reduce Task
2)如何书写一个Job提交
- 创建Job对象
- 指定输入输出格式类
- 指定输入和写出路径
- 设置Mapper|Reducer逻辑
- 设置Mapper和Reducer输出key-value类型
- Job提交
注意:需要设定numReduceTasks数量
/ 设置Mapper端输出压缩
/ 如果任务支持Combiner、必须设置Combiner
3)MapReduce 切片计算方案:
Split:0~140.8 MB Split – MapTask --JVM | Container 000000
- 为什么说MapReduce不擅长处理小文件?
- CombineTextInputFormat 专门处理小文件
4)MapReduce Shuffle √
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UcgkCXLX-1577523586167)(C:/Users/jiawangli/Desktop/%E9%9D%A2%E8%AF%95%E9%A2%98%20data/assets/1572922886478.png)]
什么是MapReduce计算中的数据倾斜?
https://blog.csdn.net/WYpersist/article/details/79797075
MapReduce能否对key做全局排序?
不能,mapreduce使用hash计算数据的存储位置,有分区操作
Hadoop中有哪些组件?
Hadoop=HDFS+Yarn+MapReduce+Hive+Hbase+...
1).HDFS:分布式文件存储系统
主:namenode,secondarynamenode
从:datanode
2).Yarn:分布式资源管理系统,用于同一管理集群中的资源(内存等)
主:ResourceManager
从:NodeManager
3).MapReduce:Hadoop的计算框架,用map和reduce方式实现数据的全局汇总
4).Zookeeper:分布式协调服务,用于维护集群配置的一致性、任务提交的事物性、集群中服务的地址管理、集群管理等
主:QuorumPeerMain
从:QuorumPeerMain
5).Hbase:Hadoop下的分布式数据库,类似于NoSQL
主:HMaster,HRegionserver,Region
7).Hive:分布式数据仓库,其实说白了就是一个数据分析工具,底层用的还是MapReduce
8).Sqoop:用于将传统数据库中数据导入到hbase或者Hdfs中一个导入工具
9).Spark:基于内存的分布式处理框架
主:Master
从:Worker
2.Hdfs中角色有哪些?
NameNode:管理元数据信息,给子节点分配任务(FSImage是主节点启动时对整个文件系统的快照,Edits是修改记录)
DataNode:负责数据存储,实时上报心跳给主节点
SecondaryNameNode:
1)首先,它定时到NameNode去获取edit logs,并更新到fsimage上。一旦它有了新的fsimage文件,它将其拷贝回NameNode中。
2) NameNode在下次重启时会使用这个新的fsimage文件,从而减少重启的时间。
Hdfs和Yarn有什么区别?
1)Hdfs是分布式文件存储系统,是用来存储文件的;
2)Yarn是一个资源管理系统,可为上层应用提供统一的资源管理和调度,它的引入为集群在利用率、资源统一管理数据共享等方面带来了巨大好处
MapReduce的shuffle过程?
从Map产生输出开始到Reduce取得数据作为输入之前的过程称作shuffle。
1).Collect阶段:将MapTask的结果输出到默认大小为100M的环形缓冲区,保存的是key/value,Partition分区信息等。
2).Spill阶段:当内存中的数据量达到一定的阀值的时候,就会将数据写入本地磁盘,在将数据写入磁盘之前需要对数据进行一次排序的操作,如果配置了combiner,还会将有相同分区号和key的数据进行排序。
3).Merge阶段:把所有溢出的临时文件进行一次合并操作,以确保一个MapTask最终只产生一个中间数据文件。
4).Copy阶段:ReduceTask启动Fetcher线程到已经完成MapTask的节点上复制一份属于自己的数据,这些数据默认会保存在内存的缓冲区中,当内存的缓冲区达到一定的阀值的时候,就会将数据写到磁盘之上。
5).Merge阶段:在ReduceTask远程复制数据的同时,会在后台开启两个线程对内存到本地的数据文件进行合作。
6).Sort阶段:在对数据进行合并的同时,会进行排序操作,由于MapTask阶段已经对数据进行了局部的排序ReduceTask只需保证Copy的数据的最终整体有效性即可。
MapReduce的Partition和Combine有什么区别?
1)combine分为map端和reduce端,作用是把同一个key的键值对合并在一起,可以自定义,该类的主要功能是合并相同的key键
2)partition是分割map每个节点的结果,按照key分别映射给不同的reduce,也是可以自定义的,partition的作用就是把这些数据归类
Hadoop的高可用模式说一下?
#### MapReduce的Partition和Combine有什么区别?
```java
1)combine分为map端和reduce端,作用是把同一个key的键值对合并在一起,可以自定义,该类的主要功能是合并相同的key键
2)partition是分割map每个节点的结果,按照key分别映射给不同的reduce,也是可以自定义的,partition的作用就是把这些数据归类
Hadoop的高可用模式说一下?
来源:CSDN
作者:明月清风,良宵美酒
链接:https://blog.csdn.net/qq_40822132/article/details/103746390