当前位置:   article > 正文

《大数据技术原理与应用》林子雨(第二版)--总结_.试述在 hadoop 体系架构中 hbase 与其他组成部分的相互关系。

.试述在 hadoop 体系架构中 hbase 与其他组成部分的相互关系。

厦大子雨老师的这本书内容不多,但是很全面,推荐适合大数据入门。本篇文章主要是自己根据书中内容,以QA的形式做下总结,且对书后答案做了解答。

文章目录

第一篇 大数据基础

大数据处理架构Hadoop

1. 试述 hadoop 和谷歌的 mapreduce、gfs 等技术之间的关系

Hadoop 的核心是分布式文件系统 HDFS 和 MapReduce。HDFS 是谷歌文件系统 GFS 的开源实现,具有较高的读写速度、很好的容错性和可伸缩性,支持大规模数据的分布式存储。MapReduces 是针对谷歌 MapReduce 的开源实现,允许用户在不了解分布式系统底层细节的情况下开发并行应用程序,采用MapReduce来整合分布式文件系统上的数据,可保证分析和处理数据的高效性。

2. 试述 Hadoop 具有哪些特性。

① 高可靠性(采用冗余数据存储方式,一个副本宕机时,其他副本也可以正常对外服务);
② 高效性
③ 高可扩展性
④ 高容错性
⑤ 成本低

3. 试述 Hadoop 在各个领域的应用情况。

2007 年,雅虎在 Sunnyvale 总部建立了 M45——一个包含了 4000 个处理器和 1.5PB 容量的 Hadooop 集群系统;

Facebook主要将 Hadoop 平台用于日志处理,推荐系统和数据仓库等方面;

百度主要使用 Hadoop 于日志的存储和统计、网页数据的分析和挖掘、商业分析、在线数据反馈、网页聚类等。

4. 试述 Hadoop 生态系统以及每个部分的具体功能

Hadoop生态系统包括:Ambari(安装、部署、配置和管理工具),zookeeper(分布式协作服务),HBase(分布式数据库),Hive(数据仓库),Pig(数据流处理),Mahout(数据挖掘库),MapReduce(分布式计算框架),YARN(资源调度和管理框架),HDFS(分布式文件系统),Flume(日志收集),Sqoop(数据库ETL)。
其中每个部分的具体功能如下:

HDFS 是 Hadoop 项目的两个核心之一,它是针对谷歌文件系统的开源实现。其放宽了一部分POSIX约束,从而实现以流的方式访问文件系统中的数据。

HBase 是一个提高可靠性、高性能、可伸缩、实时读写、分布式的列式数据库,一般采用 HDFS 作为其底层数据存储。

MapReduce是一种编程模型, 是针对谷歌 MapReduce 的开源实现,用于大规模数据集的并行运算。核心思想是分而治之,把输入的数据集切分为若干独立的数据块,分发给一个主节点管理下的各个分节点来共同并行完成,最后通过整合各个节点的中间结果得到最终结果。

Hive 是一个基于 Hadoop 的数据仓库工具,可以用于对 Hadoop 文件中的数据集进行数据整理、特殊查询和分布存储。

Mahout的功能主要是提供一些可扩展的机器学习领域经典算法的实现,目的是帮助开发人员更加方便快捷的创建智能应用程序。

Pig 是一种数据流语言和运行环境,适合于使用 Hadoop 和 MapReducce 平台上查询大型半结构化数据集。

Zoookepper 是针对谷歌 Chubby 的一个开源实现,是高效和可靠的协同工作系统,提供分布式锁之类的基本服务,用于构建分布式应用,减轻分布式应用程序所承担的协调任务。

Flume的功能是在日志系统中定制各类数据的发送方用于收集数据,同时提供对数据进行简单处理并写到各种数据接收方的能力。

Sqoop用来在Hadoop和关系数据库之间交换数据,可以改进数据的互操作性。

Ambari支持Hadoop集群的安装,部署配置和管理。

5. 配置Hadoop时,Java的路径JAVA_HOME是在哪一个配置文件中进行设置的?

在安装Hadoop时,Hadoop文件夹中的"etc/hadoop"目录下的hadoop-env.sh文件,将JAVA_HOME环境变量指定到本机的JDK目录即可。

$export JAVA_HOME=/usr/lib/jvm/default-java	
  • 1

6. 所有节点的HDFS路径是通过fs.default.name来设置的,请问它是在哪个配置文件中设置的?

conf/core-site.xml中设置,core-site是用来配置HDFS和MapReduce常用的I/O设置等。

7. 试着列举单机模式和伪分布模式的异同点。

相同点:伪分布式安装是指在一台机器上模拟一个小的集群,但是集群中只有一个节点。单机模式同样是在一台机器上完成部署,因此相同点是都在一台机器上。

不同点:单机hadoop无需进行配置,伪分布式需要通过配置文件来对各个组件的协同工作进行设置;单机模式是在本地的文件系统, 伪分布式需要将本地文件上传到HDFS的文件夹中(无需网络,因为都在同一台机器)。

8. Hadoop伪分布式运行启动后所具有的进程都有哪些?

6个进程:NodeManager,jps,NameNode,SecondaryNameNode,DataNode,ResourceManager。

第二篇 大数据存储与管理

本章主要介绍大数据存储与管理的相关技术,主要包括:HDFS,分布式数据库HBase,NoSQL数据库和云数据库。

HDFS提供了服务器集群中进行大规模分布式文件存储的能力,HBase是一个分布式数据库,主要用来存储非结构化和半结构化的松散数据,NoSQL支持超大规模的数据存储,云数据库是部署在云环境的数据库。

本章重点在于:分布式文件系统及分布式数据库的实现原理和应用方法,难点在HDFS存储原理及HBase实现原理。

分布式文件系统HDFS

1. 什么是分布式文件系统?

分布式文件系统是一种通过网络实现文件在多台主机上进行分布式存储的文件系统。其设计一般采用“客户机/服务器”模式,客户端以特定的通信协议通过网络与服务器建立连接,提出文件访问请求,客户端和服务器可以通过设置访问权来限制请求方对底层数据存储块的访问。

2. 分布式文件系统结构有什么特点,且是如何实现高水平扩展的?

① 普通文件系统的块是512个字节,每次读写的数据量必须是磁盘块的整数倍,分布式文件系统HDFS的一个块默认是64MB,如果一个文件小于一个数据块的大小,它并不占用整个数据块的存储空间;
② 分布式系统的物理结构上是由计算机集群的多个节点构成的,这些节点分别是主节点和从节点。
③ 为了保证数据的完整性,分布式文件系统通常采用多副本存储

3. HDFS如何保证节点可能出现故障的情况?

HDFS通常采用多副本存储,文件块会被复制为多个副本,存储在不同的节点上,且存储同一文件块的不同副本的各个节点会分布在不同的机架上,这样,在单个节点出现故障时,就可以快速调用副本重启单个节点上的计算过程,而无需重启整个计算过程,整个机架出现故障时也不会丢失所有文件块。

4. 试述 HDFS 中的块和普通文件系统中的块的区别。

在传统的文件系统中,为了提高磁盘读写效率,一般以数据块为单位,而不是以字节为单位。 HDFS 中的块,默认一个块大小为 64MB,而 HDFS 中的文件会被拆分成多个块,每个块作为独立的单元进行存储。HDFS 在块的大小的设计上明显要大于普通文件系统。

5. 试述 HDFS 中的名称节点和数据节点的具体功能。

主节点负责文件和目录的创建删除重命名,同时管理着从节点和文件块的映射关系,因此客户端只有访问名称节点才能找到请求的文件块所在的位置,进而到相应位置读取所需的文件块。

从节点负责数据的存储和读取,存储时由主节点分配存储位置,然后由客户端把数据直接写入到相应的从节点;在读取时客户端从主节点中获得从节点和文件块的映射关系,然后就可以到相应位置访问文件块。

6. 为什么HDFS不适合存储大量小文件?

① HDFS采用NameNode来管理文件系统的元数据,这些元数据被保存在内存中,从而使客户端可以快速的获取文件实际存储位置。但当小文件比较多时,名称节点要花大量的内存来保存这些元数据信息,这样会导致元数据的检索效率变低;

② MapReduce处理大量小文件时,会产生过多的map任务,线程管理开销会大大增加;

③ 访问大量小文件的速度要远低于访问几个大文件的速度,因为访问小文件要不断从一个数据节点跳到另一个数据节点,影响性能。

7. 在分布式文件系统中,中心节点的设计至关重要,请阐述HDFS是如何减轻中心节点的负担的?

我认为从两个方面考虑:一个是HDFS的主从架构,另一个是第二名称节点。

首先HDFS采用了主从架构模型,一个HDFS集群包括一个名称节点和若干个数据节点。名称节点作为中心服务器,负责管理文件系统的命名空间及客户端对文件的访问。数据节点一般是一个节点运行一个数据节点进程,负责处理文件系统客户端的读写请求,在名称节点的统一调度下进行数据库的创建、删除和复制等操作。

其实是第二名称节点,为了有效的解决EditLog逐渐变大带来的问题,HDFS设计时采用了第二名称节点,其可以完成EditLog和FsImage的合并操作,减小EditLog文件大小,缩短名称节点的重启时间。其次可以作为名称节点的检查点,来保存名称节点的元数据信息。

8. HDFS只设置唯一一个主节点,在简化系统设计的同时也带来了一些明显的局限性,请阐述局限性具体表现在哪些方面?

① 命名空间的限制。名称节点是保存在内存中的,因此名称节点能够容纳对象(文件、块)的个数会受到内存空间大小的限制;
② 性能的瓶颈,整个分布式文件系统的吞吐量受限于单个名称节点的吞吐量(单位时间内成功地传送数据的数量);
③ 隔离问题。只有一个命名空间无法对不同应用程序进行隔离;

9. 试述HDFS的冗余数据保存策略。

HDFS采用多副本的方法对数据进行冗余存储,通常一个数据块的多个副本会被分布到不同的数据节点上。

10. 数据复制主要是在数据写入和数据恢复时发生,HDFS数据复制是采用流水线复制的策略,请阐述该策略的细节。

HDFS的数据复制采用了流水线复制的策略,其显著的提高了数据复制过程的效率:

① 当客户端往HDFS中写入一个文件时,这个文件会首先被写入本地,并被切分成若干个块,每个块的大小是由HDFS的设定值决定的;

② 每个块向HDFS集群中的名称节点发起写请求,名称节点会根据系统中各个数据节点的使用情况,选择一个数据节点列表返回给客户端;

③ 客户端会把数据首先写入列表中的第一个数据节点,同时把列表传给第一个数据节点;

④ 当第一个数据节点接收到4KB数据时,写入本地,且向列表中的第二个数据节点发起连接请求,把自己已经接收到的4KB数据和列表传给第二个数据节点,当第二个数据节点接收到4KB数据时,写入本地,且向列表中第三个数据节点发送请求,一次类推,由列表中的多个数据节点形成一条数据复制的流水线,最后当文件写完时,数据复制完成。

11. HDFS是如何探测错误发生以及如何进行恢复的?

HDFS的错误可以分为3种情况:名称节点出错,数据节点出错以及数据出错。

① 名称节点出错:名称节点发生宕机(或者是FsImage和EditLog发生损坏)。首先到远程挂载的网络文件系统种获取备份的元数据信息,放到第二名称节点上进行恢复,并把第二名称节点作为名称节点来使用。

② 数据节点出错:数据节点发生故障或者断网,从而导致数据节点无法定期向名称节点发送心跳。名称节点会定期检查心跳,通过数据冗余复制来生产新的副本。

③ 数据出错:如何探测–文件被创建时,客户端会对每一个文件块进行信息摘录,并把这些信息写入同一个路径的隐藏文件里。当客户端读取文件时,会先读取该信息文件,然后利用该信息文件对每个读取的数据块进行校验。如何恢复-- 当校验出错时,客户端会请求到另外一个数据节点读取该文件块,并向名称节点报告这个文件块有误。

12. 阐述HDFS在不发生故障的情况下读文件的过程。

① 打开文件:客户端通过FileSystem.open()打开文件,调用open方法后,DistributedFileSystem会创建输入流;

② 获取数据块信息:输入流哦通过getBlockLocations方法获得文件开始部分数据块的保存位置。对于该数据块,名称节点返回保存该数据库的所有数据节点的地址,同时根据距离客户端的远近对数据节点进行排序,同时返回给客户端数据块的数据节点地址;

③ 读取请求:客户端调用read()函数开始读取数据,输入流根据前面的排序结果,选择距离客户端最近的数据节点建立连接并读取数据;

④ 读取数据:数据从该数据节点读到客户端;

⑤ 获得数据块信息:输入流通过getBlockLocations()方法查找下一个数据块(如果客户端缓存中已经包含了该数据块的位置信息,就不需要调用该方法。)

⑥ 读取数据:找到该数据块的最佳数据节点(距离客户端最近),读取数据;

⑦ 关闭文件:当客户端读取完毕数据时,通过close函数关闭输入流。

13. 阐述HDFS在不发生故障的情况下写文件的过程。

① 创建文件请求:客户端通过create方法创建文件输出流;

② 创建文件元数据:输出流通过RPC远程调用名称节点,在文件系统的命名空间中创建一个新的文件,名称节点会执行一些检查,通过后,会返回给客户端使用这个输出流来写入数据;

③ 写入数据:客户端用输出流的write方法向HDFS中对应的文件写入数据;

④ 写入数据包:客户端由输出流写入的数据会首先被分为一个个的分包,这些分包被放入DFSOutputStream对象的内部队列,输出流FSDataOutputStream会向名称节点申请保存文件和副本数据块的若干个数据节点,这些数据节点形成一个数据流管道。按照流水线复制的方法,将数据包留经管道上的各个数据节点。

⑤ 接受确认包:接受到数据的数据节点需要向发送者发送确认包,确认包从管道一次经故各个数据节点最终发往客户端,当客户端收到应答时,将对应的分包从内部队列中清除,直到数据全部写完;

⑥ 关闭文件:通知名称节点关闭文件,完成一次正常的写文件过程。

分布式数据库HBase

1. 试述在 Hadoop 体系架构中 HBase 与其他组成部分的相互关系。

HBase 利用 Hadoop MapReduce 来处理 HBase 中的海量数据,实现高性能计算;利用 Zookeeper 作为协同服务,实现稳定服务和失败恢复;使用 HDFS 作为高可靠的底层存储,利用廉价集群提供海量数据存储能力; Sqoop 为 HBase 的底层数据导入功能,Pig 和 Hive 为 HBase 提供了高层语言支持,HBase 是 BigTable 的开源实现。

2. 请阐述 HBase 和 BigTable 的底层技术的对应关系

① 文件存储系统:BigTable基于GFS,HBase基于HDFS;
② 海量数据处理:BigTable基于MapReduce,HBase基于Hadoop MapReduce;
③ 协同服务管理:BigTable基于Chubby,HBase基于Zookeeper;

3. 请阐述 HBase 和传统关系数据库的区别

①数据类型:关系数据库采用关系模型,HBase采用数据模型。数据模型就是把数据存储为未经解释的字符串,用户可以将不同格式的结构化数据和非结构化数据都序列化成字符串保存在HBase中,然后通过自己的程序把字符串解析成不同的数据类型;
② 数据操作:关系数据库中会涉及复杂的多表连接,HBase中通常只采用单表的主键查询;
③ 存储模式:关系数据库基于行存储,HBase基于列存储。

4. 说明 HBase 数据模型。

关系数据库通过行和列来确定表中一个具体的值,HBase中通过行键,列族,列限定符和时间戳来确定一个单元格。

5. 分别解释 HBase 中行键、列键和时间戳的概念

① 行键是唯一的,在一个表里只出现一次,否则就是在更新同一行,行键可以是任意的字节数组。

② 列族需要在创建表的时候就定义好,数量也不宜过多。列族名必须由可打印字符组成,创建表的时候不需要定义好列。
③ 时间戳,默认由系统指定,用户也可以显示设置。使用不同的时间戳来区分不同的版本。

6. 阐述 HBase 的概念视图和物理视图的不同

(没总结好)

7. 试述 HBase 各功能组建及其作用

(1)库函数:链接到每个客户端;
(2)一个 Master 主服务器:主服务器 Master 主要负责表和 Region 的管理工作;
(3)许多个 Region 服务器:Region 服务器是 HBase 中最核心的模块,负责维护分配给自己的 Region,并响应用户的读写请求

8. 阐述 HBase 的数据分区机制。

HBase 采用分区存储,根据行键的值对表中的行进行分区,每个行区间构成一个分区,叫做Region。一个大的表会被分拆许多个 Region,这些 Region 会被分发到不同的服务器上实现分布式存储。

每个Region都有一个RegionID来标识其唯一性。为了定位每个Region所在的位置,就可以构建一张映射表,**映射表的每行包含两项内容:Region标识符,及Region服务器标识。**从而知道某个Region被保存在哪个Region服务器中,这个映射表被叫做".META.表"。

9. HBase 中的分区是如何定位的。

通过构建的映射表的每个条目包含两项内容,一个是 Regionde 标识符,另一个是 Region 服务器标识,这个条目就标识 Region 和 Region 服务器之间的对应关系,从而就可以知道某个 Region 被保存在哪个 Region 服务器中。

10. 试述 HBase 的三层结构中各层次的名称和作用。

①第一层 Zookeeper 文件,记录了 - ROOT - 表的位置信息;

② 第二层 -ROOT - 表,记录了. META. 表的 Region 位置信息,-ROOT - 表只能有一个 Region。通过 - ROOT - 表,就可以访问. META. 表中的数据;

③ 第三层: .META. 表,记录了用户数据表的 Region 位置信息,.META. 表可以有多个 Region,保存了 HBase 中所有用户数据表的 Region 位置信息;

11. 阐述 HBase 的三层结构下,客户端是如何访问到数据的。

首先访问 Zookeeper,获取 - ROOT 表的位置信息,然后访问 - Root - 表,获得. MATA. 表的信息,接着访问. MATA. 表,找到所需的 Region 具体位于哪个 Region 服务器,最后才会到该 Region 服务器读取数据。

12. 试述 HBase 系统基本架构以及每个组成部分的作用。

(1)客户端
客户端包含访问 HBase 的接口,同时在缓存中维护着已经访问过的 Region 位置信息,用来加快后续数据访问过程
(2)Zookeeper 服务器
Zookeeper 可以帮助选举出一个 Master 作为集群的总管,并保证在任何时刻总有唯一一个 Master 在运行,这就避免了 Master 的 “单点失效” 问题
(3)Master
主服务器 Master 主要负责表和 Region 的管理工作:管理用户对表的增加、删除、修改、查询等操作;实现不同 Region 服务器之间的负载均衡;在 Region 分裂或合并后,负责重新调整 Region 的分布;对发生故障失效的 Region 服务器上的 Region 进行迁移
(4)Region 服务器
Region 服务器是 HBase 中最核心的模块,负责维护分配给自己的 Region,并响应用户的读写请求;

13. 请阐述 Region 服务器向 HDFS 文件系统中读写数据的基本原理

Region 服务器内部管理了一系列 Region 对象和一个 HLog 文件,其中,HLog 是磁盘上面的记录文件,它记录着所有的更新操作。每个 Region 对象又是由多个 Store 组成的,每个 Store 对应了表中的一个列族的存储。每个 Store 又包含了 MemStore 和若干个 StoreFile,其中,MemStore 是在内存中的缓存,保存最近更新的数据。StoreFile是磁盘中的文件,这些文件都是树结构,方便读取。

用户读写数据的过程:当用户写入数据时,会被分配到相应的Region服务器去执行操作,用户数据首先被写入到MemStore和HLog中,当操作写入HLog之后,commit()调用才会将其返回给客户端。当用户读取数据时,Region服务器会首先访问MemStore缓存,如果数据不在缓存中,才会到磁盘上面的StoreFile中去寻找。

14. 试述 HStore 的工作原理

每个 Store 对应了表中的一个列族的存储。每个 Store 包括一个 MenStore 缓存和若干个 StoreFile 文件。MenStore 是排序的内存缓冲区,当用户写入数据时,系统首先把数据放入 MenStore 缓存,当 MemStore 缓存满时,就会刷新到磁盘中的一个 StoreFile 文件中(文件合并),当单个 StoreFile 文件大小超过一定阈值时,就会触发文件分裂操作。新分裂出的2个子Region会被Master分配到相应的Region服务器上。

15. 试述 HLog 的工作原理

HLog用来保证HBase系统发生故障时能够恢复到正确的状态。HBase 系统为每个 Region 服务器配置了一个 HLog 文件(所有Region对象共用一个HLog),它是一种预写式日志(Write Ahead Log),用户更新数据必须首先写入日志后,才能写入 MemStore 缓存,并且,直到 MemStore 缓存内容对应的日志已经写入磁盘,该缓存内容才能被刷写到磁盘。

当一个Region服务器发生故障时,通过将Region服务器上的HLog按照其所属的Region对象进行拆分,然后分发到其他Region服务器上执行恢复操作。

16. 在 HBase 中,每个 Region 服务器维护一个 HLog,而不是为每个 Region 都单独维护一个 HLog。请说明这种做法的优缺点。

优点: 多个 Region 对象的更新操作所发生的日志修改,只需要不断把日志记录追加到单个日志文件中,不需要同时打开、写入到多个日志文件中,可以减少磁盘寻址次数

缺点:如果一个 Region 服务器发生故障,为了恢复其上次的 Region 对象,需要将 Region 服务器上的对象,需要将 Region 服务器上的 HLog 按照其所属的 Region 对象进行拆分,然后分发到其他 Region 服务器上执行恢复操作。

17. 当一台 Region 服务器意外终止时,Master 如何发现这种意外终止情况?为了恢复这台发生意外的 Region 服务器上的 Region,Master 应该做出哪些处理 (包括如何使用 HLog 进行恢复)?

①Zookeeper 会实时监测每个 Region 服务器的状态,当某个 Region 服务器发生故障时,Zookeeper 会通知 Master。

② Master 首先会处理该故障 Region 服务器上面遗留的 HLog 文件,这个遗留的 HLog 文件中包含了来自多个 Region 对象的日志记录。

③ 系统会根据每条日志记录所属的 Region 对象对 HLog 数据进行拆分,分别放到相应 Region 对象的目录下,然后,再将失效的 Region 重新分配到可用的 Region 服务器中,并把与该 Region 对象相关的 HLog 日志记录也发送给相应的 Region 服务器。

④ Region 服务器领取到分配给自己的 Region 对象以及与之相关的 HLog 日志记录以后,会重新做一遍日志记录中的各种操作,把日志记录中的数据写入到 MemStore 缓存中,然后,刷新到磁盘的 StoreFile 文件中,完成数据恢复;

18. 行式存储和列式存储的区别是什么?

① 行式存储使用NSM存储模型,一个元组(或行)会被连续的存储在磁盘页中。**(存)数据是一行行存的,当第一行写入磁盘页后,再继续写入第二行。(读取)**从磁盘中读取数据时,需要从磁盘中顺序扫描每个元组的完整内容,然后从每个元组中筛选出查询所需要的属性;

② 列式存储使用DSM存储模型,DSM会对关系进行垂直分解,并为每个属性分配一个子关系。因此,一个具有n个属性的关系会被分解成n个子关系,每个子关系单独存储,每个子关系只有当其相应的属性被请求时才会被访问。故列式存储以关系数据库的属性为单位进行存储,关系中多个元组的同一属性值会被存储再一起,而一个元组中不同属性值则通常会被分别存放于不同的磁盘页中

(两者区别) 行式存储适合小批量的数据处理,但是适合于复杂的表连接的操作。列式存储适合大量的数据处理和查询。

19. HBase是列式存储数据库吗?

HBase严格意义上来说并不是列式存储的数据库,因为HBase是以列族为单位进行分解(列族中可以包含多个列),而不是每个列都单独存储,但是HBase借鉴和利用了磁盘上的这种列存储格式,故而可以被称为列式存储数据库。

NoSQL数据库

1. NoSQL 数据库的四大类型,并解释其含义。

键值数据库、列族数据库、文档数据库和图数据库。

① 键值数据库会使用一个哈希表来存储,只能通过key进行查询,从而找到对应的value,缺点是不容易进行条件查询;
② 列族数据库采用列族数据模型,同一列的数据会存放在一起;
③ 文档数据库以文档作为数据库的最小单位;
④ 图数据库使用图作为数据模型来存储数据;

2. 试述 CAP 理论的具体含义。

C(Consistency):一致性,所有节点在同一时间具有相同的数据。
A:(Availability):可用性,是指快速获取数据,可以在确定的时间内返回操作结果,保证每个请求不管成功或者失败都有响应;
P(Tolerance of Network Partition):分区容忍性,是指当出现网络分区的情况时(即系统中的一部分节点无法和其他节点进行通信),分离的系统也能够正常运行,也就是说,系统中任意信息的丢失或失败不会影响系统的继续运作。

3. 试述数据库的 ACID 四性的含义

① 原子性(Atomicity)
指事务必须是原子工作单元,对于其数据修改,要么全都执行,要么全都不执行。
② 一致性(consistency)
指事务在完成时,必须使所有的数据都保持一致状态。
③ 隔离性(Isolation)
指并发事务所做的修改必须与其他并发事务所做的修改隔离。
④ 持久性(Durability)
指事务完成之后,它对于系统的影响是永久性的,该修改即使出现致命的系统故障也将一直保持。

4. 请解释软状态、无状态、硬状态的具体含义。

“软状态(soft-state)”是与 “硬状态(hard-state)” 相对应的一种提法。数据库保存的数据是 “硬状态” 时,可以保证数据一致性,即保证数据一直是正确的。“软状态”是指状态可以有一段时间不同步,具有一定的滞后性。

5. 试述不一致性窗口的含义。

所有后续的访问都可以读取到操作 OP 写入的最新值。从 OP 操作完成到后续访问可以最终读取到 OP 写入的最新值,这之间的时间间隔称为 “不一致性窗口”。

第三章 大数据处理与分析

MapReduce

1. MapReduce 模型采用 Master(JobTracker)-Slave(TaskTracker) 结构,试描述 JobTracker 和 TasKTracker 的功能。

MapReduce 框架采用了 Master/Slave 架构,包括一个 Master 和若干个 Slave。Master 上运行 JobTracker,Slave 上运行 TaskTrackero 用户提交的每个计算作业,会被划分成若千个任务。JobTracker 负责作业和任务的调度,监控它们的执行,并重新调度已经失败的任务。TaskTracker 负责执行由 JobTracker 指派的任务。

2. TaskTracker出现故障会有什么影响?该故障是如何处理的?

3. MapReduce计算模型的核心是Map函数和Reduce函数,试述这两个函数各自的输入,输出以及处理过程。

① Map函数的输入来自于分布式文件系统的文件块,map函数将输入的元素转换成<key,value>形式的键值对;

② Reduce函数的任务就是将输入的一系列具有相同键的键值对以某种方式组合起来,输出处理后的键值对,输出结果会合并成一个文件。

4. 试述 MapReduce 的工作流程 (需包括提交任务、Map、Shuffle、Reduce 的过程)。

逻辑切分:首先MapReduce框架会使用InputFormat模块做Map前的预处理,比如验证输入的格式是否符合输入的定义;然后,将输入文件切分为逻辑上的多个InputSplit,InputSplit是MapReduce对文件进行处理和运算的输入单位;(每个InputSplit并没有对文件进行实际切割,只是记录了要处理的数据的位置和长度);

转化为Key-value:通过RecordReader(RR)根据InputSplit中的信息来处理InputSplit中的具体记录,加载数据并转换为适合Map任务读取的键值对,输入给Map任务;

Map处理:Map任务会根据用户自定义的映射规则,输出一系列的<key,value>作为中间结果;

Shuffle:为了让Reduce可以并行处理Map的结果,需要对Map的输出进行一定的分区、排序、合并、归并等操作,得到<key,value-list>形式的中间结果,再交给对应的Reduce进行处理。Shuffle将无序的<key,value>转化为有序的<key,value-list>;

Reduce:Reduce 以一系列<key,value-list>中间结果作为输入,执行用户定义的逻辑,输出结果给OutputFormat模块;

输出模块:OutputFormat模块验证输出目录是否已经存在且输出结果类型是否符合配置文件中的配置类型,如果都满足,就输出Reduce的结果到分布式文件系统。

6. Shuffle过程是MapReduce工作流程的核心,试分析Shuffle过程的作用。

将无序的<key,value>转成有序的<key,value-list>,目的是为了让Reduce可以并行处理Map的结果。

7. 分别描述Map端和Reduce端的Shuffle过程(需包括spill、Sort、Merge、Fetch的过程)

Shuffle就是对Map输出结果进行分区、排序、合并等处理一并交给Reduce的过程。Shuffle过程分为Map端的操作和Reduce端的操作:


在Map端的Shuffle过程:Map端的Shuffle过程分为四个步骤,① 输入数据和执行Map任务;② 写入缓存(分区,排序和合并);③ 溢写;④ 文件归并;
① Map任务的输入数据一般保存在分布式文件系统的文件块中,接受<key,value>作为输入,按一定映射规则转换为一批<key,value>作为输出;

② Map的输出结果首先写入缓存,在缓存中积累一定数量的Map输出结果后,再一次性批量写入磁盘,这样可以大大减少对磁盘的IO消耗。因为寻址会开销很大,所以通过一次寻址、连续写入,就可以大大降低开销;(写入缓存之前,key和value值都会被序列化成字节数组);

③ 因为缓存中map结果的数量不断增加,因此需要启动溢写操作,把缓存中的内容一次性写入磁盘,并清空缓存。通常采用的方法是到达0.8的阈值后,就启动溢写过程。在溢写到磁盘之前,缓存中的数据首先会被分区,默认分区方式是采用Hash函数对key进行哈希后再用Reduce任务的数量进行取模,表示为:hash(key) mod reduce任务数量,这样就可以把map输出结果均匀的分配给这R个reduce任务去并行处理了。分完区后,再根据key对它们进行内存排序,排序完后,可以通过用户自定义的Combiner函数来执行合并操作,从而减少需要溢写到磁盘的数据量。经过分区、排序以及可能发生的合并操作后,这些缓存中的键值对就可以被写入磁盘,并清空缓存。每次溢写操作都会在磁盘中生成一个新的溢写文件,写入溢写文件中的所有键值对都是经过分区和排序的。

④ 每次溢写操作都会在磁盘中生成一个新的溢写文件,随着MapReduce任务的进行,磁盘中的溢写文件数量越来越多,最后在Map任务全部结束之前,系统对所有溢写文件中的数据进行归并,从而生成一个大的溢写文件;

⑤ 经过上述四个步骤后,Shffle过程完成,最终生成的一个大文件会被存放在本地磁盘上,这个大文件中的数据是被分区的,不同的分区会被发送到不同的Reduce任务进行并行处理。同时JobTracker会一直检测Map任务的执行,当检测到一个Map任务完成后,就会立即通知相关的Reduce任务来“领取”数据,然后开始Reduce端的Shuffle过程。


在Reduce端的Shuffle过程:Reduce端的Shuffle只需要从Map端读取Map结果,然后执行归并操作,最后输送给Reduce任务进行处理。过程分为三个步骤,① 领取数据;② 归并数据;③ 把数据输入给Reduce任务;
① 领取数据
Map端的Shuffle过程结束后,所有map输出结果都保存在Map机器的本地磁盘上,Reduce需要把磁盘上的数据fetch回来存放在自己所在机器的本地磁盘上。故每个Reduce任务会不断的向JobTracker询问Map任务是否完成,当检测到一个完成后,就会通知相关的Reduece任务来领取数据,一旦一个Reduce任务收到了通知,就会到该Map任务所在机器上把属于自己处理的分区数据fetch到本地磁盘;

② 归并数据
因为缓存中的数据是来自不同的Map机器,一般会存在很多可以合并的键值对。当溢写过程启动时,具有相同key的键值会被归并,归并时会对键值对进行排序,以保证最终大文件的键值对都是有序的。最终通过多轮归并将磁盘上多个溢写文件归并为多个大文件

③ 把数据输入给Reduce
磁盘经过多轮归并后得到的若干个大文件,会直接输入个Reduce任务(不会归并成一个新的大文件)。

8. MapReduce 中有这样一个原则: 移动计算比移动数据更经济。试述什么是本地计算,并分析为何要采用本地计算。

MapReduce 设计的一个理念就是 “计算向数据靠拢”,而不是 “数据向计算靠拢”,因为移动数据需要大量的网络传输开销,尤其是在大规模数据环境下,这种开销尤为惊人,所以,移动计算要比移动数据更加经济。

本地计算:在一个集群中,只要有可能,MapReduce 框架就会将 Map 程序就近地在 HDFS 数据所在的节点运行,即将计算节点和存储节点放在一起运行,从而减少了节点间的数据移动开销。

9. 试说明一个 MapReduce 程序在运行期间,所启动的 Map 任务数量和 Reduce 任务数量各是由什么因素决定的。

10. 是否所有的 MapReduce 程序都需要经过 Map 和 Reduce 这两个过程? 如果不是,请举例说明。

不是。对于关系的选择运算,只需要 Map 过程就能实现,对于关系 R 中的每个元组 t, 检测是否是满足条件的所需元组,如果满足条件,则输出键值对 <,>, 也就是说,键和值都是 t。这时的 Reduce 函数就只是一个恒等式,对输入不做任何变换就直接输出。

11. 分析为何采用 Combiner 可以减少数据传输量? 是否所有的 MapReduce 程序都可以采用 Combiner? 为什么?

对于每个分区内的所有键值对,后台线程会根据 key 对它们进行内存排序 (Sort), 排序是 MapReduce 的默认操作。排序结束后,还包含一个可选的合并(Combine ) 操作。如果用户事先没有定义 Combiner 函数,就不用进行合并操作。如果用户事先定义了 Combiner 函数,则这个时候会执行合并操作,从而减少需要溢写到磁盘的数据量。所谓 “合并”,是指将那些具有相同 key 的 < key,value > 的 value 加起来,比如,有两个键值对 <*xmu",1 > 和 <*xmu",1>, 经过合并操作以后就可以得到一个键值对 <*xmu",2>, 减少了键值对的数量。不过,并非所有场合都可以使用 Combiner, 因为,Combiner 的输出是 Reduce 任务的输人,Combiner 绝不能改变 Reduce 任务最终的计算结果,一般而言,累加、最大值等场景可以使用合并操作。

12. MapReduce 程序的输入文件、输出文件都存储在 HDFS 中,而在 Map 任务完成时的中间结果则存储在本地磁盘中。试分析中间结果存储在本地磁盘而不是 HDFS 上有何优缺点?

13. 早期版本的HDFS,其默认块大小为64MB,而较新版本默认为128MB,采用较大的块具有什么影响和优缺点?

14. 试着画出使用MapReduce来对英语句子“Whatever is worth doing is worth doing well”进行单词统计的过程。

15. 在基于MapReduce的单词统计中,MapReduce是如何保证相同的单词数据会划分到同一个Reducer上进行处理以保证结果的正确性?

Hadoop再探讨

1. HDFS1.0 中只包含一个名称节点会带来哪些问题(单点故障问题)。

  1. 单点故障问题:虽然HDFS1.0中存在第二名称节点,但是在1.0版本中第二名称节点的作用是周期性的从名称节点获取命名空间镜像文件(FsImage)和修改日志(EditLog),从而来对FsImage的恢复。因此当名称节点发生故障时,系统无法实时切换到第二名称节点以对外提供服务,仍需要停机恢复。(可以通过HA来解决)

  2. 在可扩展性方面,名称节点把整个 HDFS 文件系统中的元数据信息都保存在自己的内存中,HDFS1.0 中只有一个名称节点,不可以水平扩展,而单个名称节点的内存空间是由上限的,这限制了系统中数据块、文件和目录的数目。在系统整体性能方面,整个 HDFS 文件系统的性能会受限于单个名称节点的吞吐量。在隔离性方面,单个名称节点难以提供不同程序之间的隔离性,一个程序可能会影响会影响其他运行的程序。(通过HDFS联邦来进行解决)

2. 请描述 HDFS HA 架构组成组建及其具体功能。

设置两个名称节点,其中一个名称节点处于 “活跃” 状态,另一个处于 “待命” 状态。处于活跃状态的名称节点负责对外处理所有客户端的请求,而处于待命状态的名称节点则作为备用节点。处于待命状态的名称节点提供了“热备份”,一旦活跃名称节点出现故障,就可以立即切换到待命名称节点,不会影响到系统的正常对外服务。

3. 请分析 HDFS HA 架构中数据节点如何和名称节点保持通信。

在 HDFS HA中,所有名称节点会共享底层的数据节点存储资源。每个数据节点要向集群中所有的名称节点注册,并周期性地向名称节点发送 “心跳” 和块信息,报告自己的状态,同时也会处理来自名称节点的指令。

4. 为什么需要HDFS联邦,它能解决什么问题?

因为原来的HDFS存在可扩展性,系统性能及隔离性三个方面的问题。

联邦设计了多个相互独立的名称节点,使得HDFS的命名服务能够水平扩展。

5. 描述HDFS 联邦中 “块池” 的概念,分析为什么 HDFS 联邦中的一个名称节点失效,也不会影响到与它相关的数据节点继续为其他名称节点提供服务。

HDFS 联邦拥有多个独立的命名空间,其中,每一个命名空间管理属于自己的一组块,这些属于同一个命名空间的块构成一个 “块池”。

每个数据节点会为多个块池提供块的存储。可以看出,数据节点是一个物理逻辑,而块池则属于逻辑概念,一个块池是一组块的逻辑集合,块池中的各个块实际上是存储在各个不同的数据节点中的。因此 HDFS 联邦中的一个名称节点失效,也不会影响到与它相关的数据节点继续为其他名称节点提供服务。

6. 请阐述 MapReduce1.0 体系结构中存在的问题。

(1)存在单点故障:系统中只有一个JobTracker来负责所有MapReduce作业的调度;
(2)JobTracker负责的任务过重:JobTracker不仅要负责作业的调度和失败恢复,同时要负责资源管理与分配;
(3)容易出现内存溢出:TaskTracker资源分配时不考虑内存的实际情况;
(4)资源划分不合理:资源槽之间彼此不能共通使用;

7. 请描述 YARN 架构中各组件的功能。

YARN体系中包含了三个组件:ResourceManager、ApplicationMaster和NodeManager。

8. YARN 框架中执行一个 MapReduce 程序时,从提交到完成需要经历的具体步骤。

①用户编写客户端应用程序,向 YARN 提交应用程序,提交的内容包括 ApplicationMaster 程序、启动 ApplicationMaster 的命令、用户程序等;

②YARN 中的 ResourceManager 负责接收和处理来自客户端的请求。接到客户端应用程序请求后,ResourceManager 里面的调度器会为应用程序分配一个容器。同时,ResourceManager 的应用程序管理器会与该容器所在的 NodeManager 通信,为该应用程序在该容器中启动一个 ApplicationMaster;

③ApplicationMaster 被创建后会首先向 ResourceManager 注册,从而使得用户可以通过 ResourceManager 来直接查看应用程序的运行状态;

④ApplicationMaster 采用轮询的方式通过 RPC 协议向 ResourceManager 申请资源;

⑤ResourceManager 以 “容器” 的形式向提出申请的 ApplicationMaster 分配资源,一旦 ApplicationMaster 申请到资源后,就会与该容器所在的 NodeManager 进行通信,要求它启动任务;

⑥当 ApplicationMaster 要求容器启动任务时,它会为任务设置好运行环境(包括环境变量、JAR 包、二进制程序等),然后将任务启动命令写到一个脚本中,最后通过在容器中运行该脚本来启动任务;

⑦各个任务通过某个 RPC 协议向 ApplicationMaster 汇报自己的状态和进度,让 ApplicationMaster 可以随时掌握各个任务的运行状态,从而可以在任务失败时重启任务;

⑧应用程序运行完成后,ApplicationMaster 向 ResourceManager 的应用程序管理器注销并关闭自己。若 ApplicationMaster 因故失败,ResourceManager 中的应用程序管理器会监测到失败的情形,然后将其重新启动,直到所有任务执行完毕;

9. 请对 YARN 和 MapReduce1.0 框架进行优劣势对比分析。

(1)大大减少了承担中心服务功能的 ResourceManager 的资源消耗。MapReduce1.0 中的 JobTracker 需要同时承担资源管理、任务调度和任务监控等三大功能,而 YARN 中的 ResourceManager 只需要负责资源管理,需要消耗大量资源的任务调度和监控重启工作则交由 ApplicationMaster 来完成。由于每个作业都有与之关联的独立的 ApplicationMaster,所以,系统中存在多个作业时,就会同时存在多个 ApplicationMaster,这就实现了监控任务的分布化,不再像 MapReduce1.0 那样监控任务只集中在一个 JobTracker 上。

(2)MapReduce1.0 既是一个计算框架,又是一个资源管理调度框架,但是只能支持 MapReduce 编程模型。而 YARN 则是一个纯粹的资源调度管理框架,在它上面可以运行包括 MapReduce 在内的不同类型的计算框架,默认类型是 MapReduce。因为,YARN 中的 ApplicationMaster 是可变更的,针对不同的计算框架,用户可以采用任何编程语言自己编写服务于该计算框架的 ApplicationMaster。比如,可以编写一个面向 MapReduce 计算框架的 ApplicationMaster,从而使得 MapReduce 计算框架可以运行在 YARN 框架之上。同理,还可以编写面向 Spark、Storm 等计算框架的ApplicationMaster,从而使得 Spark、Storm 等计算框架也可以运行在 YARN 框架之上。

(3)YARN 中的资源管理比 MapReduce1.0 更加高效。YARN 采用容器为单位进行资源管理和分配,而不是以槽为单位,避免了 MapReduce1.0 中槽的闲置浪费情况,大大提高了资源的利用率。

10. 请分别描述 Pig、Tez 和 Kafka 的功能。

① Pig 是 Hadoop 生态系统的一个组件,允许用户通过编写简单的脚本来实现复杂的数据分析,而不需要编写复杂的 MapReduce 应用程序,Pig 会自动把用户编写的脚本转换成 MapReduce 作业在 Hadoop 集群上运行,而且具备对生成的 MapReduce 程序进行自动优化的功能;

② Tez 直接源于 MapReduce 框架,核心思想是将 Map 和 Reduce 两个操作进一步进行拆分,即 Map 被拆分成 Input、Processor、Sort、Merge 和 Output,Reduce 被拆分成 Input、Shuffle、Sort、Merge、Processor 和 Output 等,经过分解后的这些元操作可以进行自由任意组合产生新的操作,经过一些控制程序组装后就可形成一个大的 DAG 作业。通过 DAG 作业的方式运行 MapReduce 作业,提供了程序运行的整体处理逻辑,就可以去除工作流当中多余的 Map 阶段,减少不必要的操作,提升数据处理的性能;

③ Kafka 是由 LinkedIn 公司开发的一种高吞吐量的分布式发布订阅消息系统,用户通过 Kafka 系统可以发布大量的消息,同时也能实时订阅消费消息。Kafka 设计的初衷是构建一个可以处理海量日志、用户行为和网站运营统计等的数据处理框架。

Spark

1. 阐述如下 Spark 的几个主要概念:RDD、DAG、阶段、分区、窄依赖、宽依赖。

①RDD:是弹性分布式数据集(Resilient Distributed Dataset)的英文缩写,是分布式内存的一个抽象概念,提供了一种高度受限的共享内存模型。

②DAG:是 Directed Acyclic Graph(有向无环图)的英文缩写,反映 RDD 之间的依赖关系。

③阶段:是作业的基本调度单位,一个作业会分为多组任务,每组任务被称为 “阶段”,或者也被称为 “任务集”。

④分区:一个 RDD 就是一个分布式对象集合,本质上是一个只读的分区记录集合,每个 RDD 可以分成多个分区,每个分区就是一个数据集片段。

⑤窄依赖:父 RDD 的一个分区只被一个子 RDD 的一个分区所使用就是窄依赖。

⑥宽依赖:父 RDD 的一个分区被一个子 RDD 的多个分区所使用就是宽依赖

请添加图片描述

作者计算机硕士,从事大数据方向,公众号致力于技术专栏,主要内容包括:算法,大数据,个人思考总结等

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/650803
推荐阅读
相关标签
  

闽ICP备14008679号