简述Hadoop版本区别:

Hadoop发行版本分为开源社区版和商业版,社区版是指由Apache软件基金会维护的版本,是官方维护的版本体系。商业版Hadoop是指由第三方商业公司在社区版Hadoop基础上进行了一些修改、整合以及各个服务组件兼容性测试而发行的版本,例如比较著名的有Cloudera公司的CDH版本。

 

简述什么是SSH以及SSH协议解决的问题。

SSH为Secure Shell的缩写,它是一种网络安全协议,专为远程登录会话和其他网络服务提供安全性的协议。通过使用SSH服务,可以把传输的数据进行加密,有效防止远程管理过程中的信息泄露问题。

 

简述Hadoop集群部署方式以及各方式使用场景。

(1)独立模式:又称为单机模式,在该模式下,无需运行任何守护进程,所有的程序都在单个JVM上执行。独立模式下调试Hadoop集群的MapReduce程序非常方便,所以一般情况下,该模式在学习或者开发阶段调试使用。

(2)伪分布式模式:Hadoop程序的守护进程运行在一台节点上,通常使用伪分布式模式用来调试Hadoop分布式程序的代码,以及程序执行是否正确,伪分布式模式是完全分布式模式的一个特例。

(3)完全分布式模式:Hadoop的守护进程分别运行在由多个主机搭建的集群上,不同节点担任不同的角色,在实际工作应用开发中,通常使用该模式构建企业级Hadoop系统。

 

简述HDFS上传文件工作流程

HDFS写数据原理

  1. 客户端发起上传文件请求,通过RPC (远程过程调用)与NameNode建立通讯。

 

2.NameNode检查元数据文件的系统目录树。

 

3.若系统目录树的父目录不存在该文件相关信息,返回客户端可以上传文件。

 

4.客户端请求上传第一个Block数据块以及数据块副本的数量。

 

5.NameNode检测元数据文件中DataNode信息池,找到可用的数据节点。

 

6.将可用的数据节点的ip地址返回给客户端。

 

7.客户端请求3台节点中的一台服务器DataNode_ 01.,进行传送数据,DataNode_ 01.收到请求会继续调用DataNode_ 02,然后服务器DataNode_ 02调用服务器DataNode_ 03.

 

8.DataNode之间建立Pipeline后,逐个返回建立完毕信息。

 

9.客户端与DataNode建立数据传输流,开始发送数据包。(数据以数据包的形式进行发送)

 

10 。客户端向DataNode_ 01.上传第一个Block数据块,是以Packet为单位(默认64k)发送数据块的。 当DataNode_ 01收到一个Packet就会传给DataNode 02,DataNode 02传给DataNode_ 03,DataNode 01每传送一个Packet都会放入一个应答队列等待应答。

 

11.数据被分割成一个个Packet数据包在Pipeline. 上依次传输,而在Pipeline反方向上,将逐个发送Ack(命令正确应答),最终由Pipeline中第- -个DataNode节点DataNode 01将Pipeline的Ack信息发送给客户端。

 

12.DataNode返回给客户端,第一个Block块传输完成。客户端则会再次请求NameNode.上传第二个Block块和第三块到服务器上,重复上面的步骤,直到3个Block都.上传完毕。

 

HDFS读数据原理

 

  1. 客户端向NameNode发起RPC请求,来获取请求文件Block数据块所在的位置。

 

2.NameNode检测元数据文件,会视情况返回Block块信息或者全部Block块信息,对于每个Block块,NameNode都会返回含有该Block副本的DataNode地址。

 

3. 客户端会选取排序靠前的DataNode来依次读取Block块,每一个Block都会进行CheckSum,若文件不完整,则客户端会继续向NameNode获取下一-批的Block列表,直到验证读取出来文件是完整的,则Block读取完毕。

 

4.客户端会把最终读取出来所有的Block块合并成一个完整的最终文件。

 

HDFS优缺点

优点:高容错、流式数据访问、支持超大文件高数据、吞吐量

缺点:高延迟、不适合小文件存取、不适合并发写入

 

Namenode:NameNode是HDFS集群的主服务器。一旦NameNode关闭,就无法访问Hadoop集群。NameNode主要以元数据的形式进行管理和存储,用于维护文件系统名称并管理客户端对文件的访问;NameNode记录对文件系统名称空间或其属性的任何更改操作;HDFS负责整个数据集群的管理,并且在配置文件中可以设置备份数量,这些信息都由NameNode存储。

 

Datanode:DataNode是HDFS集群中的从服务器。文件系统存储文件的方式是将文件切分成多个数据块,这些数据块实际上是存储在DataNode节点中的,因此DataNode机器需要配置大量磁盘空间。它与NameNode保持不断的通信,DataNode在客户端或者NameNode的调度下,存储并检索数据块,对数据块进行创建、删除等操作,并且定期向NameNode发送所存储的数据块列表。

 

Block:每个磁盘都有默认的数据块大小,这是磁盘进行数据读/写的最小单位,HDFS同样也有块(block)的概念,它是抽象的块,而非整个文件作为存储单元,在Hadoop2.x版本下,默认大小是128M,且备份3份,每个块尽可能地存储于不同的DataNode中。按块存储的好处主要是屏蔽了文件的大小,提供数据的容错性和可用性。

 

Rack:是用来存放部署Hadoop集群服务器的机架,不同机架之间的节点通过交换机通信,HDFS通过机架感知策略,使NameNode能够确定每个DataNode所属的机架ID,使用副本存放策略,来改进数据的可靠性、可用性和网络带宽的利用率。

 

元数据:元数据从类型上分可分三种信息形式,一是维护HDFS文件系统中文件和目录的信息,二是记录文件内容存储相关信息,三是用来记录HDFS中所有DataNode的信息,用于DataNode管理。

 

 

简述NameNode管理分布式文件系统的命名空间

在NameNode内部是以元数据的形式,维护着两个文件,分别是FsImage镜像文件和EditLog日志文件。其中,FsImage镜像文件用于存储整个文件系统命名空间的信息,EditLog日志文件用于持久化记录文件系统元数据发生的变化。当NameNode启动的时候,FsImage镜像文件就会被加载到内存中,然后对内存里的数据执行记录的操作,以确保内存所保留的数据处于最新的状态,这样就加快了元数据的读取和更新操作。

 

简述HDFS Block与MapReduce split之间的联系。

Block:HDFS中最小的数据存储单位,默认是128M;Split:MapReduce中最小的计算单元,默认与Block一一对应。

两者的对应关系是任意的,可有用户控制。

 

简述Shuffle工作流程。

Shuffle工作原理

Map阶段

(1) MapTask处理的结果会暂且放人一个内存缓冲区中(该缓冲区默认大小是100MB) ,当缓冲区快要溢出时(默认达到缓冲区大小的80%),会在本地文件系统创建一个溢出文件,将该缓冲区的数据写入这个文件。

 

(2)写盘之前,线程会根据reduceTask的数量,将数据分区,一个Reduce任务对应一个分区的数据。这样做能避免有些reduce任务分配到大量数据,而有些reduce任务分到很少的数据,甚至没有分到数据的情况。

 

(3)分完数据后,排序每个分区的数据,如果设置了Combiner,将会对排序后的结果进行Combine操作,这样做能尽可能少地执行数据写盘的操作。

 

(4)当Map任务输出最后一个记录时,可能有很多溢出文件,这时需要将这些文件合并,合并的过程中会不断地进行排序和Combine操作,其目的有两个:一是尽量减少每次写盘的数据量;二是尽量减少下一复制阶段网络传输的数据量。最后合并成了一个已分区且已排序的文件。

 

Reduce阶段

(1) Reduce 会接收到不同map任务传来的数据,并且每个map传来的数据都是有序的。如果Reduce阶段接收的数据量相当小,则直接存储在内存中,如果数据量超过了该缓冲区大小的一定比例,则对数据合并后溢写到磁盘中。

 

(2)随着溢写文件的增多,后台线程会将它们合并成一个更大的有序的文件,这样做是为了给后面的合并节省时间。

 

(3)合并的过程中会产生许多的中间文件(写入磁盘了),但MapReduce会让写入磁盘的数据尽可能地少,并且最后- -次合并的结果并没有写人磁盘,而是直接输人到reduce函数。

 

MapReduce核心思想:“分而治之”

Map阶段:任务分解(小任务之间没有必然的依赖关系,可以单独执行)

Reduce阶段:合并任务,把Map阶段的结构进行全局汇总。

 

.MapReduce编程模型

处理大规模数据集并行运算。借鉴函数式程序设计语言思想进行,分为Map()和Reduce()两个函数

 

 

MapReduce工作原理

1.分片、格式化数据源

分片:将源文件划分为大小相等的小数据块(默认128M),Hadoop会为每个分片构建一个Map任务–>执行自定义map()函数,来处理切片每条记录;

格式化:将划分好的分片格式化为键值对<key(偏移量),value(每行内容)>形式的数据;

 

2.执行MapTask(四个阶段)

Map任务有一个内存缓冲区(100M),分片数据经过Map任务的中间数据会写入,达到阈值(80M)启动一个线程,写入磁盘,在溢写过程中,MapReduce会对Key进行排序,如果中间结果比较大会形成多个溢写文件,最后合并为一个;

①Read阶段:MapTask通过RecordReder类,从输入的InputSplit中解析出一个个Key/value

 

②Map阶段:将解析出的键值对交给map()函数处理,产生一系列新的key/value

 

③Collect阶段:map()处理完后一般调用outputCollector.collect()输出结果,在函数内部,生成新的key/value分片(通过调用partitioner),并写入环形内存缓冲区

 

④Spill阶段:溢写,环形内存缓冲区满后,写入磁盘(这之前进行本地排序,必要是对数据合并、压缩的操作),生成临时文件,

 

⑤Combiner阶段:最终合并

 

3.执行Shuffle过程

Shuffle回将MapTask输出的处理结果数据分发给ReduceTask,并在分发过程中,对数据按key进行分区和排序。

 

4.执行ReduceTask

输入ReduceTask的数据流是<key,{ value list}>的形式,用户可以自定义Reduce方法进行逻辑处理,最终以<key,value>的形式输出。

5.写入文件

MapReduce框架会自动把Reduce Task生成的<key,value>传入OutputFormat的write方法,实现文件的写入操作。

 

ReduceTask原理

①Copy阶段:Reduce从各个MapTask上远程拷贝一片数据,并针对某一片数据,如果其大小超过一定阈值,则写到磁盘上,否则直接放到内存中。

②Merge阶段:在远程复制数据的同时,ReduceTask会启动两个后台线程,分别对内存和磁盘上的文件进行合并,以防止内存使用过多或者磁盘文件过多。

③Sort阶段:用户编写reduce()方法输人数据是按key进行聚集的一组数据。为了将key相同的数据聚在一起,Hadoop采用了基于排序的策略。由于各个MapTask已经实现对自己的处理结果进行了局部排序,因此,ReduceTask只需对所有数据进行一次归并排序即可。

④Reduce阶段:对排序后的键值对调用reduce()方法,键相等的键值对调用一次reduce()方法,每次调用会产生零个或者多个键值对,最后把这些输出的键值对写人到HDFS中。

⑤Write阶段:reduce()函数将计算结果写到HDFS上。

 

Znode有两种类型

临时节点:该生命周期依赖于创建它们的会话,一旦会话结束,临时节点将会被自动删除,也可以手动删除。虽然每个临时的Znode都会绑定一个客户端,但它们对所有的客户端还是可见的。需要注意的是临时节点不允许拥有子节点。

永久节点:该生命周期不依赖于会话,并且只有在客户端显示执行删除操作的时候,它们才能被删除。

 

Watch机制的特点

一次性触发、事件封装、异步发送、先注册再触发

 

Zookeeper特性

Zookeeper具有全局数据一致性、可靠性、顺序性、原子性以及实时性,可以说Zookeeper的其他特性都是为满足Zookeeper全局数据一致性这一特性。

 

Zookeeper集群角色

Zookeeper集群是一个主从集群,它一般是由一个Leader(领导者)和多个Follower(跟随者)组成。此外,针对访问量比较大的Zookeeper集群,还可新增Observer(观察者)

Leader:事务性请求(写操作)唯一调度者和处理者保证事务处理顺序性,负责进行投票的发起和决议,以及更新系统状态。

Follower:处理客服端非事务性(读操作)请求,接送事务性请求给leader处理,参与投票。

Observer:观察zookeeper集群最新状态变化,并将状态同步,可独自处理非事务性请求,事务性请求给leader处理

Zookeeper的选举机制

Zookeeper为了保证各节点的协同工作,在工作时需要一个Leader角色,而Zookeeper默认采用FastLeaderElection算法,且投票数大于半数则胜出的机制。

服务器ID:设置集群myid参数时,参数分别为服务器1、服务器2、服务器3,编号越大FastLeaderElection算法中权重越大。

选举ID:选举过程中,Zookeeper服务器有四种状态,分别为竞选状态、随从状态、观察状态、领导者状态。

数据ID:是服务器中存放的最新数据版本号,该值越大则说明数据越新,在选举过程中数据越新权重越大。

逻辑时钟:逻辑时钟被称为投票次数。

 

假设有5台编号分别是1 ~ 5的服务器,全新集群选举过程如下:

 

全新集群选举:

步骤1:服务器1启动,先给自己投票;其次,发投票信息,由于其它机器还没有启动所以它无法接收到投票的反馈信息,因此服务器的状态一直属于竞选状态。

 

步骤2:服务器2启动,先给自己投票;其次,在集群中启动Zookeeper服务的机器发起投票对比,它会与服务器1交换结果,由于服务器2编号大,服务器2胜出,服务器1会将票投给服务器2,此时服务器2的投票数并没有大于集群半数,两个服务器状态依旧是竞选状态。

 

步骤3:服务器3启动,先给自己投票;其次,与之前启动的服务器1、2交换信息,服务器3的编号最大,服务器3胜出,服务器1、2会将票投给服务器3,此时投票数正好大于半数,所以服务器3成为领导者状态,服务器1、2成为追随者状态。

 

步骤4:服务器4启动,先给自己投票;其次,与之前启动的服务器1、2、3交换信息,尽管服务器4的编号大,但是服务器3已经胜,所以服务器4只能成为追随者状态。

 

步骤5:服务器5启动,同服务器4-样,均成为追随者状态。

 

非全新集群选举:

步骤1:统计逻辑时钟是否相同,逻辑时钟小,则说明途中可能存在宕机问题,

因此数据不完整,那么该选举结果被忽略,重新投票选举。

 

步骤2:统一逻辑时钟后,对比数据ID值,数据ID反应数据的新旧程度,因此

数据ID大的胜出。

步骤3:如果逻辑时钟和数据ID都相同的情况下,那么比较服务器ID (编号) ,

值大则胜出。

 

 

Yarn集群的工作流程:

当用户给Yarn提交了一个应用程序后,Yarn的主要工作流程如下图:

国内 商用 hadoop hadoop的商业版本_客户端

 


 

 

 

 

步骤1,用户向Yarn提交应用程序,其中包括用户程序、相关文件、启动ApplicationMaster命令、ApplicationMaster程序等。

步骤2,ResourceManager为该应用程序分配第一个Container,并且与Container所在的NodeManager通信,并且要求该NodeManager在这个Container中启动应用程序对应的ApplicationMaster。

步骤3,ApplicationMaster首先会向ResourceManager注册,这样用户才可以直接通过ResourceManager查看到应用程序的运行状态,然后它为准备为该应用程序的各个任务申请资源,并监控它们的运行状态直到运行结束,即重复后面4~7步骤。

步骤4,ApplicationMaster采用轮询的方式通过RPC协议向ResourceManager申请和领取资源。

步骤5,一旦ApplicationMaster申请到资源后,便会与申请到的Container所对应的NodeManager进行通信,并且要求它在该Container中启动任务。

步骤6,任务启动。NodeManager为要启动的任务配置好运行环境,包括环境变量、JAR包、二进制程序等,并且将启动命令写在一个脚本里,通过该脚本运行任务。

步骤7,各个任务通过RPC协议向其对应的ApplicationMaster汇报自己的运行状态和进度,以让ApplicationMaster随时掌握各个任务的运行状态,从而可以再任务运行失败时重启任务。

步骤8,应用程序运行完毕后,其对应的ApplicationMaster会向ResourceManager通信,要求注销和关闭自己。

 

简述Hadoop HA集群的启动步骤

(1)启动集群各个节点的Zookeeper服务;

(2)启动集群各个节点监控NameNode的管理日志的JournalNode;

(3)在node-01节点格式化NameNode,并将格式化后的目录拷贝到node-02中;

(4)在node-01节点上格式化ZKFC;

(5)在node-01节点上启动HDFS;

(6)在node-01节点上启动YARN。

 

简述Hive的特点是什么。

Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供完整的SQL查询功能,可以将SQL语句转换为MapReduce任务进行运行。其优点是学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析。

 

简述Hive中内部表与外部表区别。

创建表阶段:

外部表创建表的时候,不会移动数到数据仓库目录中(/user/hive/warehouse),只会记录表数据存放的路径,内部表会把数据复制或剪切到表的目录下。

删除表阶段:

外部表在删除表的时候只会删除表的元数据信息不会删除表数据,内部表删除时会将元数据信息和表数据同时删除。

 

Hive适用场景

Hive不适用于在线事务处理。  它最适用于传统的数据仓库任务

hive的执行延迟比较高,因为hive常用于数据分析的,对实时性要求不高;

hive优势在于处理大数据,对于处理小数据没有优势,因为hive的执行延迟比较高。

 

数据仓库的三个特点:面向主题,随时间变化,相对稳定。

 

数据仓库的结构:

数据源:数据源是数据仓库的基础,即系统的数据来源,通常包含各种专业的内部信息和外部信息。

数据存储及管理:数据存储及管理是整个数据仓库的核心。

 

数据仓库的数据模型:星状模型,雪花模型。

 

Hive工作原理:

1. 用户提交查询等任务给Driver。

2. 编译器获得该用户的任务Plan。

3. 编译器Compiler根据用户任务去MetaStore中获取需要的Hive的元数据信息。

4. 编译器Compiler得到元数据信息,对任务进行编译,先将HiveQL转换为抽象语法树,然后将抽象语法树转换成查询块,将查询块转化为逻辑的查询计划,重写逻辑查询计划,将逻辑计划转化为物理的计划(MapReduce), 最后选择最佳的策略。

5. 将最终的计划提交给Driver。

6. Driver将计划Plan转交给ExecutionEngine去执行,获取元数据信息,提交给JobTracker或者SourceManager执行该任务,任务会直接读取HDFS中文件进行相应的操作。

7. 获取执行的结果。

8. 取得并返回执行结果。

 

Flume工作原理:

Flume的核心是把数据源通过数据采集器收集过来,再将收集的数据通过缓冲通道汇集到指定收集器。

Flume日志采集传输系统中核心的角色是agent,agent本身是一个java进程,一般运行在日志收集节点,一个agent主要包含3大组件source、channel、sink。

Source(数据采集器):对接外部数据源收集数据。一个source可对接一个或多个channel

Channel(缓冲通道):底层是一个缓冲队列,对source提供中的数据进行简单缓存,作用是将数据高效准确写入sink,数据全部到达sink后,flume就会删除该缓存通道中的数据。

Sink(接受器):接收并汇集流向sink的所有数据,可以进行集中式存储,也可以继续作为数据源传入其他远程服务器或者source。

在数据传输过程中,flume将流动的数据封装到event中,他是flume内部数据传输的基本单元。

 

Sqoop导入原理:

在导入数据之前, sqoop使用 JDBC检查导入的数据表,检索出表的所有列以及列的·sql数据类型,并将这些SQL类型映射为java数据类型,在转换后的 MapReduce应用中使用这些对应的 Java类型来保存字段的值,Sqoop的代码生成器使用这些信息来创建对应表的类,用于保存从表中抽取的记录。

Sqoop导出原理:

在导出数据之前,sqoop会根据数据库连接字符串来选择一个导出方法,对于大部分系统来说,Sqoop会选择 JDBC。Sqoop会根据目标表的定义生成一个Java类,这个生成的类能够从文本中解析出记录数据,并能够向表中插入类型合适的值,然后启动一个MapReduce作业,从HDFS 中读取源数据文件,使用生成的类解析出记录,并且执行选定的导出方法。