hadoop
Hadoop 中常问的就三块,第一:分布式存储(HDFS);第二:分布式计算框架(MapReduce);第三:资源调度框架(YARN)。
一,什么是Hadoop及其组件
Hadoop是一个开源分布式计算平台架构,基于apache(阿帕奇)协议发布,由java语言开发。主要包括
运行模式:单机版、伪分布式模式、完全分布式模式
1.HDFS(分布式文件管理系统)
1)HDFS的主要特点:
主要解决大数据处理问题,起源与谷歌的GFS
保存多个副本,且提供容错机制,副本丢失或宕机自动恢复。默认存3份。
运行在廉价的机器上。
适合大数据的处理。HDFS默认会将文件分割成block(块),64M为1个block。然后将block按键值对存储在HDFS上,并将键值对的映射存到内存中。如果小文件太多,那内存的负担会很重。
HDFS中的两个重要角色:
①[Namenode]
1)管理文件系统的命名空间。
2)记录 每个文件数据快在各个Datanode上的位置和副本信息。
3)协调客户端对文件的访问。
4)记录命名空间内的改动或者空间本身属性的改动。
5)Namenode 使用事务日志记录HDFS元数据的变化。使用映像文件存储文件系统的命名空间,包括文件映射,文件属性等。
从社会学来看,Namenode是HDFS里面的管理者,发挥者管理、协调、操控的作用。
②[Datanode]
1)负责所在物理节点的存储管理。
2)一次写入,多次读取(不修改)。
3)文件由数据库组成,一般情况下,数据块的大小为64MB。
4)数据尽量散步到各个节点。
从社会学的角度来看,Datanode是HDFS的工作者,发挥按着Namenode的命令干活,并且把干活的进展和问题反馈到Namenode的作用。
2)客户端如何访问HDFS中一个文件呢?具体流程如下:
1.首先从Namenode获得组成这个文件的数据块位置列表。
2.接下来根据位置列表知道存储数据块的Datanode。
3.最后访问Datanode获取数据。
注意:Namenode并不参与数据实际传输。
3)数据存储系统,数据存储的可靠性至关重要。HDFS是如何保证其可靠性呢?它主要采用如下机理:
1.冗余副本策略,即所有数据都有副本,副本的数目可以在hdfs-site.xml中设置相应的复制因子。
2.机架策略,即HDFS的“机架感知”,一般在本机架存放一个副本,在其它机架再存放别的副本,这样可以防止机架失效时丢失数据,也可以提供带宽利用率。
3.心跳机制,即Namenode周期性从Datanode接受心跳信号和快报告,没有按时发送心跳的Datanode会被标记为宕机,不会再给任何I/O请求,若是Datanode失效造成副本数量下降,并且低于预先设置的阈值,Namenode会检测出这些数据块,并在合适的时机进行重新复制。
4.安全模式,Namenode启动时会先经过一个“安全模式”阶段。
5.校验和,客户端获取数据通过检查校验和,发现数据块是否损坏,从而确定是否要读取副本。
6.回收站,删除文件,会先到回收站/trash,其里面文件可以快速回复。
7.元数据保护,映像文件和事务日志是Namenode的核心数据,可以配置为拥有多个副本。
8.快照,支持存储某个时间点的映像,需要时可以使数据重返这个时间点的状态。
4)HDFS也是按照Master和Slave的结构。
分为NameNode、SecondaryNameNode、DataNode这几个角色。
NameNode:是Master节点,是大领导。管理数据块映射;处理客户端的读写请求;配置副本策略;管理HDFS的名称空间;
SecondaryNameNode:是一个小弟,分担大哥namenode的工作量;是NameNode的冷备份;合并fsimage和fsedits然后再发给namenode。
DataNode:Slave节点,奴隶,干活的。负责存储client发来的数据块block;执行数据块的读写操作。
热备份:b是a的热备份,如果a坏掉。那么b马上运行代替a的工作。
冷备份:b是a的冷备份,如果a坏掉。那么b不能马上代替a工作。但是b上存储a的一些信息,减少a坏掉之后的损失。
fsimage:元数据镜像文件(文件系统的目录树。)
edits:元数据的操作日志(针对文件系统做的修改操作记录)
namenode内存中存储的是=fsimage+edits。
SecondaryNameNode负责定时默认1小时,从namenode上,获取fsimage和edits来进行合并,然后再发送给namenode。减少namenode的工作量。
5)HDFS的优缺点:
优点:a、高容错性
1)数据自动保存多个副本。通过增加副本的形式,提高容错性
2)某一个副本丢失以后,它可以自动恢复
b、适合处理大数据
1)数据规模:能够处理数据规模达到GB、TB,甚至PB级别的数据
2)文件规模:能够处理百万规模以上的文件数量,数量相当之大
c、可构建在廉价机器上、通过多副本机制,提高可靠性。
缺点:a、不适合低延时数据访问,比如毫秒级的存储数据,是做不到的
b、无法高校的对大量小文件进行存储
1)存储大量小文件的话,它会占用NameNode大量的内存来存储文件目录和块信息,是不可取的,因为NameNode的内存总是有限的。
2)小文件存储的寻址时间会超过读取时间(小文件量大,导致遍历的时间就长),违反了HDFS的设计目标。
c、不支持并发写入,文件随机修改。
1)一个文件只能有一个写,不允许多个线程同时写;
2)只支持数据append(追加),不支持文件的随机修改。
6)HDFS读流程
- client跟namenode通信查询元数据,namenode通过查询元数据,找到文件块所在的datanode服务器
- 挑选一台datanode(就近原则,然后随机)服务器,请求建立socket流
- datanode开始发送数据(从磁盘里面读取数据放入流,以packet为单位来做校验,大小为64k)
- 客户端以packet为单位接收,现在本地缓存,然后写入目标文件
7)HDFS写流程
- 客户端跟namenode通信请求上传文件,namenode检查目标文件是否已存在,父目录是否存在,用户是否有权限等
- namenode返回是否可以上传
- client请求第一个 block该传输到哪些datanode服务器上
- namenode返回3个datanode服务器ABC
- client请求3台dn中的一台A上传数据(本质上是一个RPC调用,建立pipeline),A收到请求会继续调用B,然后B调用C,将整个pipeline建立完成,逐级返回客户端
- client开始往A上传第一个block(先从磁盘读取数据放到一个本地内存缓存),以packet为单位,A收到一个packet就会传给B,B传给C;A每传一个packet会放入一个应答队列等待应答
- 当一个block传输完成之后,client再次请求namenode上传第二个block的服务器。
MapReduce(分布式计算框架)
MapReduce是一个软件框架,它可以运行在有上千个商用机器组成的大集群上,可靠性高、容错能力强、可以并行处理TB级别的海量数据
1.MopReduce的组成原理
1)MopReduce是“分而治之”的结构思想
Mapper负责“分”,即把复杂的任务分解为若干个“简单的任务”来处理。“简单的任务”包含三层含义:一是数据或计算的规模相对原任务要大大缩小;二是就近计算原则,即任务会分配到存放着所需数据的节点上进行计算;三是这些小任务可以并行计算,彼此间几乎没有依赖关系。
2)Reducer负责对map阶段的结果进行汇总。
至于需要多少个Reducer,用户可以根据具体问题,通过在mapred-site.xml配置文件里设置参数mapred.reduce.tasks的值,缺省值为1。
2.MapReduce的整个工作过程,它包含如下4个独立的实体:
1)客户端,用来提交MapReduce作业。
2)jobtracker,用来协调作业的运行。
3)tasktracker,用来处理作业划分后的任务。
4)HDFS,用来在其它实体间共享作业文件。
3.MapReduce整个工作过程有序地包含如下工作环节:
1)作业的提交
2)作业的初始化
3)任务的分配
4)任务的执行
5)进程和状态的更新
6)作业的完成
3.mapreduce的大致流程
主要分为八个步骤
1/对文件进行切片规划
2/启动相应数量的maptask进程
3/调用FileInputFormat中的RecordReader,读一行数据并封装为k1v1
4/调用自定义的map函数,并将k1v1传给map
5/收集map的输出,进行分区和排序
6/reduce task任务启动,并从map端拉取数据
7/reduce task调用自定义的reduce函数进行处理
8/调用outputformat的recordwriter将结果数据输出
4.MapReduce架构
(1)主从结构
•主节点,只有一个: JobTracker
•从节点,有很多个: TaskTrackers
(2)JobTracker 负责:
•接收客户提交的计算任务
•把计算任务分给TaskTrackers执行
•监控TaskTracker的执行情况
(3)TaskTrackers负责:
•执行JobTracker分配的计算任务
5.MapReduce优化经验
答:(1.)设置合理的map和reduce的个数。合理设置blocksize
(2.)避免出现数据倾斜
(3.)combine函数
(4.)对数据进行压缩
(5.)小文件处理优化:事先合并成大文件,combineTextInputformat,在hdfs上用mapreduce将小文件合并成SequenceFile大文件(key:文件名,value:文件内容)
(6.)参数优化
Hive(基于Hadoop的数据仓库)
Pig(基于Hadoop的数据流系统)
HBase(一个分布式面向列的数据库)
Spark(快速和通用计算的Hadoop数据引擎)
ZooKeeper(分布式协作服务)
二,Hadoop的特点
(1) 扩容能力(Scalable):能可靠地(reliably)存储和处理千兆字节(PB)数据。
(2) 成本低(Economical):可以通过普通机器组成的服务器群来分发以及处理数据。这些服务器群总计可达数千个节点。
(3) 高效率(Efficient):通过分发数据,hadoop可以在数据所在的节点上并行地处理它们,这使得处理非常的快速。
(4) 可靠性(Reliable):hadoop能自动地维护数据的多份副本,并且在任务失败后能自动地重新部署计算任务。
三,Hadoop的守护进程
NameNode(元数据服务器)
主节点,存储文件的元数据(文件名,文件目录结构,文件属性——生成时间,副本数,文件权限),以及每个文件的块列表和块所在的DataNode等
SecondaryNameNode(辅助元数据服务器)
用来监控HDFS状态的辅助后台程序,每隔一段时间获取HDFS元数据快照
DataNodes(块存储)
在本地文件系统存储文件块数据,以及块数据校验
JobTracker(任务调度)
负责接收用户提交的作业,负责启动、跟踪任务执行,每个 DataNode有一个TaskTracker,它们执行实际工作。
TaskTrackers(任务执行)
负责执行由JobTracker分配的任务,管理各个任务在每个节点的执行情况。
四,HDFS组成架构
架构主要由四个部分组成,分别为HDFS Client、NameNode、DataNode和Secondary NameNode。下面我们分别介绍这四个组成部分。
1)Client:就是客户端。
(1)文件切分。文件上传HDFS的时候,Client将文件切分成一个一个的Block,然后进行存储;
(2)与NameNode交互,获取文件的位置信息;
(3)与DataNode交互,读取或者写入数据;
(4)Client提供一些命令来管理HDFS,比如启动或者关闭HDFS;
(5)Client可以通过一些命令来访问HDFS;
2)NameNode:就是Master,它是一个主管、管理者。
(1)管理HDFS的名称空间;
(2)管理数据块(Block)映射信息;
(3)配置副本策略;
(4)处理客户端读写请求。
3)DataNode:就是Slave。NameNode下达命令,DataNode执行实际的操作。
(1)存储实际的数据块;
(2)执行数据块的读/写操作。
4)Secondary NameNode:并非NameNode的热备。当NameNode挂掉的时候,它并不能马上替换NameNode并提供服务。
(1)辅助NameNode,分担其工作量;
(2)定期合并Fsimage和Edits,并推送给NameNode;
(3)在紧急情况下,可辅助恢复NameNode。
五,Hadoop的YARN/HDFS/MapReduce分别包含哪些组件,每个组件的职能是什么?
YARN:Yet Another Resource Negotiator,是一种新的Hadoop资源管理器
ReasourManager
负责资源管理的,整个系统有且只有一个 RM ,来负责资源的调度。它也包含了两个主要的组件:定时调用器(Scheduler)以及应用管理器(ApplicationManager)。
ApplicationMaster
每当 Client 提交一个 Application 时候,就会新建一个 ApplicationMaster 。由这个 ApplicationMaster 去与 ResourceManager 申请容器资源,获得资源后会将要运行的程序发送到容器上启动,然后进行分布式计算。
NodeManager
NodeManager 是 ResourceManager 在每台机器的上代理,负责容器的管理,并监控他们的资源使用情况(cpu,内存,磁盘及网络等),以及向ResourceManager/Scheduler 提供这些资源使用报告。
Container
Container是YARN集群中资源的抽象,将NM上的资源进行量化,根据需要组装成一个个Container,然后服务于已授权资源的计算任务。计算任务在完成计算后,系统会回收资源,以供后续计算任务申请使用。Container包含两种资源:内存和CPU,后续Hadoop版本可能会增加硬盘、网络等资源。
3.2 HDFS:分布式文件管理系统
NameNode
SecondaryNameNode
DataNode
3.3 MapReduce:分布式计算框架,采用Master/Slave架构,1个JobTracker带多个TaskTracker
JobTracker
TaskTracker
MapTask
ReduceTask
六,一个MapReduce任务在提交阶段是如何对输入数据进行分片划分的?
通过InputSplit()函数来处理,设置分片数量为Math.max(minSize,Math.min(goalSize, blockSize)),一个数据片分配一个map任务。
七,MapReduce里的Combiner是做什么用的?什么情况下需要,和Reduce的区别是什么?
Combiner主要是在map完成后,reducer之前对数据做一次聚合,以减少数据传输的IO开销。
数据格式转换
map: (K1, V1) → list(K2, V2)
combine: (K2, list(V2)) → list(K2, V2)
reduce: (K2, list(V2)) → list(K3, V3)
注意:combine的输入和reduce的完全一致,输出和map的完全一致
Combiner和Reducer的区别在于运行的位置
Combiner是在每一个MapTask所在的节点运行;
Reducer是接收全局所有Mapper的输出结果;
八,MapReduce的Shuffle过程包含了哪几个阶段,分别做了什么工作?Shuffle的数据量是由什么决定的?
map端shuffle
1、split,将文件切片
2、partition,得到key,value形式的结果
3、写入环形内存缓冲区
4、spill,执行溢出写
5、归并
reduce端shuffle
1、复制copy
2、归并merge
3、reduce
九,什么是推测机制,它是如何解决计算慢节点问题的?
当一个task被认定很慢后,JobTracker会起一个新的task attempt来双跑,取最先完成的task的结果,本文记录下Hadoop中是如何判断一个task需要起speculative task的。
十,HDFS是如何实现容错机制的?如果NameNode挂了会怎么样,DataNode挂了会怎么样?
HDFS 通过复制进程来保证容错机制。在文件写入 HDFS 时,HDFS 会首先把文件分割成块,并把这些数据块存储在集群不同机器上,然后在其他机器创建各个块的副本,默认情况下,HDFS 会在其他机器创建3个文件的副本。
NameNode挂了
使用文件系统元数据副本(FsImage)启动一个新的 NameNode。
然后,配置 DataNode 和客户端,以便它们可以确认这个新的 NameNode,即启动。
现在,新的 NameNode 将在完成加载最后一个检查点 FsImage(用于元数据信息)并从 DataNode 接收到足够的块报告后开始为客户端提供服务。
DataNode挂了
NameNode 定期从集群中的每个 DataNode 接收心跳(信号),这意味着 DataNode 运行正常。
块报告包含 DataNode 上所有块的列表。如果一个 DataNode 发送心跳消息失败,则在特定时间段后将其标记为死亡。
NameNode 使用之前创建的副本将死节点的块复制到另一个 DataNode
十一,HDFS的一次读数据请求经历了怎样的过程?一次写请求经历了怎样的过程?
写数据请求
1、客户端通过Distributed FileSystem模块向NameNode请求上传文件;
2、NameNode检查是否已存在文件和检查权限。若通过检查,直接先将操作写入EditLog,并返回输出流对象;
3、客户端按照配置参数(dfs.blocksize,比如128MB)的大小将文件切分为块(Block),并向NameNode请求上传第一个Block;
4、NameNode返回分配的可写的DataNode列表,比如dn1、dn2、dn3;
5、客户端通过FSDataOutputStream模块向dn1请求上传数据,dn1收到请求会继续调用dn2,然后dn2调用dn3,将这个通信管道pipeline建 立完成;
6、dn1、dn2、dn3逐级应答客户端;
7、客户端开始往dn1上传第一个Block(先从磁盘读取数据放到一个本地内存缓存),以Packet为单位,dn1收到一个Packet就会传给dn2,dn2传给dn3;dn1每传.一个packet会放入一个应答队列等待应答;(注:并不是每写完一个packet后就返回确认信息,因为packet中的每个chunk都携带校验信息,没必要每写一个就汇报一下,这样效率太慢。正确的做法是写完一个block块后对校验信息进行汇总分析,进而得出是否有块写错的情况发生)
8、当一个Block传输完成之后,客户端再次请求NameNode上传第二个Block的服务器。(重复执行3-7步);
9、写完数据,关闭输出流。
读数据请求
1、客户端通过Distributed FileSystem向NameNode请求下载文件,NameNode通过查询元数据获得这个文件的数据块位置列表,返回输入流对象;
2、挑选一台DataNode(就近原则,然后随机)服务器,请求读取数据;
3、DataNode开始传输数据给客户端(从磁盘里面读取数据输入流,以Packet为单位来做校验);
4、客户端以Packet为单位接收,先在本地缓存,然后写入目标文件;
5、写完数据,关闭输入流。
十二,YARN的产生解决了什么样的调度问题?
Hadoop 由MapReduce和HDFS组成,1.x版本设计缺陷是单点故障,即MR的JobTracker和HDFS的NameNode两个核心服务均存在单点问题,这使得Hadoop在相当长时间内仅适合离线存储和离线计算。
Hadoop 2.0由三个分支组成,分别是HDFS、MapReduce和YARN,YARN是Hadoop 2.x中的资源管理系统,它是一个通用的资源管理模块,可为各类应用程序进行资源管理和调度。YARN不仅限于MapReduce一种框架使用,也可以供其他框架使用,Spark、Storm等。
Yarn的作用:解耦资源与计算
十三,YARN是如何做计算资源的调度的,有哪些策略?
FIFO:先到先得
Capacity:给小任务单独一份计算资源
Fair:平均分配
十四,Hadoop生态圈的组件并做简要描述
1)Zookeeper:是一个开源的分布式应用程序协调服务,基于zookeeper可以实现同步服务,配置维护,命名服务。
2)Flume:一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统。
3)Hbase:是一个分布式的、面向列的开源数据库, 利用Hadoop HDFS作为其存储系统。
4)Hive:基于Hadoop的一个数据仓库工具,可以将结构化的数据档映射为一张数据库表,并提供简单的sql 查询功能,可以将sql语句转换为MapReduce任务进行运行。
十五,解释“hadoop”和“hadoop 生态系统”两个概念
Hadoop是指Hadoop框架本身;hadoop生态系统,不仅包含hadoop,还包括保证hadoop框架正常高效运行其他框架,比如zookeeper、Flume、Hbase、Hive、Sqoop等辅助框架。
十六,请列出正常工作的Hadoop集群中Hadoop都分别需要启动哪些进程,它们的作用分别是什么?
1)NameNode:它是hadoop中的主服务器,管理文件系统名称空间和对集群中存储的文件的访问,保存有metadate。
2)SecondaryNameNode:它不是namenode的冗余守护进程,而是提供周期检查点和清理任务。帮助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文件。
十七,谈谈Hadoop序列化和反序列化及自定义bean对象实现序列化?
1)序列化和反序列化
(1)序列化就是把内存中的对象,转换成字节序列(或其他数据传输协议)以便于存储(持久化)和网络传输。
(2)反序列化就是将收到字节序列(或其他数据传输协议)或者是硬盘的持久化数据,转换成内存中的对象。
(3)Java的序列化是一个重量级序列化框架(Serializable),一个对象被序列化后,会附带很多额外的信息(各种校验信息,header,继承体系等),不便于在网络中高效传输。所以,hadoop自己开发了一套序列化机制(Writable),精简、高效。
2)自定义bean对象要想序列化传输步骤及注意事项:
(1)必须实现Writable接口
(2)反序列化时,需要反射调用空参构造函数,所以必须有空参构造
(3)重写序列化方法
(4)重写反序列化方法
(5)注意反序列化的顺序和序列化的顺序完全一致
(6)要想把结果显示在文件中,需要重写toString(),且用"\t"分开,方便后续用
(7)如果需要将自定义的bean放在key中传输,则还需要实现comparable接口,因为mapreduce框中的shuffle过程一定会对key进行排序
十八,文件大小设置,增大有什么影响?
HDFS中的文件在物理上是分块存储(block),块的大小可以通过配置参数( dfs.blocksize)来规定,默认大小在hadoop2.x版本中是128M,老版本中是64M。
思考:为什么块的大小不能设置的太小,也不能设置的太大?
HDFS的块比磁盘的块大,其目的是为了最小化寻址开销。如果块设置得足够大,从磁盘传输数据的时间会明显大于定位这个块开始位置所需的时间。
因而,传输一个由多个块组成的文件的时间取决于磁盘传输速率。
如果寻址时间约为10ms,而传输速率为100MB/s,为了使寻址时间仅占传输时间的1%,我们要将块大小设置约为100MB。默认的块大小128MB。
块的大小:10ms×100×100M/s = 100M
增加文件块大小,需要增加磁盘的传输速率。
十九, MapReduce跑得慢的原因?
Mapreduce 程序效率的瓶颈在于两点:
1)计算机性能
CPU、内存、磁盘健康、网络
2)I/O 操作优化
(1)数据倾斜
(2)map和reduce数设置不合理
(3)reduce等待过久
(4)小文件过多
(5)大量的不可分块的超大文件
(6)spill次数过多
(7)merge次数过多等
二十,Hadoop优化有哪些方面
0)HDFS 小文件影响
(1)影响 NameNode 的寿命,因为文件元数据存储在 NameNode 的内存中
(2)影响计算引擎的任务数量,比如每个小的文件都会生成一个 Map 任务
1)数据输入小文件处理:
(1)合并小文件:对小文件进行归档(Har)、自定义 Inputformat 将小文件存储成SequenceFile 文件。
(2)采用 ConbinFileInputFormat 来作为输入,解决输入端大量小文件场景。
(3)对于大量小文件 Job,可以开启 JVM 重用。
2)Map 阶段
(1)增大环形缓冲区大小。由 100m 扩大到 200m
(2)增大环形缓冲区溢写的比例。由 80%扩大到 90%
(3)减少对溢写文件的 merge 次数。(10 个文件,一次 20 个 merge)
(4)不影响实际业务的前提下,采用 Combiner 提前合并,减少 I/O。
3)Reduce 阶段
(1)合理设置 Map 和 Reduce 数:两个都不能设置太少,也不能设置太多。太少,会导致 Task 等待,延长处理时间;太多,会导致 Map、Reduce 任务间竞争资源,造成处理超时等错误。
(2)设置 Map、Reduce 共存:调整 slowstart.completedmaps 参数,使 Map 运行到一定程度后,Reduce 也开始运行,减少 Reduce 的等待时间。
(3)规避使用 Reduce,因为 Reduce 在用于连接数据集的时候将会产生大量的网络消耗。
(4)增加每个 Reduce 去 Map 中拿数据的并行数
(5)集群性能可以的前提下,增大 Reduce 端存储数据内存的大小。
4)IO 传输
(1)采用数据压缩的方式,减少网络 IO 的的时间。安装 Snappy 和 LZOP 压缩编码器。
(2)使用 SequenceFile 二进制文件
5)整体
(1)MapTask 默认内存大小为 1G,可以增加 MapTask 内存大小为 4-5g
(2)ReduceTask 默认内存大小为 1G,可以增加 ReduceTask 内存大小为 4-5g
(3)可以增加 MapTask 的 cpu 核数,增加 ReduceTask 的 CPU 核数
(4)增加每个 Container 的 CPU 核数和内存大小
(5)调整每个 Map Task 和 Reduce Task 最大重试次数
版权归原作者 远道可思 所有, 如有侵权,请联系我们删除。