hadoop概述

hadoop是一个开源的可靠的可扩展的分布式框架,它有很多的组件,比如Common,HDFS
YARN,MapReduce。

  • Common:支持其他Hadoop模块的常用实用程序
  • HDFS:是一个分布式文件系统,提供对应用程序数据的高吞吐量访问
  • YARN:是一个作业调度和集群资源管理的框架 MapReduce:基于YARN的系统,用于并行处理大型数据集

侠义的hadoop:是一个适合大数据分布式存储(HDFS),分布式计算(MapReduce)和资源调度(YARN)的平台。
广义的Hapdoop:指的是hadoop生态系统,hadoop生态系统是一个很庞大的概念,hadoop是其中最重要最基础的一个部分,生态系统中每一个子系统只能解决某一个特定的问题域。
每个组件都有自己的应用场景
hadoop生态系统的特点:

  • 开源,社区活跃
  • 囊括了大数据处理的方方面面
  • 成熟的生态圈

1、Hadoop核心之分布式文件系统HDFS

Hadoop分布式文件系统(Hadoop Distributed File System,简称HDFS)是Hadoop的核心模块之一,它主要解决Hadoop的大数据存储问题,其思想来源与Google的文件系统GFS。HDFS的主要特点:

保存多个副本,且提供容错机制,副本丢失或宕机自动恢复。默认存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的作用。

客户端如何访问HDFS中一个文件呢?具体流程如下:

1)首先从Namenode获得组成这个文件的数据块位置列表。

2)接下来根据位置列表知道存储数据块的Datanode。

3)最后访问Datanode获取数据。

注意:Namenode并不参与数据实际传输。

数据存储系统,数据存储的可靠性至关重要。HDFS是如何保证其可靠性呢?它主要采用如下机理:

1)冗余副本策略,即所有数据都有副本,副本的数目可以在hdfs-site.xml中设置相应的复制因子。

2)机架策略,即HDFS的“机架感知”,一般在本机架存放一个副本,在其它机架再存放别的副本,这样可以防止机架失效时丢失数据,也可以提供带宽利用率。

3)心跳机制,即Namenode周期性从Datanode接受心跳信号和快报告,没有按时发送心跳的Datanode会被标记为宕机,不会再给任何I/O请求,若是Datanode失效造成副本数量下降,并且低于预先设置的阈值,Namenode会检测出这些数据块,并在合适的时机进行重新复制。

4)安全模式,Namenode启动时会先经过一个“安全模式”阶段。

5)校验和,客户端获取数据通过检查校验和,发现数据块是否损坏,从而确定是否要读取副本。

6)回收站,删除文件,会先到回收站/trash,其里面文件可以快速回复。

7)元数据保护,映像文件和事务日志是Namenode的核心数据,可以配置为拥有多个副本。

8)快照,支持存储某个时间点的映像,需要时可以使数据重返这个时间点的状态。

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的工作量。

2、Hadoop核心之MapReduce

Hadoop核心之MapReduce是一个软件框架,基于该框架能够容易地编写应用程序,这些应用程序能够运行在由上千个商用机器组成的大集群上,并以一种可靠的,具有容错能力的方式并行地处理上TB级别的海量数据集。这个定义里面有着这些关键词,一是软件框架,二是并行处理,三是可靠且容错,四是大规模集群,五是海量数据集。
MapReduce擅长处理大数据,它为什么具有这种能力呢?这可由MapReduce的设计思想发觉。MapReduce的思想就是“分而治之”。Mapper负责“分”,即把复杂的任务分解为若干个“简单的任务”来处理。“简单的任务”包含三层含义:一是数据或计算的规模相对原任务要大大缩小;二是就近计算原则,即任务会分配到存放着所需数据的节点上进行计算;三是这些小任务可以并行计算,彼此间几乎没有依赖关系。Reducer负责对map阶段的结果进行汇总。至于需要多少个Reducer,用户可以根据具体问题,通过在mapred-site.xml配置文件里设置参数mapred.reduce.tasks的值,缺省值为1。
MapReduce的整个工作过程如上图所示,它包含如下4个独立的实体:

1)客户端,用来提交MapReduce作业。

2)jobtracker,用来协调作业的运行。

3)tasktracker,用来处理作业划分后的任务。

4)HDFS,用来在其它实体间共享作业文件。

MapReduce整个工作过程有序地包含如下工作环节:

1)作业的提交

2)作业的初始化

3)任务的分配

4)任务的执行

5)进程和状态的更新

6)作业的完成

3、HDFS架构

(1) 主从结构

•主节点,只有一个: namenode

•从节点,有很多个: datanodes

(2) namenode负责:管理

•接收用户操作请求,可以实现对文件系统的操作(一般的操作方式有两种,命令行方式和Java API方式)

•维护文件系统的目录结构(用来对文件进行分类管理)。

•管理文件与block之间关系(文件被划分成了Block,Block属于哪个文件,以及Block的顺序好比电影剪辑),block与datanode之间关系。

(3) datanode负责:存储

•存储文件

•文件被分成block(block一般是以64M来划分,但每个Block块所占用的空间是文件实际的空间)存储在磁盘上,将大数据划分成相对较小的block块,这样可以充分利用磁盘空间,方便管理。

•为保证数据安全,文件会有多个副本(就好比配钥匙,都是为了预防丢失),这些副本会一块一块复制,分别存储在不同的DataNode上。

4、MapReduce架构

(1)主从结构

•主节点,只有一个: JobTracker

•从节点,有很多个: TaskTrackers

(2)JobTracker 负责:

•接收客户提交的计算任务

•把计算任务分给TaskTrackers执行

•监控TaskTracker的执行情况

(3)TaskTrackers负责:

•执行JobTracker分配的计算任务

5、Hadoop的特点

(1) 扩容能力(Scalable):能可靠地(reliably)存储和处理千兆字节(PB)数据。

(2) 成本低(Economical):可以通过普通机器组成的服务器群来分发以及处理数据。这些服务器群总计可达数千个节点。

(3) 高效率(Efficient):通过分发数据,hadoop可以在数据所在的节点上并行地处理它们,这使得处理非常的快速。

(4) 可靠性(Reliable):hadoop能自动地维护数据的多份副本,并且在任务失败后能自动地重新部署计算任务。

6、namenode的发生故障的解决方案

方案一:在非namenode节点上备份那些组成文件系统元数据持久状态的文件,然后利用备份namenode执行这些文件(冷启动)。

方案二:利用检查点进行故障恢复即利用辅助namenode,辅助namenode不能充当namenode,但是备用namenode可以充当辅助namenode。

备用namenode如何代替主namenode:基于Zookeeper,Zookeeper Failover Controller(ZKFC)会监控NameNode的健康状态,NameNode会向Zookeeper注册,当主NameNode挂掉后,ZKFC为NameNode竞争锁,获得ZKFC锁的NameNode变为active。

4)辅助namenode为namenode创建检查点机制

a、secondNamenode请求主namenode停止使用正在进行中的edit文件,这样新的编辑操作记录到一个新文件中edit.new

b、secondNamenode从主nomanode获取最近的fsimage和edit文件.

c、SecondNamenode将fsimage文件载入内存,逐一执行edit文件中的操作.创建新的fsimage即fsimage.ckpt。

d、辅助namenode将新的fsimage文件发送回namenode,NameNode将fsimage.ckpt与edits.new文件分别重命名为fsimage与edits,然后更新fsimage。

5)datanode

数据块在datanode上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是数据块元数据即数据块的长度,块数据的校验和,以及时间戳。心跳是每3秒一次,心跳返回结果带有namenode给该datanode的命令如复制块数据到另一台机器,或删除某个数据块。如果超过10分钟没有收到某个datanode的心跳,则认为该节点不可用。

6)数据块:HDFS默认有块的概念,磁盘块大小一般为512字节,而HDFS2.0的块大小默认为128MB,HDFS上的文件被划分为块大小的多个分块,作为独立的存储单元。与面向单一磁盘的文件系统不同的是,HDFS中小于一个块大小的文件不会占据整个块的空间。如一个1MB的文件存储在一个128MB块中时,文件只是使用1MB的磁盘空间。

a、HDFS中块的大小为什么比磁盘块大:目的是为了最小化寻址开销,如果块足够大,从磁盘传输的时间会明显大于定位这个块开始位置所需的时间,因此传输一个由多个快组成的大文件的时间取决于磁盘传输速率。

b、为什么块不能设置过大:MR中的map认为一般处理一个块中数据,如果任务数较少,作业运行速度将会比较慢。

c、使用块作为HDFS的最小存储单元的好处:

1.一个文件的大小可以大于网络中任意磁盘的容量,文件的所有块并不需要存储在同一个磁盘中。

2.利用块而不是整个文件作为存储单元可以简化存储管理(块大小固定,单个磁盘能存储多少个块就相对容易),消除对元数据的顾虑(块只存储真正的数据,而文件的元数据不会与块一同存储,其他系统可以单独管理这些元数据)

3.块适合数据备份进而提供容错能力和提高可用性,默认块的备份为3个,确保数据不会丢失,发现一个块不可用,系统会从其他地方读取另外一个副本。

4)DataNode发生故障的处理方案步骤:

a、排查datanode机器的硬件、网络等环境,确认是否是datanode本身节点问题;

b、关闭处于dead状态节点的datanode、nodemanager进程即hadoop-daemon.sh stop datanode,yarn-daemon.sh stop nodemanager

c、重启dead状态节点的datanode、nodemanager进程即hadoop-daemon.sh start datanode,yarn-daemon.sh start nodemanager。

5)hdfs上传写数据的过程:

a、client跟NameNode通信请求上传文件,NameNode检查目标文件是否存在以及client是否有新建此文件的权限.

b、若通过检查,NameNode就会为创建一条记录,记录该新建文件的信息.若未通过检查就会抛出异常.

c、然后NameNode向客户端返回可以新建文件的信息以及相应的一组datanode,Client就近原则请求3台中的一台DataNode 1上传数据(本质上是一个RPC调用,建立pipeline)DataNode 1收到请求会继续调用DataNode 2,然后DataNode 2调用DataNode 3,将整个pipeline(管线)建立完成,然后逐级返回客户端。

d、Client将文件分成一个个数据包写入到数据队列中,往DN1上传第一个块,以数据包为单位.DN1收到一个数据包就会传给DN2,DN2传给DN3。

c、当DN 3写完最后一个pocket时,就会返回确认消息给DN2,DN2返回确认消息给DN1,然后返回给客户端,最后由客户端返回给namenode.

6)hdfs读取数据的过程:

a、client与NameNode通信查询元数据,找到文件块所在的DataNode,namenode将相应的元数据信息返回给client.

b、client根据元数据信息挑选一台DataNode(网络拓扑上的就近原则,如果都一样,则随机挑选一台DataNode),请求建立socket流,以packet为单位进行发送.

c、DataNode开始发送数据,客户端以packet为单位接收,先在本地缓存,然后写入目标文件。

7、MapReduce

(1)mapreduce的过程

1)split过程:在map task执行时,它的输入数据来源于HDFS的block。在MapReduce中,map task只读取split。Split与block的对应关系可能是多对一,默认是一对一。输入分片存储的并不是数据本身,而是一个分片长度和一个记录数据的位置的数组。inputFormat一行一行的读取文件,按行分割形成<key,value>对。其中key为偏移量,value为每行数据内容。

2)partition过程:在经过mapper的运行后,输出结果是一个key/value对,MapReduce提供Partitioner接口,它根据key决定当前的这对输出数据最终应该交由哪个reduce task处理。默认是对key hash后再对reduce task数量取模。之后key/value对以及Partition的结果将会被序列化写入map中环形内存缓冲区中,缓冲区的作用是批量收集map结果,减少磁盘IO的影响。

3)溢写过程:map中的环形内存缓冲区其实是字节数组,是有大小限制的,默认是100MB。当达到环形缓冲区的阈值即80%时,map的输出结果依然会写入到剩余20%的缓冲区中同时会启动溢写线程,对环形缓冲区中80%的数据按照被序列化的后key+partitionsID进行排序。如果有combiner函数就将有相同key的value加起来,减少溢写到磁盘的数据量,使输出结果更加紧凑。

4)merger溢写文件:如果map的输出结果非常大,则会产生多个溢出文件。此时会将多个溢写文件合并成一个文件,若有设置Combiner,则也会使用Combiner来合并相同的key。 合并后的文件存放在本地磁盘中,而不是HDFS上。

5)copy过程:简单地拉取数据。Reduce进程启动一些数据copy线程(Fetcher),通过HTTP方式请求map task的输出文件。因为map task早已结束,这些文件就归TaskTracker管理在本地磁盘中。

6)Merge阶段:合并不同map端copy来的数据。不断地merge后,最后会生成一个“最终文件”,此文件可能存在于磁盘上,也可能存在内存中。直接作为Reducer的输入。默认情况下,此文件是存放于磁盘中的。

(3)map任务个数的计算

1)默认map个数:如果不进行任何设置,一个块就对应一个map任务:num = fileSize / blockSize;

2)设置map个数:通过参数mapred.map.tasks来可以map个数,但此设置个数只有在大于(1)中num的时候,才会生效,goalNum = mapred.map.tasks;。

3)设置处理文件大小: 可以通过mapred.min.split.size 设置每个task处理的文件大小,但是此设置大小只有在大于blockSize的时候才会生效。

splitSize = max(mapred.min.split.size, block_size);

splitNum = total_size / split_size;

4)总结map个数的设置:

a、如果想增加map个数,则设置mapred.map.tasks 为一个较大的值。

b、如果想减小map个数,则设置mapred.min.split.size 为一个较大的值。

c、如果输入中有很多小文件,依然想减少map个数,则需要将小文件merger为大文件,然后使用准则2。

(4)mapreduce中使用到的排序

MapTask和Reduce Task都会对数据按照key排序,MapReduce中使用了两种排序算法:快速排序和归并排序。在Map和Reduce Task的缓冲区使用的是快速排序,而对磁盘上的IFile文件合并使用的是归并排序。

(5)combiner函数解析

1)为什么需要combiner函数:运行combiner函数在map端进行局部聚合操作,使map的输出结果更加紧凑,因此减少到写到磁盘上的数据和传递给reduce的数据

2)conmbiner函数何时被使用:先是分区partition,然后根据hash(key)+partition排序,最后使用Combiner进行局部聚合;merger溢写文件时也会使用combiner函数合并相同的Key所对应的value。

3)combiner为何不适用于求平均数:在求取平均数时,因为添加的Combiner组件是与reduce组件具有相同的逻辑,会提前求一次平均值后传给reduce类,导致求取的平均值错误。例如,求0、20、10、25和15的平均数,直接使用Reduce求平均数Average(0,20,10,25,15),得到的结果是14, 如果先使用Combiner分别对不同Mapper结果求平均数,Average(0,20,10)=10,Average(25,15)=20,再使用Reducer求平均数Average(10,20),得到的结果为15,很明显求平均数并不适合使用Combiner。

(6)mapreduce的优化

1)数据的输入:合并小文件,在执行mr任务前将小文件进行合并,大量的小文件会产生大量的map任务。

2)map阶段调优

a、设置参数增大触发spill的内存上限,减少spill次数,从而减少磁盘IO。

b、先进行combine处理,使数据更加紧凑,减少磁盘IO

c、减少合并(merge)次数:增大merge的文件数目,减少merge的次数,从而缩短mr处理时间。

3)reduce阶段

a、合理设置map和reduce数:太少,会导致task等待,延长处理时间;太多,会导致 map、reduce任务间竞争资源,造成处理超时等错误。

b、合理设置reduce端的buffer:默认情况下,数据达到一个阈值的时候,buffer中的数据就会写入磁盘,然后reduce会从磁盘中获得所有的数据。buffer和reduce是没有直接关联的,中间多个一个写磁盘->读磁盘的过程,既然如此可以通过参数来配置,使得buffer中的一部分数据可以直接输送到reduce,从而减少IO开销。mapred.job.reduce.input.buffer.percent,默认为0.0。当值大于0的时候,会保留指定比例的内存读buffer中的数据直接拿给reduce使用。

4)数据倾斜

a、自定义分区

b、Combine:使用Combine可以大量地减小数据倾斜。

c、采用Map Join,尽量避免Reduce Join

8、YARN

(1)yarn的介绍:

MR和Spark作为YARN的应用运行在集群计算层和集群的存储层上的,Yarn整体上属于master/slave模型,主要依赖于三个组件来实现功能,分别是ResourceManager,ApplicationMaster,NodeManager。

1)ResourceManager:管理集群上的资源,包括两部分调度器Scheduler,应用管理ApplicationManager。

a、Scheduler负责各个运行中的应用的资源分配,受到资源容量,不负责应用程序的监控和状态追踪,而是基于应用程序的资源需求执行其调度功能,使用了叫做资源容器container的概念,container封装了某个节点上的多维度资源,如内存、CPU、磁盘、网络等,当AM向RM申请资源时,RM为AM返回的资源便是用Container表示的。YARN会为每个任务分配一个Container,且该任务只能使用该Container中描述的资源。

b、ApplicationManager主要负责接收application的提交请求,为应用分配第一个Container来运行ApplicationMaster,还有就是负责监控ApplicationMaster,在遇到失败时重启ApplicationMaster运行的Container。

2)NodeManager:主要负责与ResourceManager通信,负责启动和管理应用程序的container,监控container的资源使用情况(cpu和内存等),跟踪节点的监控状态,管理日志等。并报告给RM。

3)ApplicationMaster:每个应用程序都有自己的ApplicationMaster,ApplicationMaster负责与scheduler协商合适的container,跟踪应用程序的状态。

通过将资源管理和应用程序两部分分剥离开,分别由ResouceManager和ApplicationMaster负责,其中,ResouceManager专管资源管理和调度,而ApplicationMaster则负责与具体应用程序相关的任务切分、任务调度和容错等,每个应用程序对应一个ApplicationMaster。

(2) YARN的运行机制

1)客户端提交application到ResourceManager并请求一个ApplicationMaster实例。

2)ResourceManager找到一个可以运行Container的NodeManager,在这个Container中启动ApplicationMaster,并建立ApplicationMaster的RPC端口和用于跟踪的URL,用来监控application的状态。

3)AM向RM进行注册后,ApplicationMaster向ResourceManager请求资源,ResourceManager根据资源调度策略尽可能最优的为AM分配container资源。

4)Container被成功分配后AM向NodeManager发送信息启动Container,并在启动的Container中运行任务,并把任务运行的进度状态信息发送给AM。

5)当所有任务完成之后,AM将所用到的Container归还给系统,并且注销。此时分布式应用执行结束。

(3)yarn的资源调度算法

1)FIFO调度器(FIFO Scheduler):将应用放置在第一个队列中,然后按照提交的顺序(先进先出)运行应用。首先为队列中第一个应用的请求分配资源,第一个应用的请求被满足后再一次为队列中下一个应用服务。优点是简单易懂不需要任何配置,但是不适合共享集群,当使用FIFO调度器时,小作业一直被阻塞,直至大作业完成。

2)容量调度器(Capacity Scheduler):yarn中默认的调度器,通过为每个组织分配专门的队列,然后再为每个队列分配一定的集群资源,这样整个集群就可以通过设置多个队列的方式给多个组织提供服务了。除此之外,队列内部又可以垂直划分,这样一个组织内部的多个成员就可以共享这个队列资源了,在一个队列内部,资源的调度是采用的是先进先出(FIFO)策略。

3)公平调度器(Fair Scheduler):公平调度器不需要预留一定量的资源,因为调度器会在所有运行的作业之间动态平衡资源。第一个(大)作业启动时,它是唯一运行的作业,因而获得集群中所有的资源。当第二个(小)作业启动时,它被分配到集群的一半资源,这样每个作业都能公平共享资源。

(4)YARN的资源隔离方案

1)对于CPU而言,它是一种“弹性”资源,使用量大小不会直接影响到应用程序的存亡,因此CPU的资源隔离方案采用了Linux Kernel提供的轻量级资源隔离技术ControlGroup;yarn使用cgroup的两种方式来控制cpu资源分配,分别是严格按核数隔离资源和按比例隔离资源.

ControlGroup:先对计算机的某个资源设置了一些限制规则,如只能使用 CPU 的20%。若我们想一些进程去遵守这个使用 CPU 资源的限制的话,就将它加入到这个规则所绑定的进程组中,之后,相应的限制就会对其生效。

2)内存的隔离:对于内存而言,它是一种“限制性”资源,使用量大小直接决定着应用程序的存亡,Cgroup会严格限制应用程序的内存使用上限,一旦使用量超过预先定义的上限值,就会将该应用程序“杀死”,因此无法使用Cgroup进行内存资源隔离,而是选择了线程监控的方式。

5、Hadoop的高可用性。

(1)HDFS和MapReduce以及YARN单点故障解决方案:

手动模式:通过命令实现主备之间的切换,可以用在HDFS升级等场合。

自动模式:基于Zookeeper。Zookeeper Failover Controller(ZKFC)会监控NameNode的健康状态,并向Zookeeper注册NameNode,当主NameNode挂掉后,ZKFC为备NameNode竞争锁,获得锁的NameNode变为active。

(2)Hadoop中高可用的组件如下:

1)SharedStorage共享存储系统:active master将信息写入共享存储系统,而standby master则读取该信息以保持与active master的同步,从而减少切换时间。

2)ZKFailoverController:zkfc会周期性的向它监控的namenode(每个namenode各有一个zkfc)发生健康探测命令,来鉴定namenode是否处于正常工作状态,如果机器宕机,心跳失败,那么zkfc就会标记它处于不健康的状态;主要由两个核心组件构成:ActiveStandbyElector和HealthMonitor

a、HealthMonitor负责监控各个活动master的状态,以根据它们状态进行状态切换。如主namenode磁盘空间不足。

c、ActiveStandbyElector负责与zookeeper集群交互,通过尝试获取全局锁,以判断所管理的master进入active还是standby状态;

4)Zookeeper集群:核心功能通过维护一把全局锁控制整个集群有且仅有一个active master。

(3)常用的共享存储系统:zookeeper被YARN HA采用;HDFS被MapReduce HA采用;zookeeper,被HDFS HA采用。

(4)ZKFailoverController如何申请锁:

若每个namenode是健康的,则每个NN所对应的zkfc会在zookeeper中保持一个打开的会话;对于active状态的namenode,其zkfc还会在zookeeper中占有一个短暂类型的znode,当主namenode挂掉时,其znode将会被删除,其ZKFailoverController跟主NameNode无法通信,此时主NN所对应的FailoverController就会把主NN宕机的信息汇报给Zookeeper,其它的ZKFailoverController便从ZK中得到了这条信息,然后它们给各自监控的NameNode发送切换指令。当其中一个备用namenode率先得到这把锁,即可升级为主namenode,同时标记状态为active,当宕机的namenode,重新启动,他会再次注册zookeeper,若发现已经有znode了,就自动变为standby状态,如此往复循环,保证高可靠性。

(5)主备namenode如何保持同步:两个NameNode为了数据同步,会通过一组称作JournalNodes的独立进程进行相互通信。当active状态的NameNode的命名空间有任何修改时,会告知大部分的JournalNodes进程。standby状态的NameNode有能力读取JNs中的变更信息,并且一直监控edit log的变化,把变化应用于自己的命名空间。standby可以确保在集群出错时,命名空间状态已经完全同步了。

(6)实现高可用可能会出现的问题:

1)脑裂:脑裂是指在主备切换时,由于切换不彻底或其他原因,导致客户端和Slave误以为出现两个active master,最终使得整个集群处于混乱状态。

2)解决脑裂问题,通常采用隔离(Fencing)机制,隔离要求:

a、共享存储fencing:确保只有一个Master往共享存储中写数据。

b、客户端fencing:确保只有一个Master可以响应客户端的请求。

c、Slave fencing:确保只有一个Master可以向Slave下发命令。

3)Hadoop公共库中有哪几种隔离机制:

a、sshfence:sshfence是指通过ssh登陆目标Master节点上,使用命令fuser将进程杀死(通过tcp端口号定位进程pid,该方法比jps命令更准确)

b、shellfence:shellfence是指执行一个用户事先定义的shell命令(脚本)完成隔离

9、请列出正常的hadoop集群中hadoop都分别需要启动 哪些进程,他们的作用分别都是什么,请尽量列的详细一些。

namenode:负责管理hdfs中文件块的元数据,响应客户端请求,管理datanode上文件block的均衡,维持副本数量

Secondname:主要负责做checkpoint操作;也可以做冷备,对一定范围内数据做快照性备份。

Datanode:存储数据块,负责客户端对数据块的io请求

Jobtracker :管理任务,并将任务分配给 tasktracker。

Tasktracker: 执行JobTracker分配的任务。

Resourcemanager

Nodemanager

Journalnode

Zookeeper

Zkfc

10、请写出以下的shell命令

(1)杀死一个job

(2)删除hdfs上的 /tmp/aaa目录

(3)加入一个新的存储节点和删除一个节点需要执行的命令

答:(1)hadoop job –list 得到job的id,然后执行 hadoop job -kill jobId就可以杀死一个指定jobId的job工作了。

(2)hadoopfs -rmr /tmp/aaa

(3)增加一个新的节点在新的几点上执行

Hadoop daemon.sh start datanode

Hadooop daemon.sh start tasktracker/nodemanager

下线时,要在conf目录下的excludes文件中列出要下线的datanode机器主机名

然后在主节点中执行 hadoop dfsadmin -refreshnodes

下线一个datanode删除一个节点的时候,只需要在主节点执行

hadoop mradmin -refreshnodes

下线一个tasktracker/nodemanager

11、请简述hadoop怎样实现二级排序(就是对key和value双排序)

第一种方法是,Reducer将给定key的所有值都缓存起来,然后对它们再做一个Reducer内排序。但是,由于Reducer需要保存给定key的所有值,可能会导致出现内存耗尽的错误。

第二种方法是,将值的一部分或整个值加入原始key,生成一个组合key。这两种方法各有优势,第一种方法编写简单,但并发度小,数据量大的情况下速度慢(有内存耗尽的危险),

第二种方法则是将排序的任务交给MapReduce框架shuffle,更符合Hadoop/Reduce的设计思想。这篇文章里选择的是第二种。我们将编写一个Partitioner,确保拥有相同key(原始key,不包括添加的部分)的所有数据被发往同一个Reducer,还将编写一个Comparator,以便数据到达Reducer后即按原始key分组。

12、MapReduce优化经验

答:(1.)设置合理的map和reduce的个数。合理设置blocksize

(2.)避免出现数据倾斜

(3.combine函数

(4.对数据进行压缩

(5.小文件处理优化:事先合并成大文件,combineTextInputformat,在hdfs上用mapreduce将小文件合并成SequenceFile大文件(key:文件名,value:文件内容)

(6.参数优化

13、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将结果数据输出

资料来源

Hadoop面试题总结(大数据面试)相关推荐

  1. Elasticsearch面试题(大数据面试)

    概述 Elasticsearch 是一个分布式可扩展的实时搜索和分析引擎,一个建立在全文搜索引擎 Apache Lucene™ 基础上的搜索引擎.基于RESTful web接口.Elasticsear ...

  2. 大数据面试之新浪面试题

    大数据面试之新浪面试题 学长1 一面 1)自我介绍 叫什么名字,来自哪里,本科哪个学校,硕士哪个学校,大数据做了多长时间,对Hadoop生态圈以及Spark生态圈中的哪些技术比较了解(很简单的一句就带 ...

  3. 大数据面试之360面试题

    大数据面试之360面试题 学长1 1)技术部分 (1)常用的Linux命令,Shell的awk.sed.sort.cut是用来处理什么问题的? (2)Hive有自带的解析json函数,为什么还要自定义 ...

  4. 大数据面试-06-大数据工程师面试题

    3.14 1.一个Hadoop环境,整合了HBase和Hive,是否有必要给HDFS和Hbase都分别配置压缩策略?请给出对压缩策略的建议. hdfs在存储的时候不会将数据进行压缩,如果想进行压缩,我 ...

  5. 大数据面试之Hadoop

    大数据面试之Hadoop 1.Hadoop 1.1 架构模型 1.1.1 1.x的版本架构模型 1.1.2 2.x的版本架构模型 1.2 有哪些角色?每个角色的功能? 1.3 Hadoop的shuff ...

  6. python人工智能面试题爱奇艺面试题_【爱奇艺Python面试】爱奇艺大数据面试 python-看准网...

    爱奇艺大数据面试 python 通知的今天上午11点爱奇艺一轮面试,今天!周末!周末!周末!竟然还要面试,内心很无语,上个星期人家腾讯还是周一面试呢,但是,想想宿舍的一个小伙伴今天上午9点半的面试,庆 ...

  7. 大数据面试求职经验总结

    写在前面:空杯心态,多投多改,把握好校招机会,它是你最容易通往大厂的机会. 面试经验分享: 1. 提前了解应聘公司信息,知道该公司是做什么的,发展情况,招聘的岗位的要求等 : 2.面试不要说自己是培训 ...

  8. 精选大数据面试真题10道(附答案详细解析)

    大数据笔面试系列文章分为两种类型:混合型(即一篇文章中会有多个框架的知识点-融会贯通):专项型(一篇文章针对某个框架进行深入解析-专项演练). 此篇文章为系列文章的第一篇(混合型) 第一题:大数据笔试 ...

  9. 面试系列一:精选大数据面试真题10道(混合型)-附答案详细解析

    本公众号(五分钟学大数据)将推出大数据面试系列文章-五分钟小面试,此系列文章将会深入研究各大厂笔面试真题,并根据笔面试题扩展相关的知识点,助力大家都能够成功入职大厂! 大数据笔面试系列文章分为两种类型 ...

  10. 大数据面试杀招——Spark高频考点,必知必会!

    前面两篇文章分别为大家介绍了大数据面试杀招 关于Hive 与 Hadoop 的内容,收到读者朋友们一致的好评和赞赏.嘿嘿,本篇文章我们就继续来研究,关于Spark的面试热点,又有哪些~ 一.你是怎么理 ...

最新文章

  1. java 安装界面广告_用javascript实现仿163的js广告向下挤压页面的效果
  2. java矩阵传递给r_从JAVA调用R得到卡方统计和p值
  3. php ucwords,WordPress博客程序中Platinum SEO Pack SEO插件设置图解介绍
  4. ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
  5. HDU多校1 - 6756 Finding a MEX(分块+二分+树状数组)
  6. 获得最新纪录 sql
  7. Linux并发与竞争实验(一次只允许一个应用程序操作LED灯)
  8. 浏览器如何生成URL
  9. sql怎样删除重复值
  10. Nginx应用场景之动静分离
  11. 的mvc_浅谈MVC
  12. 数字在排序数组中的出现次数
  13. 计算机打开共享网络连接打印机共享打印机,WIN7怎么连接共享打印机?如何设置和连接局域网共享打印机...
  14. 让一个视图对触摸事件作出响应, 需要实现的方法
  15. 用中位数代替平均数来衡量民生指标
  16. Jmeter 接口自动化执行报错 无法找到类或者类的方法
  17. WIN10重新下载安装MicroSoft Store的三种方法
  18. 马蜂窝张矗:绩效考核是为了激发工作潜力,而不是逃避问题
  19. 使用UCSC基因组浏览器可视化测序深度分布数据
  20. 寻宝游戏(DFS+动态规划)

热门文章

  1. 深入解读OpenSURF中快速黑塞矩阵计算的思想——FastHessian_buildResponseLayer
  2. 【Python刷题篇】——Python入门 01 输入输出
  3. ubuntu 18.04安装绿联千兆USB网卡的AX88179芯片驱动(编译报错解决)
  4. 常见的工业通讯协议有哪些
  5. 人工智能可以产生自主意识吗?
  6. 结构梁配筋最牛插件_??Webpack 插件开发如此简单!
  7. 魔鬼训练Day2作业
  8. vs2018 设置了包含路径还是提示说打不开头文件
  9. Mac最好用的RSS阅读器Reeder使用方法
  10. 初识STM32之选型