一、概念、架构

1、端口号

  • dfs.namenode.http-address:50070
  • dfs.datanode.http-address:50075
  • SecondaryNameNode辅助名称节点端口号:50090
  • dfs.datanode.address:50010
  • fs.defaultFS:8020 或者9000
  • Yarn.resourcemanager.webapp.address:8088
  • 历史服务器web访问端口:19888

2、生态圈的框架

Hadoop面试题 - 图1
根据服务对象和层次分为:数据来源层、数据传输层、数据存储层、资源管理层、数据计算层、任务调度层、业务模型层。
Oozie:协调多个MapReduce作业的执行,能够管理一个复杂的系统,基于外部事件来执行
Hive/Impala(基于Hadoop的数据仓库):处理存储在Hadoop集群中的大量数据的MPP(大规模并行处理)SQL查询引擎
Yarn/Mesos(分布式资源管理器):Mesos是一个资源统一管理和调度的平台,同样支持比如MR、steaming等多种运算框架。

3、启动的进程

需要启动NameNode、SecondaryNameNode、DataNode、JobTracker、TaskTracker进程。
1)NameNode它是hadoop中的主服务器,管理文件系统名称空间和对集群中存储的文件的访问,保存有metadate。
2)SecondaryNameNode(HDFS类):提供周期检查点和清理任务。帮助NN合并editslog,减少NN启动时间。

3)DataNode:负责管理连接到节点的存储(一个集群中可以有多个节点)。每个存储数据的节点运行一个datanode守护进程。
4)ResourceManager(JobTracker):JobTracker负责调度DataNode上的工作。每个DataNode有一个TaskTracker,它们执行实际工作。
5)NodeManager(TaskTracker):执行任务
6)DFSZKFailoverController:高可用时它负责监控NN的状态,并及时的把状态信息写入ZK。它通过一个独立线程周期性的调用NN上的一个特定接口来获取NN的健康状态。FC也有选择谁作为Active NN的权利,因为最多只有两个节点,目前选择策略还比较简单(先到先得,轮换)。
7)JournalNode:高可用情况下存放namenode的editlog文件.

4、Hadoop,CDH,HDP

版本主要包括 Cloudera版本(Cloudera’s Distribution Including Apache Hadoop,简称“CDH”)、
Apache基金会hadoop、Hortonworks版本(Hortonworks Data Platform,简称“HDP”)
(1)Apache社区版本
开源、免费、文档详实
部署、安装、管理复杂,需要考虑兼容性问题
(2)CDH
由Cloudera公司提出,同时提出了Impala项目
国内使用比较多、管理界面安装
(3)HDP
开源修改社区版Hadoop、添加增强特性,可以用于windows

二、HDFS

1、读写流程

(1)读数据
a.客户端调用DistributedFileSystem 的open方法发送请求到Namenode,获得block的位置信息,因为真正的block是存在Datanode节点上的,而namenode里存放了block位置信息的元数据。
b.Namenode返回所有block的位置信息,并将这些信息返回给客户端。
c.客户端拿到block的位置信息后调用FSDataInputStream API的read方法后并发读取block信息,block默认有3个副本,只需要从一个副本读取就可以。
d.datanode返回给客户端。
(2)写数据
a.客户端发送请求,调用DistributedFileSystem API的create方法去请求namenode,并告诉namenode上传文件的文件名、文件大小、文件拥有者。
b.namenode根据以上信息算出文件需要切成多少块block,以及block要存放在哪个datanode上,并将这些信息返回给客户端。
c.客户端调用FSDataInputStream API的write方法首先将其中一个block写在datanode上,每一个block默认都有3个副本,并不是由客户端分别往3个datanode上写3份,由已经上传block的datanode产生新的线程,由这个namenode按照放置副本规则往其它datanode写副本,这样的优势就是快。
d.写完后返回给客户端一个信息,然后客户端在将信息反馈给namenode。
e.需要注意的是上传文件的拥有者就是客户端上传文件的用户名,举个例子用windows客户端上传文件,那么这个文件的拥有者就是administrator,和linux上的系统用户名不是一样的。

2、TextInputFormat&实现

(1)作用
TextInputFormat是默认的InputFormat。每条记录是一行输入
Key是LongWritable类型,存储该行的字节偏移量(不是行数)
值是这行的内容,为一个Text对象。
缺陷:超长行会存在溢出现象
(2)自定义实现
自定义类继承InputFormat接口,重写createRecordReader和isSplitable方法
使用LineRecordReader对每个分片进行键值对转换,以行偏移量作为键,行内容作为值
在createRecordReader中可以自定义分隔符
(3)InputFormat对数据的预处理
getSplits,返回的是InputSplit数组,对数据进行split分片,每片交给map操作一次
getRecordReader,返回的是RecordReader对象,对每个split分片进行转换为key-value键值对格式传递给map

3、HDFS体系结构

Hadoop面试题 - 图2
由两类节点组成,一种是NameNode(NN),一种是DataNode(DN)。

NameNode是主控制服务器,管理HDFS文件系统的命名空间,记录文件数据库在每个DataNode节点上的位置和副本信息,协调客户端(Client)对文件的访问/操作,以及记录命名空间内的改动或命名空间本身属性的改变。

DataNode是数据存储节点,负责自身所在物理节点上的存储管理。HDFS中文件存储是按块(Block)存储的,Hadoop2.x版本中是128M,老版本中是64M。。

客户端操作数据,只通过NameNode获取DataNode节点的物理位置,对于写/读数据的具体操作,NameNode是不会参与的,全部由DataNode负责。

由于HDFS中只有一个NameNode节点,存在单点问题,数据可能丢失。
解决办法:启动一个SecondaryNameNode或者将NameNode数据写出到其它远程文件系统中。

三、MapReduce

1、MR的Shuffle过程

MapReduce计算模型主要由三个阶段构成:Map、shuffle、Reduce。

Map是映射,负责数据的过滤分法,将原始数据转化为键值对;
Reduce是合并,将具有相同key值的value进行处理后再输出新的键值对作为最终结果。
Shuffle过程,也称Copy阶段。为了让Reduce可以并行处理Map的结果,必须对Map的输出进行一定的排序与分割,然后再交给对应的Reduce,而这个将Map输出进行进一步整理并交给Reduce的过程就是Shuffle。

1)Map方法之后Reduce方法之前这段处理过程叫Shuffle
2)Map方法之后,数据首先进入到分区方法,把数据标记好分区,然后把数据发送到环形缓冲区;环形缓冲区默认大小100m,环形缓冲区达到80%时,进行溢写;溢写前对数据进行排序,排序按照对key的索引进行字典顺序排序,排序的手段快排;溢写产生大量溢写文件,需要对溢写文件进行归并排序;对溢写的文件也可以进行Combiner操作,前提是汇总操作,求平均值不行。最后将文件按照分区存储到磁盘,等待Reduce端拉取。
3)每个Reduce拉取Map端对应分区的数据。拉取数据后先存储到内存中,内存不够了,再存储到磁盘。拉取完所有数据后,采用归并排序将内存和磁盘中的数据都进行排序。在进入Reduce方法前,可以对数据进行分组操作。

2、数据压缩方式

压缩格式 Hadoop自带? 算法 文件扩展名 支持切分 换成压缩格式后,原来的程序是否需要修改
DEFLATE 是,直接使用 DEFLATE .deflate 和文本处理一样,不需要修改
Gzip 是,直接使用 DEFLATE .gz 和文本处理一样,不需要修改
bzip2 是,直接使用 bzip2 .bz2 和文本处理一样,不需要修改
LZO 否,需要安装 LZO .lzo 需要建索引,还需要指定输入格式
Snappy 否,cores-site.xml配置 Snappy .snappy 和文本处理一样,不需要修改

一般使用Snappy,特点速度快,缺点无法切分
在链式MR中,Reduce端输出使用bzip2压缩,以便后续的map任务对数据进行split【可以支持切分】

3、切片机制

1)一般是简单地按照文件的内容长度进行切片
2)切片大小,默认等于Block大小
3)切片时不考虑数据集整体,而是逐个针对每一个文件单独切片
提示:切片大小公式:max(0,min(Long_max,blockSize))

4、MR工作阶段

(1)作业提交:JobClient的submitJob()方法实现的作业提交过程
(2)作业的初始化:JobTracker把作业放入内部队列中,由作业调度器(比如先进先出调度器,容量调度器,公平调度器等)进行调度
(3)任务分配:TaskTracker定期通过“心跳”与JobTracker进行通信
对于MapTask和ReduceTask,TaskTracker有固定数量的任务槽(准确数量由TaskTracker核的数量和内存大小来决定)。
JobTracker会先将TaskTracker的MapTask填满,选取一个距离其输入分片文件最近的TaskTracker。
然后分配ReduceTask到TaskTracker

5、框架组成

Hadoop面试题 - 图3
MapReduce包含四个组成部分,分别为Client,JobTracker,TaskTracker,Task
Client:提交MapReduce作业,比如,写的MR程序,或者CLI执行的命令等;
JobTracker:协调作业的运行,本质是一个管理者;
TaskTracker:运行作业划分后的任务,本质就是一个执行者;
Task分为MapTask和ReduceTask两种,均由TaskTracker启动;
HDFS以固定大小的block为基本单位存储数据,对于MapReduce而言,其处理单位是split。split是一个逻辑概念,它只包含一些元数据信息,比如数据起始位置、数据长度、数据所在节点等。split的多少决定了MapTask的数目,因为每一个split只会交给一个MapTask处理。

四、Yarn

1、Job提交流程

Hadoop面试题 - 图4

  • Client端使用命令提交MapReduce job到Resourcemanager;
  • Resourcemanager分配NodeManager并加载与监控分配的Containers;
  • NodeManager中通过ApplicationMaster与ResourceManager进行资源的申请及状态的交互,进行MapReduce运行时job的管理;
  • job的提交通过调用submit()方法创建一个JobSubmitter实例,并调用submitJobInternal()方法

2、调度器

1)Hadoop调度器重要分为三类:
FIFO 、Capacity Scheduler(容量调度器)和Fair Sceduler(公平调度器)。
Hadoop2.7.2默认的资源调度器是容量调度器
2)区别:
FIFO调度器:先进先出,同一时间队列中只有一个任务在执行。【生产环境中不是使用的FifoScheduler】
容量调度器:多队列;每个队列内部先进先出,同一时间队列中只有一个任务在执行。队列的并行度为队列的个数。
公平调度器:多队列;每个队列内部按照缺额大小分配资源启动任务,同一时间队列中有多个任务执行。队列的并行度大于等于队列的个数。

3、概念及组成

(1)基本概念
Hadoop2.0之后, 可以使用Apache Yarn 来对集群资源进行管理
Yarn把可以把资源(内存,CPU)以Container的方式进行划分隔离。
Yarn会管理集群中所有机器的可用计算资源. 基于这些资源Yarn会调度应用(比如MapReduce)发来的资源请求, 然后Yarn会通过分配Container来给每个应用提供处理能力, Container(容器)是Yarn中处理能力的基本单元, 是对内存, CPU等的封装(容器)
(2)组成部分
ResourceManager:以下简称RM。YARN的中控模块,负责统一规划资源的使用。
NodeManager:以下简称NM。YARN的资源结点模块,负责启动管理container。
ApplicationMaster:以下简称AM。YARN中每个应用都会启动一个AM,负责向RM申请资源,请求NM启动container,并告诉container做什么事情。
Container:资源容器。YARN中所有的应用都是在container之上运行的。AM也是在container上运行的,不过AM的container是RM申请的。

4、namenode…的协作

Hadoop面试题 - 图5Hadoop面试题 - 图6
日志文件、镜像文件、检查点

五、配置及优化

1、配置文件

(1)配置文件:
core-site.xml、hdfs-site.xml、mapred-site.xml、Yarn-site.xml
Hadoop-env.sh、Yarn-env.sh、mapred-env.sh、slaves
(2)简单的集群搭建过程:
JDK安装
配置SSH免密登录
配置Hadoop核心文件:
格式化namenode

2、小文件优化

(1)小文件带来的影响

  • 影响NameNode的寿命,因为文件元数据存储在NameNode的内存
  • 影响计算引擎的任务数量,比如每个小的文件都会生成一个Map任务

(2)解决方案

  • 合并小文件:进行归档(Har)、自定义Inputformat将小文件存储成SequenceFile文件。
  • 采用ConbinFileInputFormat来作为输入,解决输入端大量小文件场景。
  • 对于大量小文件Job,可以开启JVM重用

3、Map优化

  • 增大环形缓冲区大小。由100m扩大到200m
  • 增大环形缓冲区溢写的比例。由80%扩大到90%
  • 减少对溢写文件的merge次数。(10个文件,一次20个merge)
  • 不影响实际业务的前提下,采用Combiner提前合并,减少 I/O。

4、Reduce优化

  • 合理设置Map和Reduce数:太少,会导致Task等待,延长处理时间;太多,会导致 Map、Reduce任务间竞争资源,造成处理超时等错误。
  • 设置Map、Reduce共存:调整slowstart.completedmaps参数,使Map运行到一定程度后,Reduce也开始运行,减少Reduce的等待时间。
  • 规避使用Reduce,因为Reduce在用于连接数据集的时候将会产生大量的网络消耗。
  • 增加每个Reduce去Map中拿数据的并行数
  • 集群性能可以的前提下,增大Reduce端存储数据内存的大小。

5、I/O传输优化

  • 采用数据压缩的方式,减少网络IO的的时间。安装Snappy和LZOP压缩编码器。
  • 使用SequenceFile二进制文件

6、配置优化

  • MapTask默认内存大小为1G,可以增加MapTask内存大小为4-5g
  • ReduceTask默认内存大小为1G,可以增加ReduceTask内存大小为4-5g
  • 可以增加MapTask的cpu核数,增加ReduceTask的CPU核
  • 增加每个Container的CPU核数和内存大小
  • 调整每个Map Task和Reduce Task最大重试次数

7、参数调优

1)在hdfs-site.xml文件中配置多目录,更改目录需要重启集群
2)NameNode有一个工作线程池,用来处理不同DataNode的并发心跳以及客户端并发的元数据操作。dfs.namenode.handler.count=20 log2(Cluster Size),比如集群规模为10台时,此参数设置为60
3)服务器节点上Yarn可使用的物理内存总量,默认是8192(MB),注意,如果你的节点内存资源不够8GB,则需要调减小这个值,而Yarn不会智能的探测节点的物理内存总量。Yarn.nodemanager.resource.memory-mb
4)单个任务*可申请的最多物理内存量
,默认是8192(MB)。Yarn.scheduler. maximum-allocation-mb

六、实操及问题解决

1、基准测试

搭建完Hadoop集群后需要对HDFS读写性能和MR计算能力测试。
测试jar包在Hadoop的share文件夹下。

2、Hadoop宕机

1)如果MR造成系统宕机。此时要控制Yarn同时运行的任务数,和每个任务申请的最大内存。调整参数:Yarn.scheduler.maximum-allocation-mb(单个任务可申请的最多物理内存量,默认是8192MB)
2)如果写入文件过量造成NameNode宕机。那么调高Kafka的存储大小,控制从Kafka到HDFS的写入速度。高峰期的时候用Kafka进行缓存,高峰期过去数据同步会自动跟上。

3、解决数据倾斜

(1)局部聚合加全局聚合。
第一次在map阶段对那些导致了数据倾斜的key 加上1到n的随机前缀,这样本来相同的key 也会被分到多个Reducer中进行局部聚合,数量就会大大降低。
第二次mapreduce,去掉key的随机前缀,进行全局聚合
思想:
二次mr,第一次将key随机散列到不同reducer进行处理达到负载均衡目的。第二次再根据去掉key的随机前缀,按原key进行reduce处理。
这个方法进行两次mapreduce,性能稍差。
(2)增加Reducer,提升并行度
JobConf.setNumReduceTasks(int)
(3)实现自定义分区
根据数据分布情况,自定义散列函数,将key均匀分配到不同Reducer

4、集群资源分配

集群有30台机器,跑mr任务的时候发现5个map任务全都分配到了同一台机器上,这个可能是由于什么原因导致的吗?
原因:一个NodeManager内部分配了多个容器
解决方案:Yarn.scheduler.fair.assignmultiple 这个参数默认是开的,需要关掉,表示是否允许一次分配多个容器
Yarn的Container、NM、AM、RM常见优化参数:
https://blog.csdn.net/leone911/article/details/51605172
5、Hadoop的高可用是如何实现的(2.x)
通过双namenode消除单点故障

6、介绍一下Hadoop的WordCount
MapReduce过程

7、Hadoop 实现TopN
不了解

8、Hadoop是自己搭的吗,用的什么版本?Hadoop、flume、kafka、sqoop、spark版本号
是的,CDH

9、有没有使用OZ调度Hadoop任务

10、Hadoop命令:创建、查看文件、列出文件状态
Fs -read