《大数据基础》相关知识点及考点,例题

1.6大数据计算模式

1、MapReduce可以并行执行大规模数据处理任务,用于大规模数据集(大于1TB)的并行运算。MapReduce 极大地方便了分布式编程工作,它将复杂的、运行于大规模集群上的并行计算过程高度地抽象为两个函数一一MapReduce,编程人员在不会分布式并行编程的情况下,也可以很容易地将自己的程序运行在分布式系统上,完成海量数据集的计算。

2、Spark是一个针对超大数据集合的低延迟集群分布式计算系统比MapReduce快许多。Spark启用了内存分布数据集,除了能够提供交互式查询外,还可以优化迭代工作负载。在 MapReduce中,数据流从一个稳定的来源进行一系列加工处理后,流出到一个稳定的文件系统(如 HDFS )。而Spark 使用内存替代HDFS 或本地磁盘来存储中间结果,因此 Spark 要比 MapReduce 的速度许多。

1、在大数据的计算模式中,流计算解决的是什么问题?

A、 针对大规模数据的批量处理

B、 针对大规模图结构数据的处理

C、 大规模数据的存储管理和查询分析

D、 针对流数据的实时计算

2.2Hadoop生态系统

两大核心:HDFS、MapReduce

其他:Zookeeper,HBase,Hive,Pig,Mahout,Flume,Sqoop,Ambari

🔺1、HDFS

Hadoop分布式文件系统(HDFS)是Hadoop的两大核心之一,是针对谷歌文件系统的开源实现。

优点:处理超大数据、流式处理、可运行在廉价服务器上

以流的形式访问文件系统中的数据;HDFS 在访问应用程序数据时,可以具有很高的吞吐率,因此对于超大数据集的应用程序而言,选择 HDFS作为底层数据存储系统是较好的选择。

🔺 2、HBase

特点:提供高可靠性、高性能、可伸缩、实时读写、分布式的列式数据库,采用HDFS作为底层数据存储系统。

HBase 与传统关系数据库的一个重要区别是,前者采用基于的存储,后者采用基于的存储。HBase 具有良好的横向扩展能力,可以通过不增加廉价的商用服务器提高存储能力

🔺 3、MapReduce

Hadoop分布式并行编程模型(MapReduce),是针对谷歌MapReduce的开源实现

抽象为两个函数:Map和Reduce

MapReduce可以并行执行大规模数据处理任务,用于大规模数据集(大于1TB)的并行运算。MapReduce 极大地方便了分布式编程工作,它将复杂的、运行于大规模集群上的并行计算过程高度地抽象为两个函数一一Map和Reduce,并且允许用户在不了解分布式系统底层细节情况下开发并行应用程序,并将其运行于廉价的计算机集群上,完成海量数据的处理。

“分而治之”,它把输人的数据集切分为若干独立的数据块分发给一个主节点管理下的各个分节点来共同并行完成;最后,通过整合各个节点的中间结果得到最终结果。

4、Hive

基于Hadoop的数据仓库工具,用于对Hadoop文件中的数据集进行数据整理、特殊查询和分析存储

提供类似于SQL的查询语言——HiveQL,Hive自身可以转化为MapReduce任务,因而高效。

5、Pig

数据流语言和运行环境,适合于使用Hadoop 和MapReduce 平台来查询大型半结构化数据集。简化了Hadoop的常见工作任务,在MapReduce的基础上创建了更简单抽象的脚本语言,当我们需要从大型数据集中搜索满足某个给定搜索条件的记录时,采用 Pig 要比MapReduce 具有明显的优势

6、Mahout

提供可扩展的机器学习领域经典算法的实现,旨在帮助开发人员更加方便快捷地创建智能应用程序。Mahout 包含许多实现,如聚类分类、推荐过滤、频繁子项挖掘等。此外,通过使用 Apache Hadoop 库,Mahout 可以有效地扩展到云中。

🔺 7、Zookeeper

针对谷歌Chubby的开源实现,主要用于协调数据处理(很多事情都要用到它)。

是高效和可靠的协同工作系统,提供分布式锁之类的基本服务(如统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等),用于构建分布式应用减轻分布式应用程序所承担的协调任务。ZooKeeper 使用 Java编写。

8、Flume

一个高可用的、高可靠的、分布式的海量日志采集、聚合和传输的系统。

9、Sqoop

SQL to Hadoop的缩写,主要用来在 Hadoop 和关系数据库之间交换数据,可以改进数据的互操作性。可以将数据从传统关系数据库中导入hadoop

10、Ambari

一种基于Web的工具,支持Apache Hadoop 集群的安装、部署、配置和管理。

2、Hadoop 框架中最核心的设计是什么?

(A)为海量数据提供存储的 HDFS 和对数据进行计算的 MapReduce

(B)提供整个 HDFS 文件系统的 NameSpace(命名空间)管理、块管理等所有服务

(C) Hadoop 不仅可以运行在企业内部的集群中,也可以运行在云计尊环境中

(D)Hadoop 被视为事实上的大数据处理标准

3.3HDFS的相关概念

1、块概念:HDFS默认一个块大小64MB,在 HDFS 中的文件会被拆分多个块、每个块作为独立的单元进行存储。

2、采用块存储的好处:

(1)支持大规模文件存储:文件以块为单位进行存储,大规模文件被拆成若干文件块发送到不同节点

(2)简化系统设计简化了存储管理;方便了元数据的管理,元数据不需要和文件块一起存储,可以由其他系统负责管理元数据

(3)适合数据备份:每个文件块都被冗余存储到多个节点上(冗余存储:将数据在多个地方同时存储),大大提高了系统的容错性和可用性

3、名称节点

名称节点(NameNode)负责管理分布式文件系统命名空间(Namespace),存储元数据(记录数据的数据)。保存了两个核心的数据结构,即FsImage和EditLog

FsImage:维护文件系统树以及文件树中所有的文件和文件夹的元数据(描述数据的数据)

FsImage文件:包含文件系统所有目录和文件的innode序列化形式。即元数据

FsImage文件没有记录每个块存储在哪个数据节点。由名称节点存储

EditLog操作日志文件,记录了所有针对文件的创建、删除、重命名等操作。

名称节点的启动:将FsImage文件加载到内存中,再执行EditLog文件的各项操作。一旦在内存中成功建立元数据的映射,则创建一个新的FsImage文件和一个空的EditLog文件。

名称节点启动后,文件元数据的更新操作会写到EditLog而不是FsImage中,这是因为FsImage比EditLog大得多。

EditLog不断变大的问题:HDFS的更新操作直接写入EditLog,会造成其不断变大。当EditLog文件非常大的时候,会导致名称节点启动操作非常慢,而在这段时间内HDFS系统处于安全模式,一直无法对外提供写操作,影响了用户的使用

如何解决EditLog不断变大带来的问题:SecondaryNameNode 第二名称节点

第二名称节点是HDFS架构中的一个组成部分,用来保存名称节点中对HDFS元数据信息的备份减少名称节点重启的时间。一般是单独运行在一台机器上。

SecondaryNameNode第二名称节点工作流程:

(1)定期和NameNode通信,请求其停止使用EditLog文件,暂时将新的写操作写到一个新的文件EditLog.new上来,这个操作是瞬间完成,上层写日志的函数完全感觉不到差别;

(2)通过HTTPGET方式从NameNode上获取到FsImage和EditLog文件,并下载到本地的相应目录下;

(3)EditLog和FsImage文件合并:将下载下来的FsImage载入到内存,然后一条一条地执行EditLog文件中的各项更新操作,使FsImage保持最新

(4)执行完(3)之后,会通过post方式将新的FsImage文件发送到NameNode节点上

(5)NameNode将从SecondaryNameNode接收到的新的FsImage替换旧的FsImage文件,同时将EditLog.new替换EditLog文件,通过这个过程EditLog就变小了

4、数据结点

数据节点(DataNode)是分布式文件系统HDFS的工作节点,负责数据的存储和读取

根据客户或名称节点的调度进行数据的存储和检索,并且向名称节点定期发送自己所存储的块的列表

每个数据节点中的数据会被保存在各自节点的本地Linux文件系统

1、在一个基本的 Hadoop 集群中,DataNode 主要负责什么?

A、 存储被拆分的数据块

B、 协调数据计算任务

C、 负责协调集群中的数据存储

D、 负责执行由 JobTracker 指派的任务

2、在 HDFS 中,NameNode 的主要功能是什么?

A、 存储元数据

B、 存储文件内容

C、 文件内存保存在磁盘中

D、 维护了 block id 到 datanode 本地文件的映射关系

3、在一个基本的 Hadoop 集群中,SecondaryNameNode 主要负责什么?

A、 帮助 NameNode 收集文件系统运行的状态信息

B、 负责执行由 JobTracker 指派的任务

C、 协调数据计算任务

D、 负责协调集群中的数据存储

4、一个基本的 Hadoop 集群中的节点主要包括什么?

A、 DataNode:存储被拆分的数据块

B、 JobTracker:协调数据计算任务

C、 TaskTracker:负责执行由 JobTracker 指派的任务

D、 SecondaryNameNode:帮助 NameNode 收集文件系统运行的状态信息

5、在 HDFS 中,默认一个块多大?

A、 64MB     B、 32MB      C、 128MB      D、 16MB

6、下面对FsImage的描述,哪个是错误的?

A、FsImage文件没有记录每个块存储在哪个数据节点

B、FsImage文件包含文件系统中所有目录和文件inode的序列化形式

C、FsImage用于维护文件系统树以及文件树中所有的文件和文件夹的元数据

D、FsImage文件记录了每个块具体被存储在哪个数据节点

7、下面对 SecondaryNameNode 第二名称节点的描述,哪个是错误的?

A、 SecondaryNameNode 一般是并行运行在多台机器上

B、 它是用来保存名称节点中对 HDFS 元数据信息的备份,并减少名称节点重启的时间

C、 SecondaryNameNode 通过 HTTPGET 方式从 NameNode 上获取到 FsImage 和EditLog 文件,并下载到本地的相应目录下

D、 SecondaryNameNode 是 HDFS 架构中的一个组成部分

8、在 HDFS 中,名称节点(NameNode)主要保存了哪些核心的数据结构?

A、 FsImage   B、 EditLog     C、 Block     D、 DN8

9、数据节点(DataNode)的主要功能包括哪些?

A、 负责数据的存储和读取

B、 根据客户端或者是名称节点的调度来进行数据的存储和检索

C、 向名称节点定期发送自己所存储的块的列表

D、 用来保存名称节点中对 HDFS 元数据信息的备份,并减少名称节点重启的时间

3.5HDFS的存储原理

1、数据的冗余存储:作为一个分布式文件系统,为了保证系统的容错性和可用性,HDFS采用了多副本方式对数据进行冗余存储,通常一个数据块的多个副本会被分布到不同的数据节点上,具有以下优点:

(1)加快数据传输速度

(2)容易检查数据错误

(3)保证数据可靠性

2、数据存取策略:

数据存放:

为了提高数据的可靠性与系统的可用性,以及充分利用网络带宽,HDFS采用了以机架(Rack)为基础的数据存放策略。

HDFS默每个数据节点都在不同的机架上。

默认冗余复制因子3每一个文件块会被同时保存到3个地方,其中,有两个副本放在同一个机架的不同机器上面,第3个副本放在不同机架的机器上面,这样既可以保证机架发生异常时的数据恢复,也可以提高数据读写性能。

客户端指定或随机挑选——与上一个不同的机架上——与第一个相同的机架上不同节点上

  • 第一个副本:如果是在集群内发起写操作请求,则把第1个副本放置在发起写操作请求的数据节点上实现就近写人数据;如果是集群外提交,则随机挑选一台磁盘不太满、CPU不太忙的节点
  • 第二个副本:放置在与第一个副本不同的机架的数据节点
  • 第三个副本:与第一个副本相同机架的其他节点
  • 更多副本:随机数据节点

数据读取:

HDFS提供了一个API可以确定一个数据节点所属的机架ID,客户端也可以调用API获取自己所属的机架ID。

当客户端读取数据时,从名称节点获得数据块不同副本的存放位置列表,列表中包含了副本所在的数据节点,可以调用API来确定客户端和这些数据节点所属的机架ID,当发现某个数据块副本对应的机架ID和客户端对应的机架ID相同时,就优先选择该副本读取数据,如果没有发现,就随机选择一个副本读取数据。

优先选择与客户端同一机架内的数据副本进行读取,除此以外再随机选择副本读取。

3、数据错误与修复:

名称节点出错:名称节点保存了所有的元数据信息,HDFS设置备份机制,将核心元数据信息赋值备份到SecondaryNameNode

数据节点出错:数据节点故障时会标记成“宕机”副本数量小于冗余因子时启动数据冗余复制生成新的副本。HDFS和其它分布式文件系统的最大区别就是可以调整冗余数据的位置。

  • 每个数据节点会定期向名称节点发送“心跳”信息,向名称节点报告自己的状态
  • 当数据节点发生故障,或者网络发生断网时,名称节点就无法收到来自一些数据节点的心跳信息,这时,这些数据节点就会被标记为宕机”,节点上面的所有数据都会被标记为不可读”,名称节点不会再给它们发送任何I/O请求
  • 这时,有可能出现一种情形,即由于一些数据节点的不可用,会导致一些数据块的副本数量小于冗余因子
  • 名称节点会定期检查这种情况,一旦发现某个数据块的副本数量小于冗余因子,就会启动数据冗余复制,为它生成新的副本
  • HDFS和其它分布式文件系统的最大区别就是可以调整冗余数据的位置

数据出错网络传输和磁盘错误等因素造成数据错误。HDFS有一套机制来修复

  • 客户端在读取到数据后,会采用md5和sha1对数据块进行校验,以确定读取到正确的数据
  • 在文件被创建时,客户端就会对每一个文件块进行信息摘录,并把这些信息写入到同一个路径的隐藏文件里面
  • 当客户端读取文件的时候,会先读取该信息文件,然后,利用该信息文件对每个读取的数据块进行校验,如果校验出错,客户端就会请求到另外一个数据节点读取该文件块,并且向名称节点报告这个文件块有错误,名称节点会定期检查并且重新复制这个块

1、HDFS 数据块多副本存储具备以下哪些有点?

A、 加快数据传输速度

B、 容易检查数据错误

C、 保证数据可靠性

D、 适合多平台上运行

2、HDFS 具有较高的容错性,设计了哪些相应的机制检测数据错误和进行自动 恢复?

A、 名称节点出错

B、 数据节点出错

C、 数据出错

D、 数据源太大

3.7.1HDFS常用命令

在 Linux 终端窗口,我们可以利用 Shell 命令对 Hadoop 进行操作。利用这些命令可以完成HDFS 中文档的上传、下载、复制、查看文件信息、格式化名称节点等操作。关于HDFS 的 Shell命令有一个统一的格式:

hadoop  command  [genericOptions]  [commandOptions]

HDFS 有很多命令,其中fs 命令可以说是 HDFS 最常用的命令,利用s 命令可以查看 HDFS的目录结构、上传和下载数据、创建文件等。该命令的用法如下:

hadoop  fs  [genericOptions]  [commandOptions]

具体如下。

  • hadoop fs -ls <path>。显示<path>指定的文件的详细信息
  • hadoop fs -ls -R <path>。Is 命令的递归版本。
  • hadoop fs-cat <path>。将<path>指定的文件的内容输出到标准输出(stdout)。
  • hadoop fs -chgrp [-R] group <path>。将<path>指定的文件所属的组改为 group,使用-R对<path>指定的文件夹内的文件进行递归操作。这个命令只适用于超级用户。
  • hadoop fs -chown [-R][owner][: [group]] <path>。改变<path>指定的文件所有者,-R 用于递归改变文件夹内的文件所有者。这个命令只适用于超级用户。
  • hadoop fs -chmod[-R]<mode> path>。将<path>指定的文件的权限更改为<mode>。这个命令只适用于超级用户和文件所有者。
  • hadoop fs -tail[-f] <path>。将path>指定的文件最后1KB 的内容输出到标准输出(stdout)上,-f选项用于持续检测新添加到文件中的内容。
  • hadoop fs -stat[format] <path>。以指定的格式返回<path>指定的文件的相关信息。当不指定format的时候,返回文件<path>的创建日期。
  • hadoop fs -touchz <path>。创建一个<path>指定的空文件。
  • hadoop fs -mkdir [-p]<paths>。创建<paths>指定的一个或多个文件夹,p 选项用于递归创建子文件夹。
  • hadoop fs -copyFromLocal <localsrc><ds>。将本地源文件<localsrc>复制到路径<dst>指定的文件或文件夹皎哎财癌拆稗绊癌毕爱笨伴拜暗搬摆
  • hadoop fs -copyToLocal [-ignorecrc][-crc]<target> <localds>。将目标文件<target>复制到本地文件或文件夹<localds中,可用-ignorecrc 选项复制 CRC 校验失败的文件,使用-crc 选项复制文件以及CRC信息。
  • hadoop fs -cp <src> <ds>。将文件从源路径<src>复制到目标路径<dst>o
  • hadoop fs-du path>。显示path>指定的文件或文件夹中所有文件的大小
  • hadoop fs-expunge。清空回收站,请参考HDFS 官方文档以获取更多关于回收站特性的信息。
  • hadoop fs -get [-ignorecrc][-crc] <src> <localdst>。复制<src>指定的文件到本地文件系统<localds>指定的文件或文件夹,可用-igorecrc 选项复制CRC校验失败的文件,使用-crc 选项复制文件以及 CRC信息。
  • hadoop fs -getmerge [-nl] <src> <localdst>。对src指定的源目录中的所有文件进行合并,写人<localds>指定的本地文件。-nl 是可选的,用于指定在每个文件结尾添加一个换行符。
  • hadoop fs -put <localsrc> <dst。从本地文件系统中复制<localsrc>指定的单个或多个源文件到<dst>指定的目标文件系统中,也支持从标准输人(stdin)中读取输入并写人目标文件系统。
  • hadoop fs -moveFromLocal<localsrc> <dst>。与 put 命令功能相同,但是文件上传结束后会从本地文件系统中删除<localsrc>指定的文件。
  • hadoop fs-v <src> <dest>。将文件从源路径<src>移动到目标路径<dst>
  • hadoopfs -rm <path>。删除<path>指定的文件,只删除非空目录和文件。
  • hadoop fs -rm -r <path>。删除<path>指定的文件夹及其下的所有文件,-r 选项表示递归删除子目录。
  • hadoop fs -setrep [-R]<path>。改变<path>指定的文件的副本系数,-选项用于递归改变目录下所有文件的副本系数。
  • hadoop fs -test-[ezd]<path>。检查path>指定的文件或文件夹的相关信息。不同选项的作用如下。
  • e检查文件是否存在,如果存在则返回 0,否则返回1。
  • z检查文件是否是0字节,如果是则返回0,否则返回1
  • ③-d 如果路径是个目录,则返回1,否则返回0。
  • hadoopfs-text<path>。将path>指定的文件输出为文本格式,文件的格式也允许是zip和TextRecordInputStream 等。

1、启动hadoop所有进程的命令是:

A.  start-dfs.sh

B.  start-all.sh

C.  start-hadoop.sh

D.  start-hdfs.sh

2、以下哪个命令可以用来操作HDFS文件:

A.  hadoop fs

B.  hadoop dfs

C.  hdfs fs

D.  hdfs dfs

4.1分布式数据库HBase概述

1、BigTable

BigTable是分布式存储系统,起初用于解决典型问题的互联网搜索问题。

建立互联网索引

  • 爬虫持续不断地抓取新页面,这些页面每页一行地存储到BigTable里
  • MapReduce计算作业运行在整张表上,生成索引,为网络搜索应用做准备

搜索互联网

  • 用户发起网络搜索请求
  • 网络搜索应用查询建立好的索引,从BigTable得到网页
  • 搜索结果提交给用户

BigTable是一个分布式存储系统;

利用谷歌的MapReduce分布式并行计算模型来处理海量数据;

利用谷歌分布式文件系统GFS作为底层数据存储;

采用Chubby提供协同服务管理;

可扩展到PB级别和上千台机器,具有广泛应用性可扩展性高性能高可用性

谷歌的许多项目都在BigTable中;

总的来说,BigTable 具备以下特性:支持大规模海量数据,分布式并发数据处理效率极高易于扩展且支持动态伸缩,适用于廉价设备,适合读操作不适合写操作。

2、HBase

HBase是一个高可靠、高性能、面向列、可伸缩的分布式数据库,具有低延迟的特点,是BigTable的开源实现,主要用来存储非结构化和半结构化的松散数据。

目标:处理非常庞大的表,通过水平扩展的方式,利用廉价计算机集群处理由超过10亿行数据和数百万列元素组成的数据表

传统关系数据库已经流行很多年,并且Hadoop已经有了HDFS和MapReduce,为什么需要HBase?

  • 传统关系数据库无法应对数据量剧增时导致的性能问题
  • HDFS面向批量访问模式,不是随机访问模式(HBase可以通过索引直接访问)
  • 传统关系数据库可扩展性差,传统的通用关系型数据库无法应对在数据规模剧增时导致的系统扩展性和性能问题
  • 传统关系数据库在数据结构变化时一般需要停机维护,空列浪费存储空间

因此,业界出现了一类面向半结构化数据存储和处理的高可扩展、低写入/查询延迟的系统,例如,键值数据库、文档数据库和列族数据库(如BigTable和HBase等)

HBase已经成功应用于互联网服务领域和传统行业的众多在线式数据分析处理系统

HBase与传统的关系数据库的区别主要体现在以下几个方面:

  • 数据类型:关系数据库采用关系模型,具有丰富的数据类型和存储方式,HBase则采用了更加简单的数据模型,它把数据存储为未经解释的字符串,用户可以把不同格式的结构化数据和非结构数据都序列化成字符串保存到HBase中
  • 数据操作:关系数据库中包含了丰富的操作,如插入、删除、更新、查询等,其中会涉及复杂的多表连接,借助主外键关联来实现。HBase操作则不存在复杂的表与表之间的关系,只有简单的插入、查询、删除、清空等,因为HBase在设计上就避免了复杂的表和表之间的关系,通常只采用单表的主键查询,所以它无法实现像关系数据库中那样的表与表之间的连接操作。
  • 存储模式:关系数据库是基于行模式存储的。HBase是基于列存储的,每个列族都由几个文件保存,不同列族的文件是分离的,它的优点是:可以降低I/0开销,支持大量并发用户查询(因为仅需要处理可以回答这些查询的列,而不需要处理与查询无关的大量数据行 );同一个列族中的数据会被一起压缩(由于同一列族内的数据相似度较高因此可以获得较高的数据压缩比)。
  • 数据索引:关系数据库通常可以针对不同列构建复杂的多个索引,以提高数据访问性能。HBase只有一个索引——行键,通过巧妙的设计,HBase中的所有访问方法,或者通过行键访问,或者通过行键扫描,从而使得整个系统不会慢下来。由于 HBase 位于Hadoop 框架之上,因此可以使用 Hadoop MapReduce 来快速、高效地生成索引表。
  • 数据维护:关系数据库中,更新操作会用最新的当前值去替换记录中原来的旧值,旧值被覆盖后就不会存在。而在HBase中执行更新操作时,并不会删除数据旧的版本,而是生成一个新的版本,旧有的版本仍然保留
  • 可伸缩性:关系数据库很难实现横向扩展,纵向扩展的空间也比较有限。相反,HBase和BigTable这些分布式数据库就是为了实现灵活的水平扩展而开发的,能够轻易地通过在集群中增加或者减少硬件数量来实现性能的伸缩

但是,相对关系数据库,HBase 也有自身的局限性,如 HBase 不支持事务,因此无法实现跨行的原子性。

1、下列关于 BigTable 的描述,哪个是错误的?

A、 爬虫持续不断地抓取新页面,这些页面每隔一段时间地存储到 BigTable 里

B、 BigTable 是一个分布式存储系统

C、 BigTable 起初用于解决典型的互联网搜索问题

D、 网络搜索应用查询建立好的索引,从 BigTable 得到网页

2、下列选项中,关于 HBase 和 BigTable 的底层技术对应关系,哪个是错误的?

A、 GFS 与 Zookeeper

B、 GFS 与 HDFS

C、 MapReduce 与 Hadoop MapReduce

D、 Chubby 与 Zookeeper

3、在 HBase 中,关于数据操作的描述,下列哪一项是错误的?

A、 HBase 则采用了更加简单的数据模型,它把数据存储为未经解释的字符串

B、 HBase 操作不存在复杂的表与表之间的关系

C、 HBase 操作只有简单的插入、查询、删除、清空等

D、 HBase 在设计上就避免了复杂的表和表之间的关系

4、在 HBase 访问接口中,Pig 主要用在哪个场合?

A、 适合做数据统计

B、 适合 HBase 管理使用

C、 适合其他异构系统在线访问 HBase 表数据

D、 适合 Hadoop MapReduce 作业并行批处理 HBase 表数据

5、关系数据库已经流行很多年,并且 Hadoop 已经有了 HDFS 和 MapReduce, 为什么需要 HBase?

A、 Hadoop 可以很好地解决大规模数据的离线批量处理问题,但是,受限于 Hadoop MapReduce 编程框架的高延迟数据处理机制,使得 Hadoop 无法满足大 规模数据实时处理应用的需求上

B、 HDFS 面向批量访问模式,不是随机访问模式

C、 传统的通用关系型数据库无法应对在数据规模剧增时导致的系统扩展性和 性能问题

D、 传统关系数据库在数据结构变化时一般需要停机维护;空列浪费存储空间 

6、HBase 与传统的关系数据库的区别主要体现在以下哪几个方面?

A、 数据类型

B、 数据操作

C、 存储模式

D、 数据维护

4.3HBase数据模型

1、数据模型概述:

  • HBase是一个稀疏、多维度、排序的映射表,表的索引是行键、列族、列限定符和时间戳
  • 用户在表中存储数据,每一行都有一个可排序的行键和任意多的列
  • 表在水平方向由一个或者多个列族组成,一个列族中可以包含任意多个列,同一个列族里面的数据存储在一起
  • 表由行和列组成,行由行键来标识,列划分为若干个列族,列族里面有任意多个列,列由列限定符来定位
  • 单元格由行、列族和列限定符和时间戳四者共同确定,每个值是一个未经解释的字符串,没有数据类型
  • 列族支持动态扩展,可以很轻松地添加一个列族或列,无需预先定义列的数量以及类型,所有列均以字符串形式存储,用户需要自行进行数据类型转换
  • 执行更新操作时并不会删除旧的版本,而是生成一个新的版本,旧有的版本仍然保留(这是和HDFS只允许追加不允许修改的特性相关的),每个单元格都保存数据的多个版本,这些版本用时间戳索引

2、数据模型相关概念:

  • :HBase采用来组织数据,表由行和列组成,列划分为若干个列族
  • :每个HBase表都由若干行组成,每个行由行键(row key)来标识。访问表中的行只有3种方式:通过单个行键访问;通过一个行键的区间来访问,全表扫描。行键可以是任意字符串(最大长度是64 KB,实际应用中长度一般为 10~100 Byte )。
  • 列族:一个HBase表被分组成许多“列族”(Column Family)的集合,它是基本的访问控制单元。在 HBase 中,访问控制、磁盘和内存的使用统计都是在列族层面进行的.
  • 列限定符列族里的数据通过列限定符(或列)来定位。列限定符不用事先定义,也不需要在不同行之间保持一致。列限定符没有数据类型,总被视为字节数组 byte[ ]。
  • 单元格:在HBase表中,通过行、列族和列限定符确定一个“单元格”(cell),单元格中存储的数据没有数据类型,总被视为字节数组byte[ ]。每个单元格中可以保存一个数据的多个版本,每个版本对应一个不同的时间戳。
  • 时间戳:每个单元格都保存着同一份数据的多个版本,这些版本采用时间戳进行索引

1、HBase 中需要根据某些因素来确定一个单元格,这些因素可以视为一个 "四维坐标",下面哪个不属于"四维坐标"?

A、 关键字    B、 行键    C、 列族     D、 时间戳

2、HBase 只有一个针对行健的索引,如要要访问 HBase 表中的行,下面哪种 方式是不可行的?

A、 通过单个行健访问

B、 通过时间戳访问

C、 通过一个行健的区间来访问

D、 全表扫描

3、下列关于数据模型的描述,哪些是正确的?

A、 HBase 采用表来组织数据,表由行和列组成,列划分为若干个列族

B、 每个 HBase 表都由若干行组成,每个行由行键(row key)来标识

C、 列族里的数据通过列限定符(或列)来定位

D、 每个单元格都保存着同一份数据的多个版本,这些版本采用时间戳进行索 引

4.4HBase的实现原理

1、HBase的功能组件(各个功能的实现方法)

(1)库函数:链接到各个客户端

(2)一个Master主服务器:负责管理和维护HBase表的分区信息,分配和维护Region服务器列表,负载均衡

(3)许多个Region服务器:负责存储和维护分配给自己的Region,处理来自客户端的读写请求

  • 客户端并不是直接从Master主服务器上读取数据,而是在获得Region的存储位置信息后,直接从Region服务器上读取数据
  • 客户端并不依赖Master(甚至不与Master通信),而是通过Zookeeper获得Region服务器,直接从Region服务器上读取数据,这种设计方式使得Master负载很小

2、表和Region

在一个HBase 中,存储了许多表。对于每个 HBase 表而言,表中的行是根据行键的值的字序进行维护的,表中包含的行的数量可能非常庞大,无法存储在一台机器上,需要分布存储到台机器上。因此,需要根据行键的值对表中的行进行分区(见图 4-5 )。每个行区间构成一个分区被称为“Region”Region 包含了位于某个值域区间内的所有数据,是负载均衡和数据分发的基本单位。这些 Region 会被分发到不同的 Region 服务器上。

3、Region的分裂:

一开始只有一个Region,后来不断分裂

Region拆分操作非常快,接近瞬间,因为拆分之后的Region读取的仍然是原存储文件,直到“合并”过程把存储文件异步地写到独立的文件之后,才会读取新文件

每个Region 的默认大小是 100~200 MB,Region的最佳大小取决于单台服务器的有效处理能力。同一个Region不会被拆分到多个Region服务器,一个Region服务器存储10-1000个Region

4、Region的定位:

层次

名称

作用

第一层

Zookeeper文件

记录-ROOT-表的位置信息

第二层

-ROOT-

(根数据表)

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

记录所有元数据的具体位置

第三层

.META.

(元数据表)

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

存储了Region服务器和各个Region之间的映射关系,可以分裂成多个Region

  • 为了加快访问速度,.META.表的全部Region都会被保存在内存
  • 假设.META.表的每行(一个映射条目)在内存中大约占用1KB,并且每个Region限制为128MB,那么,上面的三层结构可以保存的用户数据表的Region数目的计算方法是:

(-ROOT-表能够寻址的.META.表的Region个数)×(每个.META.表的 Region可以寻址的用户数据表的Region个数)

  • 一个-ROOT-表最多只能有一个Region,也就是最多只能有128MB,按照每行(一个映射条目)占用1KB内存计算,128MB空间可以容纳128MB/1KB=217行,也就是说,一个-ROOT-表可以寻址217.META.表的Region。
  • 同理,每个.META.表的 Region可以寻址的用户数据表的Region个数是128MB/1KB=217
  • 最终,三层结构可以保存的Region数目是(128MB/1KB) × (128MB/1KB) = 234个Region

客户端访问用户数据之前,需要首先访间 ZooKeeper,获取-ROOT-表的位置信息,然后访问-ROOT表,获得META.表的信息,接着访问META.表,找到所需的 Region 具体位于哪个 Regior服务器,最后才会到该 Rcgion 服务器读取数据。

客户端访问数据时的“三级寻址”

  • 为了加速寻址,客户端会缓存位置信息,同时,需要解决缓存失效问题
  • 寻址过程客户端只需要询问Zookeeper服务器,不需要连接Master服务器

1、下面关于 Region 的说法,哪个是错误的?

A、 同一个 Region 不会被分拆到多个 Region 服务器

B、 为了加快访问速度,.META.表的全部 Region 都会被保存在内存中

C、 一个-ROOT-表可以有多个 Region

D、 为了加速寻址,客户端会缓存位置信息,同时,需要解决缓存失效问题

2、关于 HBase 的三层结构中各层次的名称和作用的说法,哪个是错误的?

A、 Zookeeper 文件记录了用户数据表的 Region 位置信息

B、 -ROOT-表记录了.META.表的 Region 位置信息

C、 .META.表保存了 HBase 中所有用户数据表的 Region 位置信息

D、 Zookeeper 文件记录了-ROOT-表的位置信息

3、下面关于主服务器 Master 主要负责表和 Region 的管理工作的描述,哪 个是错误的?

A、 实现相同 Region 服务器之间的负载均衡行

B、 在 Region 分裂或合并后,负责重新调整 Region 的分布

C、 对发生故障失效的 Region 服务器上的 Region 进行迁移

D、 管理用户对表的增加、删除、修改、查询等操作

4、HBase 的实现包括哪三个主要的功能组件?

A、 库函数:链接到每个客户端

B、 一个 Master 主服务器

C、 许多个 Region 服务器

D、 部署在廉价的计算机集群中

5、HBase 的三层结构中,三层指的是哪三层?

A、 Zookeeper 文件

B、 -ROOT-表

C、 .META.表

D、 数据类型

6、HBase 性能监视主要包括以下哪几方面?

A、 Master-status(自带)

B、 Ganglia

C、 OpenTSDB

D、 Ambari

7、Zookeeper 是一个很好的集群管理工具,被大量用于分布式计算,它主要 提供什么服务?

A、 配置维护

B、 域名服务

C、 分布式同步

D、 组服务

8、下列关于 Region 服务器工作原理的描述,哪些是正确的?

A、 每个 Region 服务器都有一个自己的 HLog 文件

B、 每次刷写都生成一个新的 StoreFile,数量太多,影响查找速度

C、 合并操作比较耗费资源,只有数量达到一个阈值才启动合并

D、 Store 是 Region 服务器的核心

9、下列关于 HLog 工作原理的描述,哪些是正确的?

A、 分布式环境必须要考虑系统出错。HBase 采用 HLog 保证

B、 HBase 系统为每个 Region 服务器配置了一个 HLog 文件

C、 Zookeeper 会实时监测每个 Region 服务器的状态

D、 Master 首先会处理该故障 Region 服务器上面遗留的 HLog 文件 

4.6.1HBase常用的shell命令

接下来,我们将详细介绍常用的数据定义语言(Data Definition Language,DDL)和数据操作语言( Data Manipulation Language,DML)命令。对于其他命令,读者可以使用 help 命令来获知该命令的作用及其具体语法,比如使用“help create”命令查询 create 的使用方法。

1、create:创建表

①创建表 t1,列族为 f1,列族版本号为 5,命令如下:

hbase>create 't1',{NAME => f1',VERSIONS => 5}

②创建表 t1,3 个列族分别为 f1、f2、3,命令如下:

hbase>create 't1',{NAME => 'f1'},{NAME => 'f2'},{NAME => 'f3'}

或者使用如下等价的命令:

hbase>create 'tl','fl','f2','f3'

③创建表 t1,将表依据分割算法 HexStringSplit 分布在 15 个 Region 里,命令如下:

hbase>create 't1','1',{NUMREGIONS => 15,SPLITALGO ='HexStringSplit'}

④创建表 t1,指定切分点,命令如下:

hbase>create 't1','f1',{SPLITS => ['10','20','30','40']}

2、list: 列出 HBase 中所有的表信息

该命令比较简单,这里不做具体说明。

3、put:向表、行、列指定的单元格添加数据(一次只能为一个表的一行数据的一个列添加一个数据

在添加数据时,HBase会自动为添加的数据添加一个时间戳,当然,也可以在添加数据时人工指定时间戳的值

向表 t1 中行 row1 和列 fl:c1 所对应的单元格中添加数据 value1,时间戳为 1421822284898,命令如下:

hbase>put 't1','row1','fl:c1','value1',1421822284898

4、get: 通过指定表名、行、列、时间戳、时间范围和版本号来获得相应单元格的值

获得表 t1、行rl、列c1、时间范围为[tsl,ts2]、版本号为4的数据,命令如下:

hbase>get 't1','r1',{COLUMN => 'C1',TIMERANGE => [ts1,ts2],VERSIONS => 4}

②获得表 t1、行r1、列c1 和 c2 的数据,命令如下:

hbase>get 't1','r1','c1','c2'

5、scan:浏览表的相关信息可以通过 TIMERANGE、FILTER、LIMIT、STARTROW、STOPROW、TIMESTAMP、MAXLENGTH、COLUMNS、CACHE 来限定所需要浏览的数据。

①浏览表“.META.”、列info:regioninfo 的数据,命令如下:

hbase>scan '.META.',{COLUMNS => 'info:regioninfo'}

②浏览表 t1、列c1、时间范围为[1303668804,1303668904]的数据,命令如下:

hbase>scan 't1',{COLUMNS -> 'c1',TIMERANGE => [1303668804,1303668904]}

6、alter: 修改列族模式

①向表 t1 添加列族f1,命令如下:

hbase>alter 'tl',NAME => 'f1'

②删除表 t1 中的列族 f1,命令如下:

hbase>alter 't1',NAME => 'f1', METHOD => 'delete'

③设定表 t1 中列族 f1 最大为 128 MB,命令如下:

hbase>alter 't1',METHOD => 'table_att', MAX_FILESIZE => '134217728'

上面命令中,“134217728”表示字节数,128 MB 等于 134217728 Byte。

7、count: 统计表中的行数

比如可以使用如下命令统计表 t1 中的行数:

hbase>count 't1'

8、describe: 显示表的相关信息

比如可以使用如下命令显示表 t1 的信息:

hbase>describe 't1'

9、enable/disable:使表有效或无效

该命令比较简单,这里不做具体说明

10、delete: 删除指定单元格的数据

删除表 t1、行rl、列cl、时间戳为 tsl 的数据,命令如下:

hbase>delete 't1','r1','cl',,ts1

11、drop: 删除表

该命令比较简单,这里不做具体说明。需要指出的是,删除某个表之前,必须先使该表

无效。

12、exists: 判断表是否存在

该命令比较简单,这里不做具体说明。

13、truncate: 使表无效,删除该表,然后重新建立表

该命令比较简单,这里不做具体说明。

14、exit: 退出 HBase Shell

该命令比较简单,这里不做具体说明

15、shutdown:关闭 HBase 集群

该命令比较简单,这里不做具体说明。

16、version:输出 HBase 版本信息

该命令比较简单,这里不做具体说明

17、status:输出 HBase 集群状态信息

可以通过 summary、simple 或者 detailed这3个参数指定输出信息的详细度。

输出集群详细状态信息,命令如下:

hbase>status 'detailed'

5.5 NoSQL的三大基石

NoSQL的三大基石包括:CAP、BASE和最终一致性。

1、CAP

CAP理论告诉我们:一个分布式系统不可能同时满足C(一致性)、A(可用性)、P(分区容忍性),最多同时满足两个

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

2、当处理CAP的问题时,可以有几个明显的选择:

  • CA:强调一致性(C)和可用性(A),放弃分区容忍性(P),将所有事务内容放到一台机器上,可扩展性较差传统关系数据库都采用了这种设计原则。
  • CP:强调一致性(C)和分区容忍性(P),放弃可用性(A),出现网络分区影响时,受影响的服务需要等待数据一致,因此在等待期间就无法对外提供服务。BigTable,HBase,Redis,MongoDB等
  • AP:强调可用性(A)和分区容忍性(P),放弃一致性(C),允许系统返回不一致的数据。Dynamo,CouchDB,Riak等

2、BASE

一个数据库事务具有ACID四性:

  • A(Atomicity):原子性,是指事务必须是原子工作单元,对于其数据修改,要么全都执行,要么全都不执行
  • C(Consistency):一致性,是指事务在完成时,必须使所有的数据都保持一致状态
  • I(Isolation):隔离性,是指由并发事务所做的修改必须与任何其它并发事务所做的修改隔离
  • D(Durable):持久性,是指事务完成之后,它对于系统的影响是永久性的,该修改即使出现致命的系统故障也将一直保持

BASE的基本含义是基本可用(Basically Availble)软状态(Soft-state)最终一致性(Eventual consistency)

  • Basically Available:基本可用性,允是指一个分布式系统的一部分发生问题变得不可用时,其他部分仍然可以正常使用,也就是允许分区失败的情形出现
  • Soft state:软状态,与“硬状态(hard-state)”相对应的一种提法。数据库保存的数据是硬状态”时,可以保证数据一致性,即保证数据一直是正确的软状态”是指状态可以有一段时间不同步,具有一定的滞后性
  • Eventually consistency:最终一致性,包括强一致性弱一致性,即只要保证数据最终是一致的就可以了

一致性的类型包括强一致性弱一致性,二者的主要区别在于高并发的数据访问操作下,后续操作是否能够获取最新的数据。对于强一致性而言,当执行完一次更新操作后,后续的其他读操作就可以保证读到更新后的最新数据;反之,如果不能保证后续访问读到的都是更新后的最新数据,那么就是弱一致性。而最终一致性只不过是弱一致性的一种特例,允许后续的访问操作可以暂时读不到更新后的数据,但是经过一段时间之后,必须最终读到更新后的数据。

最常见的实现最终一致性的系统是DNS(域名系统)。一个域名更新操作根据配置的形式被分发出去,并结合有过期机制的缓存;最终所有的客户端可以看到最新的值。

3、最终一致性

最终一致性根据更新数据后各进程访问到数据的时间和方式的不同,又可以区分为:

  • 因果一致性:没有因果关系的节点绝对不互相访问
  • “读己之所写”一致性绝不会看到旧值,只会看到最新写入的值
  • 会话一致性:会话还在,系统就保证一致性
  • 单调读一致性:如果之前看到了一个值,那之后绝不会看到这个值之前的值
  • 单调写一致性:系统按照写操作的顺序执行,这是必须保证的

7.2MapRuduce的工作流程

1、MapReduce的体系结构:

MapReduce体系结构主要由四个部分组成,分别是:Client、JobTracker、TaskTracker以及Task

(1)Client(客户端)

  • 用户编写的MapReduce程序通过Client提交到JobTracker端
  • 用户可通过Client提供的一些接口查看作业运行状态

(2)JobTracker(三大功能:资源管理,任务调度,任务监控)

  • 负责资源监控和作业调度
  • 监控所有TaskTracker与Job的健康状况,一旦发现失败,就将相应的任务转移到其他节点
  • 跟踪任务的执行进度、资源使用量等信息,并将这些信息告诉任务调度器(TaskScheduler),而调度器会在资源出现空闲时,选择合适的任务去使用这些资源

(3)TaskTracker

  • 周期性地通过“心跳”将本节点上资源的使用情况和任务的运行进度汇报给JobTracker,同时接收JobTracker 发送过来的命令并执行相应的操作(如启动新任务、杀死任务等)
  • 使用“slot”等量划分本节点上的资源量(CPU、内存等),一个Task 获取到一个slot 后才有机会运行,而Hadoop调度器的作用就是将各个TaskTracker上的空闲slot分配给Task使用。slot分为Map slot和Reduce slot两种,分别供Map Task和Reduce Task使用

(4)Task

  • Task分为Map Task 和Reduce Task 两种,均由TaskTracker 启动

2、MapReduce工作流程:

大规模数据集的处理包括分布式存储分布式计算两个核心环节。Hadoop 使用分布式文件系统HDFS实现分布式数据存储,用 Hadoop MapReduce 实现分布式计算。MapReduce 的输人和输出都需要借助于分布式文件系统进行存储,这些文件被分布存储到集群中的多个节点上。

MapReduce 的核心思想可以用分而治之”来描述,把一个大的数据集拆分成多个小数据集在多台机器上并行处理。一个大的 MapReduce 作业,首先会被拆分成许多个 Map 任务在多台机器上并行执行,每个 Map 任务通常运行在数据存储的节点上。这样计算和数据就可以放在一起运行,不需要额外的数据传输开销。当 Map 任务结束后,会生成以<key,value>形式的许多中间结果。然后,这些中间结果会被分发到多个 Reduce 任务在多台机器上并行执行,具有相同 key 的<key,value>会被发送到同一个 Reduce 任务,Reduce 任务会对中间结果进行汇总计算得到最后结果,并输出到分布式文件系统。

  • 不同的Map任务之间不会进行通信
  • 不同的Reduce任务之间也不会发生任何信息交换
  • 用户不能显式地从一台机器向另一台机器发送消息
  • 所有的数据交换都是通过MapReduce框架自身去实现的

全过程:

  • 从分布式文件系统(HDFS)读入数据
  • 执行Map任务输出中间结果
  • 通过Shuffle阶段把中间结果分区、排序整理后发送给Reduce任务
  • 执行Reduce任务得到最终结果并写入分布式文件系统

Split(分片)

HDFS 固定大小的block 为基本单位存储数据,而MapReduce 处理单位是split。split是一个逻辑概念,只包含元数据信息:数据起始位置、数据长度、数据所在节点等。它的划分方法完全由用户自己决定

Map任务的数量

Hadoop为每个split创建一个Map任务,split 的多少决定了Map任务的数目。大多数情况下,理想的分片大小是一个HDFS块

Reduce任务的数量

最优的Reduce任务个数取决于集群中可用的reduce任务槽(slot)的数目;通常设置比Reduce任务槽数目稍微小一些的Reduce任务个数(这样可以预留一些系统资源处理可能发生的错误)

3、★Shuffle过程(MapReduce 的核心环节——Shuffle过程)

(1)Map端

  • 输入数据和执行Map任务
  • Map任务的输出结果写入缓存
  • 溢写:每个Map任务分配的缓存大小默认是100M,缓存快满时(溢写比例0.8)启动溢写操作,将缓存中的数据一次性写入磁盘,并清空缓存。
  • 文件归并:每次溢写都会生成一个新的磁盘文件,随着Map任务的执行,会生成多个溢写文件,Map任务结束前,这些溢写文件被归并成一个大的磁盘文件
  • 可选:文件合并(Combine),将相同键的值加起来
  • 通知相应的Reduce任务来“领取”属于自己处理的数据

 

(2)Reduce端

  • 通过RPC向JobTracker询问Map任务是否已经完成,若完成,则“领取”数据,写入缓存
  • 溢写(分区、排序和合并)
  • 领取的数据先放入缓存来自不同Map机器,先归并,再合并,写入磁盘
  • 多个溢写文件归并成一个或多个大文件,文件中的键值对是排序
  • 当数据很少时,不需要溢写到磁盘,直接在缓存中归并
  • 输出给Reduce

1、下列关于 MapReduce 模型的描述,错误的是哪一项?

A、 MapReduce 采用" 分而治之"策略

B、 MapReduce 设计的一个理念就是" 计算向数据靠拢"

C、 MapReduce 框架采用了 Master/Slave 架构

D、 MapReduce 应用程序只用 Java 来写

2、MapReduce 的体系结构在,JobTracker 是主要任务是什么?

A、 负责资源监控和作业调度,监控所有 TaskTracker 与 Job 的健康状况

B、 使用"slot"等量划分本节点上的资源量(CPU、内存等)

C、 会周期性地通过"心跳"将本节点上资源的使用情况和任务的运行进度汇报给 TaskTracker

D、 会跟踪任务的执行进度、资源使用量等信息,并将这些信息告诉任务(Task)

3、下列关于 MapReduce 工作流程,哪个描述是正确的?

A、 所有的数据交换都是通过 MapReduce 框架自身去实现的

B、 不同的 Map 任务之间会进行通信

C、 不同的 Reduce 任务之间可以发生信息交换

D、 用户可以显式地从一台机器向另一台机器发送消息

 4、下列关于 MapReduce 的说法,哪个描述是错误的?

A、 MapReduce 具有广泛的应用,比如关系代数运算、分组与聚合运算等

B、 MapReduce 将复杂的、运行于大规模集群上的并行计算过程高度地抽象到 了两个函数

C、 编程人员在不会分布式并行编程的情况下,也可以很容易将自己的程序运 行在分布式系统上,完成海量数据集的计算

D、 不同的 Map 任务之间可以进行通信

5、下列关于 Map 和 Reduce 函数的描述,哪个是错误的?

A、Map 将小数据集进一步解析成一批<key,value>对,输入 Map 函数中进行处理

B、Map 每一个输入的<k 1 ,v 1 >会输出一批<k 2 ,v 2 >。<k 2 ,v 2 >是计算的中间结果

C、Reduce 输入的中间结果<k 2 ,List(v 2 )>中的 List(v 2 )表示是一批属于不同一个 k 2 的 value

D、Reduce输入的中间结果<k 2 ,List(v 2 )>中的List(v 2 )表示是一批属于同一个k2的 value

6、下面哪一项不是 MapReduce 体系结构主要部分?

A、Client    B、JobTracker    C、TaskTracker 以及 Task    D、Job

7、关于 MapReduce 的体系结构的描述,下列说法错误的是?

A、 用户可通过 Client 提供的一些接口查看作业运行状态

B、 用户编写的 MapReduce 程序通过 Client 提交到 JobTracker 端

C、 JobTracker 负责资源监控和作业调度

D、 JobTracker 会跟踪任务的执行进度、资源使用量等信息,并将这些信息告诉任务调度器(TaskScheduler)

8、关于 MapReduce 的体系结构的描述,下列说法错误的是?

A、Task分为Map Task和Reduce Task两种,分别由JobTracker和TaskTracker启动

B、 slot 分为 Map slot 和 Reduce slot 两种,分别供 MapTask 和 Reduce Task 使用

C、 TaskTracker 使用"slot"等量划分本节点上的资源量(CPU、内存等)

D、 TaskTracker 会周期性接收 JobTracker 发送过来的命令并执行相应的操 作(如启动新任务、杀死任务等)

9、下列说法有误的是?

A、 Hadoop MapReduce 是 MapReduce 的开源实现,后者比前者使用门槛低很多

B、 MapReduce 非共享式,容错性好

C、 MapReduce 批处理、实时、数据疏散型

D、 MapReduce 采用" 分而治之"策略

10、MapReduce 相较于传统的并行计算框架有什么优势?

A、 非共享式,容错性好

B、 普通 PC 机,便宜,扩展性好

C、 what,简单

D、 批处理、非实时、数据密集型

11、MapReduce 体系结构主要由以下那几部分构成?

A、 Client   B、 JobTracker   C、 TaskTracker    D、 Task

12、下列关于 MapReduce 的体系结构的描述,说法正确的有?

A、 用户编写的 MapReduce 程序通过 Client 提交到 JobTracker 端

B、 JobTracker 负责资源监控和作业调度

C、 TaskTracker 监控所有 TaskTracker 与 Job 的健康状况

D、 TaskTracker 使用"slot"等量划分本节点上的资源量(CPU、内存等)

 13、MapReduce 的作业主要包括什么?

A、 从磁盘或从网络读取数据,即 IO 密集工作

B、 计算数据,即 CPU 密集工作

C、 针对不同的工作节点选择合适硬件类型

D、 负责协调集群中的数据存储

14、对于 MapReduce 而言,其处理单位是 split。split 是一个逻辑概念, 它包含哪些元数据信息?

A、 数据起始位置

B、 数据长度

C、 数据所在节点

D、 数据大小

15、下列关于 Map 端的 Shuffle 的描述,哪些是正确的?

A、 MapReduce 默认 1000MB 缓存

B、 多个溢写文件归并成一个或多个大文件,文件中的键值对是排序的

C、 当数据很少时,不需要溢写到磁盘,直接在缓存中归并,然后输出给 Reduce

D、 每个 Map 任务分配多个缓存,使得任务运行更有效率 

16、MapReduce 的具体应用包括哪些?

A、 关系代数运算(选择、投影、并、交、差、连接)

B、 分组与聚合运算

C、 矩阵-向量乘法

D、 矩阵乘法

17、MapReduce 执行的全过程包括以下哪几个主要阶段?

A、 从分布式文件系统读入数据

B、 执行 Map 任务输出中间结果

C、 通过 Shuffle 阶段把中间结果分区排序整理后发送给 Reduce 任务

D、 执行 Reduce 任务得到最终结果并写入分布式文件系统

18、下列关于分布式并行编程的描述,哪些是正确的?

A、 "摩尔定律", CPU 性能大约每隔 18 个月翻一番

B、 分布式程序运行在大规模计算机集群上

C、 谷歌公司最先提出了分布式并行编程模型 MapReduce

D、 MapReduce 是 Hadoop 的开源实现

19、下列说法正确的是?

A、 MapReduce 体系结构主要由四个部分组成,分别是:Client、 JobTracker、TaskTracker 以及 Task

B、 Task 分为 Map Task 和 Reduce Task 两种,均由 TaskTracker 启动

C、 在 MapReduce 工作流程中,所有的数据交换都是通过 MapReduce 框架自身去实现的

D、 在 MapReduce 工作流程中,用户不能显式地从一台机器向另一台机器发送消息

7.3实例分析:WordCount

Map过程示意图:

 1、用户没有定义Combiner时的Reduce过程示意图

 2、用户有定义Combiner时的Reduce过程示意图

 (4)试画出使用MapReduce来对以下文档进行词频统计的过程(包括用户定义Combiner函数和没有定义Combiner函数两种情况)。文档内容如下:

8.3新一代资源管理调度框架YARN

1、★MapReduce1.0的缺陷(资源管理效率低)

  • 存在单点故障问题,只有一个JobTracker,一旦发生故障就需要停机维护
  • JobTracker“大包大揽”导致任务过重(三大功能:资源管理、任务调度、任务监控)
  • 容易出现内存溢出(TaskTracker分配资源只考虑MapReduce任务数,不考虑CPU、内存)
  • 资源划分不合理(强制划分为slot ,包括Map slot和Reduce slot)

2、YARN设计思路:将JobTracker三大功能拆分

ResourceManager包含调度器(Scheduler)和应用程序管理器(Applications Manager),主要负责:

  • 处理客户端请求
  • 启动/监控ApplicationMaster
  • 监控NodeManager
  • 资源分配和调度

ApplicationMaster

  • 为应用程序申请资源,分配给内部任务
  • 任务调度、监控与容错

NodeManager

  • 单个节点上的资源管理
  • 处理来自ResourceManger和ApplicationManager的命令

3、YARN的工作流程

  • 用户编写客户端应用端程序并向YARN提交,提交的内容包括ApplicationMaster程序、启动ApplicationMaster的命令、用户程序等
  • ResourceManager负责接受用户的请求,为应用程序分配一个容器,并与该容器的NodeManager通信,在该容器中启动一个ApplicationMaster
  • ApplicationMaster创建后向ResourceManager注册
  • ApplicationMaster采用轮询的方式向ResourceManager申请资源
  • ResourceManager以“容器”形式为ApplicationMaster分配资源
  • ApplicationMaster收到资源后,立即与NodeManager通信要求其启动任务
  • 任务启动后,ApplicationMaster还会与NodeManager保持交互通信进行应用程序的运行、监控和停止;此外,ApplicationMaster还会定时向ResourceManager发送“心跳”消息,报告资源的使用情况和应用的进度信息(即各个任务向ApplicationMaster汇报自己的状态和进度
  • 应用程序运行完成后,ApplicationMaster向ResourceManager的应用程序管理器注销并关闭自己。

4、★YARN相比于MapReduce1.0的优势

  • 大大减少了承担中心服务功能的ResourceManager的资源消耗(ResourceManager 只需要负责资源管理,需要消耗大量资源的任务调度和监控重启工作则交由ApplicationMaster 来完成;多个作业对应多个ApplicationMaster,实现了监控分布化
  • MapReduce1.0既是一个计算框架,又是一个资源管理调度框架,但是它只能支持MapReduce 编程模型。而YARN是一个纯粹的资源调度管理框架,在它上面可以运行包括MapReduce 在内的不同类型的计算框架,默认类型是 MapReduce。(因为 YARN 中的ApplicationMaster 是可变更的,针对不同的计算框架,用户可以采用任何编程语言自己编写服务于该计算框架的 ApplicationMaster。)
  • YARN中的资源管理比MapReduce1.0更加高效。(以容器为单位,而不是以slot(槽)为单位,避免了MapReduce1.0中slot的闲置浪费情况,大大提高了资源的利用率)

5、YARN的发展目标是实现“一个集群多个框架”,为什么?

  • 一个企业当中同时存在各种不同的业务应用场景,需要采用不同的计算框架
  • MapReduce实现离线批处理
  • 使用Impala实现实时交互式查询分析
  • 使用Storm实现流式数据实时分析
  • 使用Spark实现迭代计算
  • 这些产品通常来自不同的开发团队,具有各自的资源调度管理机制
  • 为了避免不同类型应用之间互相干扰,企业就需要把内部的服务器拆分成多个集群,分别安装运行不同的计算框架,即“一个框架一个集群”
  • 导致集群资源利用率低、数据无法共享、维护代价高等若干问题
  • YARN的目标就是实现“一个集群多个框架”,即在一个集群上部署一个统一的资源调度管理框架YARN,在YARN之上可以部署其他各种计算框架
  • 由YARN为这些计算框架提供统一的资源调度管理服务,并且能够根据各种计算框架的负载需求,调整各自占用的资源,实现集群资源共享和资源弹性收缩
  • 可以实现一个集群上的不同应用负载混搭,有效提高了集群的利用率
  • 不同计算框架可以共享底层存储,避免了数据集跨集群移动

2、下列哪个不属于 YARN 体系结构中 ResourceManager 的功能?

A、 处理客户端请求

B、 监控 NodeManager

C、 资源分配与调度

D、 处理来自 ApplicationMaster 的命令

3、下列哪个不属于 YARN 体系结构中 ApplicationMaster 的功能?

A、 任务调度、监控与容错

B、 为应用程序申请资源

C、 将申请的资源分配给内部任务

D、 处理来自 ResourceManger 的命令

4、YARN 体系结构主要包括哪三部分?

A、 ResourceManager

B、 NodeManager

C、 ApplicationMaster

D、 DataManager

5、在 YARN 体系结构中,ApplicationMaster 主要功能包括哪些?

A、 当用户作业提交时,ApplicationMaster 与 ResourceManager 协商获取资源,ResourceManager 会以容器的形式为 ApplicationMaster 分配资源

B、 把获得的资源进一步分配给内部的各个任务(Map 任务或 Reduce 任务), 实现资源的"二次分配"

C、 定时向 ResourceManager 发送"心跳"消息,报告资源的使用情况和应用的进度信息

D、 向 ResourceManager 汇报作业的资源使用情况和每个容器的运行状态 

6、YARN 的目标就是实现"一个集群多个框架",为什么?

A、 一个企业当中同时存在各种不同的业务应用场景,需要采用不同的计算框 架

B、 为了避免不同类型应用之间互相干扰,企业就需要把内部的服务器拆分成 多个集群,分别安装运行不同的计算框架,即"一个框架一个集群"

C、 这些产品通常来自不同的开发团队,具有各自的资源调度管理机制

D、 解决单点故障

9.5.4Impala与Hive的比较

不同点:

  • Hive适合长时间的批处理查询分析,Impala适合实时交互式SQL查询
  • 当采用MapReduce作为执行引擎时,Hive依赖于MapReduce计算框架,执行计划组合成管道型的MapReduce任务模式进行执行,Impala把执行计划表现为一棵完整的执行计划树,可以更自然地分发执行计划到各个Impalad执行查询。
  • Hive在执行过程中,如果内存放不下所有数据,则会使用外存;而Impala在遇到内存放不下数据时,不会利用外存,所以Impala目前处理查询时会受到一定的限制。使得Impala更适合处理输出数据较小的查询请求,而对于大数据量的批量处理,Hive依然是更好的选择。

相同点:

  • Hive与Impala使用相同的存储数据池,都支持把数据存储于HDFS和HBase中
  • Hive与Impala使用相同的元数据
  • Hive与Impala中对SQL的解释处理比较相似,都是通过词法分析生成执行计划

1、下列有关Hive和Impala的对比错误的是:

A.  Hive与Impala中对SQL的解释处理比较相似,都是通过词法分析生成执行计划

B.  Hive与Impala使用相同的元数据

C.  Hive适合于长时间的批处理查询分析,而Impala适合于实时交互式SQL查询

D.  Hive在内存不足以存储所有数据时,会使用外存,而Impala也是如此

2、下列关于Hive基本操作命令的解释错误的是:

A.  create table if not exists usr(id bigint,name string,age int);//如果usr表不存在,创建表usr,含三个属性id,name,age

B.  load data local inpath ‘/usr/local/data’ overwrite into table usr; //把目录’/usr/local/data’下的数据文件中的数据以追加的方式装载进usr表

C.  create database userdb;//创建数据库userdb

D.  insert overwrite table student select * from user where age>10; //向表usr1中插入来自usr表的age大于10的数据并覆盖student表中原有数据

3、下列说法正确的是:

A.  Impala和Hive、HDFS、HBase等工具可以统一部署在一个Hadoop平台上

B.  数据仓库Hive不需要借助于HDFS就可以完成数据的存储

C.  Hive本身不存储和处理数据,依赖HDFS存储数据,依赖MapReduce处理数据

D.  HiveQL语法与传统的SQL语法很相似

4、Impala主要由哪几个部分组成:

A.  Hive   B.  Impalad  C.  State Store  D.  CLI

5、以下属于Hive的基本数据类型是:

A.  BINARY  B.  STRING   C.  FLOAT   D.  TINYINT

10.1 Spark概述

1、简介

  • Spark最初由美国加州伯克利大学(UCBerkeley)的AMP实验室于2009年开发,是基于内存计算的大数据并行计算框架,可用于构建大型的、低延迟的数据分析应用程序
  • 2013年Spark加入Apache孵化器项目后发展迅猛,如今已成为Apache软件基金会最重要的三大分布式计算系统开源项目之一(Hadoop、Spark、Storm)
  • Spark在2014年打破了Hadoop保持的基准排序纪录(Spark/206个节点/23分钟/100TB数据,Hadoop/2000个节点/72分钟/100TB数据;Spark用十分之一的计算资源,获得了比Hadoop3倍的速度)

2、Spark特点

  • 运行速度快:使用DAG执行引擎以支持循环数据流与内存计算
  • 容易使用支持多种编程语言(Scala、Java、Python和R语言),也可以使用Spark Shell交互式编程
  • 通用性:Spark提供了完整而强大的技术栈,包括SQL查询、流式计算、机器学习和图算法组件
  • 运行模式多样:可运行于独立的集群模式中,可运行于Hadoop中,也可以运行于云环境,并且可以访问HDFS、Cassandra、HBase、Hive等多种数据源

3、Scala简介

  • Scala是一门现代的多范式编程语言,运行于Java平台(JVM,Java 虚拟机),并兼容现有的Java程序
  • Scala是Spark的主要编程语言,但Spark还支持Java、Python、R作为编程语言
  • Scala的优势是提供了REPL(Read-Eval-Print Loop,交互式解释器),提高程序开发效率

Scala特性:

  • 具备强大的并发性(同一时间执行多个任务),支持函数式编程,可以更好地支持分布式系统
  • 语法简洁,能提供优雅的API
  • 兼容Java,运行速度快,且能融合到Hadoop生态圈中

4、★与Hadoop MapReduce对比,Spark为什么更优秀?

(1)Hadoop存在如下一些缺点:

  • 表达能力有限
  • 磁盘IO(写入 读出)开销大
  • 延迟高(任务之间的衔接均涉及IO开销,必须等前一个任务执行完才能执行,难以胜任复杂、多阶段的计算任务)

(2)Spark优点

  • Spark的计算模式也属于MapReduce,但不局限于Map和Reduce操作,还提供了多种数据集操作类型,编程模型比Hadoop MapReduce更灵活
  • 提供了内存计算(内存的读写速度比磁盘快得多),可将中间结果放到内存中,对于迭代运算效率更高
  • 基于DAG的任务调度执行机制,要优于Hadoop MapReduce的迭代执行机制(非常耗资源;Spark将数据载入内存后,之后的迭代计算都可以直接使用内存中的中间结果作运算,避免了从磁盘中频繁读取数据)

1、下列哪项是 Hadoop 生态系统中 Spark 的功能?

A、 处理大规模数据的脚本语言

B、 工作流和协作服务引擎,协调 Hadoop 上运行的不同任务

C、 支持 DAG 作业的计算框架

D、 基于内存的分布式并行编程框架,具有较高的实时性,并且较好支持迭代计算

2、下面关于 Spark 的说法,错误的是哪一项?

A、 使用 DAG 执行引擎以支持循环数据流与内存计算

B、 可运行于独立的集群模式中,可运行于 Hadoop 中,也可运行于 Amazon EC2 等云环境中

C、 支持使用 Scala、Java、Python 和 R 语言进行编程,但是不可以通过 Spark Shell 进行交互式编程

D、 Spark 提供了内存计算,可将中间结果放到内存中,对于迭代计算效率更 高

3、下列关于 Scala 特性的描述,错误的是哪一项?

A、 Scala 语法复杂,但是能提供优雅的 API 计算

B、 Scala 具备强大的并发性,支持函数式编程,可以更好地支持分布式系统

C、 Scala 兼容 Java,运行速度快,且能融合到 Hadoop 生态圈中

D、 Scala 是 Spark 的主要编程语言 

4、下列说法哪项有误?

A、 相对于 Spark 来说,使用 Hadoop 进行迭代计算非常耗资源

B、 Spark 将数据载入内存后,之后的迭代计算都可以直接使用内存中的中间 结果作运算,避免了从磁盘中频繁读取数据

C、 Hadoop 的设计遵循"一个软件栈满足不同应用场景"的理念

D、 Spark 可以部署在资源管理器 YARN 之上,提供一站式的大数据解决方案 

145、在 Spark 生态系统组件的应用场景中,下列哪项说法是错误的?

A、 Spark 应用在复杂的批量数据处理

B、 Spark SQL 是基于历史数据的交互式查询

C、 Spark Streaming 是基于历史数据的数据挖掘

D、 GraphX 是图结构数据的处理

10.3 Spark运行架构

1、基本概念

  • RDD:是Resillient Distributed Dataset(弹性分布式数据集)的简称,是分布式内存的一个抽象概念,提供了一种高度受限的共享内存模型
  • DAG:是Directed Acyclic Graph(有向无环图)的简称,反映RDD之间的依赖关系
  • Executor:是运行在工作节点(WorkerNode)的一个进程,负责运行Task。
  • Application:用户编写的Spark应用程序
  • Task:运行在Executor上的工作单元
  • Job:一个Job包含多个RDD及作用于相应RDD上的各种操作
  • Stage:是Job的基本调度单位,一个Job会分为多组Task,每组Task被称为Stage,或者也被称为TaskSet,代表了一组关联的、相互之间没有Shuffle依赖关系的任务组成的任务集

2、Spark架构

  • Spark运行架构包括:
  • 集群资源管理器(Cluster Manager)
  • 运行作业任务的工作节点(Worker Node)
  • 每个应用的任务控制节点(Driver)
  • 每个工作节点上负责具体任务的执行进程(Executor)
  • 资源管理器可以自带或Mesos或YARN
  • 与Hadoop MapReduce计算框架相比,Spark所采用的Executor有两个优点:
  • 利用多线程来执行具体的任务,减少任务的启动开销;
  • Executor中有一个BlockManager存储模块,会将内存和磁盘共同作为存储设备,有效减少IO开销)
  • 一个应用(Application)由一个任务控制节点(Driver)和若干个作业(Job)构成,一个Job由多个Stage构成,一个Stage由多个没有Shuffle关系的Task组成
  • 当执行一个应用(Application)时,任务控制节点(Driver)会向集群管理器(Cluster Manager)申请资源,启动Executor,并向Executor发送应用程序代码和文件,然后在Executor上执行Task,运行结束后,执行结果会返回给任务控制节点(Driver),或者写到HDFS或者其他数据库中

3、Spark运行基本流程

  • 当一个 Spark 应用被提交时,首先需要为这个应用构建起基本的运行环境,即由任务按制节点( Driver)创建一个SparkContext,由 SparkContext负责和资源管理器-Cluster Manage的通信,以及进行资源的申请、任务的分配和监控等。SparkContext 会向资源管理器注册并申请运行 Executor 的资源。
  • 资源管理器为Executor分配资源,并启动Executor进程,Executor 运行情况将随着心跳”发送到资源管理器上。
  • SparkContext 根据 RDD 的依赖关系构建 DAG,并将 DAG 提交给 DAG 调度器(DAGScheduler)进行解析,将 DAG分解成多个“阶段(Stage)” (每个阶段都是一个任务集 ),并且计算出各个阶段之间的依赖关系,然后把一个个“任务集”提交给底层的任务调度器(TaskScheduler) 进行处理;Exccutor 向 SparkContxt 申请任务(Task),任务调度器(Task Scheduler)将任务(Task)分发给 Executor 运行,同时sparkConfext 将应用程序代码发放给 Exccutor。
  • 任务(Task)在 Executor 上运行,把执行结果反馈给任务调度器(TaskScheduler),然后反馈给 DAG 调度器(DAGScheduler),运行完毕后写入数据释放所有资源

4、Spark运行架构特点

  • 每个应用(Application)都有自己专属的Executor进程,并且该进程在应用(Application)运行期间一直驻留。Executor进程以多线程的方式运行任务(Task), 减少了多进程任务频繁的启动开销,使得任务执行变得非常高效和可靠。
  • Spark运行过程与资源管理器无关,只要能够获取Executor进程并保持通信即可
  • 任务(Task)采用了数据本地性和推测执行等优化机制。数据本地性尽量将计算移到数据所在的节点上进行,即“计算向数据靠拢”,因为移动计算比移动数据所占的网络资源要少得多。而且Spark采用了延时调度机制,更大程度上实现了执行过程优化

5、RDD运行原理

(1)设计背景:

  • 许多迭代式算法(比如机器学习、图算法等)和交互式数据挖掘工具,共同之处是,不同计算阶段之间会重用中间结果
  • 目前的MapReduce框架都是把中间结果写入到HDFS中,带来了大量的数据复制、磁盘IO和序列化开销
  • RDD就是为了满足这种需求而出现的,它提供了一个抽象的数据架构,我们不必担心底层数据的分布式特性,只需将具体的应用逻辑表达为一系列转换处理,不同RDD之间的转换操作形成依赖关系,可以实现管道化,避免中间数据存储和磁盘IO消耗

(2)RDD的概念

  • 一个RDD就是一个分布式对象集合,本质上是一个只读的分区记录集合,每个RDD可分成多个分区,每个分区就是一个数据集片段,并且一个RDD的不同分区可以被保存到集群中不同的节点上,从而可以在集群中的不同节点上进行并行计算
  • RDD提供了一种高度受限的共享内存模型,即RDD是只读的记录分区的集合,不能直接修改,只能基于稳定的物理存储中的数据集创建RDD,或者通过在其他RDD上执行确定的转换操作(如map、join和group by)而创建得到新的RDD
  • RDD提供了一组丰富的操作以支持常见的数据运算,分为动作”(Action)和“转换”(Transformation)两种类型;前者用于执行计算并指定输出的形式,后者指定RDD之间的依赖关系。两类操作的主要区别转换操作接受RDD并返回RDD动作操作接受RDD但是返回非RDD(输出一个值或结果)。
  • RDD提供的转换接口都非常简单,都是类似map、filter、groupBy、join等粗粒度的数据转换操作,而不是针对某个数据项的细粒度修改(因此,RDD 比较适合对于数据集中元素执行相同操作的批处理式应用,而不适用于需要异步、细粒度状态的应用,比如 Web 应用系统、地量式的网页爬虫等。)
  • 表面上RDD的功能很受限、不够强大,实际上RDD已经被实践证明可以高效地表达许多框架的编程模型(比如MapReduce、SQL、Pregel)
  • Spark用Scala语言实现了RDD的API,程序员可以通过调用API实现对RDD的各种操作

(3)RDD典型的执行过程如下:

  • RDD读入外部数据源进行创建
  • RDD经过一系列的转换(Transformation)操作,每一次都会产生不同的RDD,供给下一个转换操作使用
  • 最后一个RDD经过“动作”操作进行转换,并输出到外部数据源

需要说明的是,RDD采用了惰性调用,即在 RDD 的执行过程中(见图 10-7),真正的计算发生在RDD的“行动”操作,对于“行动”之前的所有“转换”操作,Spark 只是记录下“转换”操作应用的一些基础数据集以及 RDD 生成的轨迹,即相互之间的依赖关系,而不会触发真正的计算。

下面是RDD执行过程的一个实例:

上述这一系列处理称为一个“血缘关系”(Lincage),即 DAG 拓扑排序的结果。

优点:惰性调用、管道化、避免同步等待、不需要保存中间结果、每次操作变得简单

(4)RDD特性

Spark使用RDD后为什么能高效计算?

  • 高效的容错机制:不需要通过冗余复制来容错
  • 中间结果持久化到内存。数据在内存中的多个RDD操作之间进行传递,避免了不必要的读写磁盘开销
  • 存放的数据可以是Java对象,避免了不必要的对象序列化与反序列化

(5)RDD之间的依赖关系

RDD 中不同的操作,会使得不同 RDD 分区之间会产生不同的依赖关系。DAG 调度器根据RDD 之间的依赖关系,把 DAG 划分成若干个阶段。RDD 中的依赖关系分为窄依赖(NarrovDependency)与宽依赖( Wide Dependency),二者的主要区别在于是否包含 Shuffle 操作

  • Shuffle操作

Spark 中的一些操作会触发 Shuffle 过程,这个过程涉及数据的重新分发,因此,会产生大的磁盘IO和网络开销。

  • 窄依赖和宽依赖
    • 窄依赖表现为一个父RDD的分区对应于一个子RDD的分区,或多个父RDD的分区对应于一个子RDD的分区
    • 依赖则表现为存在一个父RDD的一个分区对应一个子RDD的多个分区

对输入进行协同划分,属于窄依赖;对输入做非协同划分,属于宽依赖。

Spark 的这种依赖关系设计,使其具有了天生的容错性,大大加快了 Spark 的执行速度。因为RDD 数据集通过“血缘关系”记住了它是如何从其他 RDD 中演变过来的,当这个 RDD 的部分分区数据丢失时,它可以通过血缘关系获取足够的信息来重新运算和恢复丢失的分区数据,由此带来了性能的提升。

窄依赖的失败恢复更为高效,它只需要根据父 RDD 分区重新计算丢失的分区即可(不需要重新计算所有分区),而且可以并行地在不同节点进行重新计算。而对于宽依赖而言,单个节点失效通常意味着重新计算过程会涉及多个父 RDD分区,开销较大。

此外,Spark 还提供了数据检查点和记录日志,用于持久化中间 RDD,从而使得在进行失败恢复时不需要追溯到最开始的阶段。在进行故障恢复时,Spark 会对数据检查点开销和重新计算 RDD 分区的开销进行比较,从而自动选择最优的恢复策略。

(6)阶段的划分

Spark根据DAG图中的RDD依赖关系,把一个作业分成多个阶段。对于宽依赖和窄依赖而言,窄依赖对于作业的优化很有利。只有窄依赖可以实现流水线优化宽依赖包含Shuffle过程,无法实现流水线方式处理。

Spark通过分析各个RDD的依赖关系生成了DAG,再通过分析各个RDD中的分区之间的依赖关系来决定如何划分Stage,具体划分方法是:

  • 在DAG中进行反向解析,遇到宽依赖就断开
  • 遇到窄依赖就把当前的RDD加入到Stage中
  • 将窄依赖尽量划分在同一个Stage中,可以实现流水线计算

由上述论述可知,把一个 DAG 划分成多个“阶段”以后,每个阶段都代表了一组关联的、相互之间没有 Shuffle 依赖关系的任务组成的任务集合。每个任务集合会被提交给任务调度器(TaskScheduler)进行处理,由任务调度器将任务分发给 Executor 运行。

(7)RDD运行过程

  • 创建RDD对象
  • SparkContext负责计算RDD之间的依赖关系,构建DAG
  • DAGScheduler负责把DAG图分解成多个阶段(Stage),每个阶段(Stage)中包含了多个任务(Task)每个任务(Task)会被任务调度器(TaskScheduler)分发给各个工作节点(WorkerNode)上的Executor去执行。

1、下列说法错误的是?

A、 RDD(Resillient Distributed Dataset)是运行在工作节点(WorkerNode)的一个进程,负责运行 Task

B、 Application 是用户编写的 Spark 应用程序

C、 一个 Job 包含多个 RDD 及作用于相应 RDD 上的各种操作

D、 Directed Acyclic Graph 反映 RDD 之间的依赖关系

 2、下列关于 RDD 说法,描述有误的是?

A、 一个 RDD 就是一个分布式对象集合,本质上是一个只读的分区记录集合

B、 每个 RDD 可分成多个分区,每个分区就是一个数据集片段

C、 RDD 是可以直接修改的

D、 RDD 提供了一种高度受限的共享内存模型

3、下列哪一项不属于 Spark 架构的优点?

A、 实现一键式安装和配置、线程级别的任务监控和告警

B、 降低硬件集群、软件维护、任务监控和应用开发的难度

C、 便于做成统一的硬件、计算平台资源池

D、 不用负载应用混搭,集群利用率高

4、Spark 生态系统组件 Spark Streaming 的应用场景是?

A、 基于历史数据的数据挖掘

B、 图结构数据的处理

C、 基于历史数据的交互式查询

D、 基于实时数据流的数据处理

5、Spark 生态系统组件 MLlib 的应用场景是?

A、 图结构数据的处理

B、 基于历史数据的交互式查询

C、 复杂的批量数据处理

D、 基于历史数据的数据挖掘

6、Spark 具有以下哪几个主要特点?

A、 运行速度快

B、 容易使用

C、 通用性

D、 运行模式单一

7、Scala 具有以下哪几个主要特点?

A、 Scala 的优势是提供了 REPL(Read-Eval-Print Loop,交互式解释器),提高程序开发效率

B、 Scala 兼容 Java,运行速度快,且能融合到 Hadoop 生态圈中

C、 Scala 具备强大的并发性,支持函数式编程

D、 Scala 可以更好地支持分布式系统 

8、下列哪些选项属于 Hadoop 的缺点?

A、 表达能力有限

B、 磁盘 IO 开销大

C、 延迟高

D、 在前一个任务执行完成之前,其他任务就无法开始,难以胜任复杂、多阶段的计算任务

9、下列说法中,哪些选项描述正确?

A、 Spark 在借鉴 Hadoop MapReduce 优点的同时,很好地解决了 MapReduce 所 面临的问题

B、 Spark 的计算模式也属于 MapReduce,但不局限于 Map 和 Reduce 操作

C、 Hadoop MapReduce 编程模型比 Spark 更灵活

D、 Hadoop MapReduce 提供了内存计算,可将中间结果放到内存中,对于迭代运算效率更高

10、在实际应用中,大数据处理主要包括以下哪三个类型?

A、 复杂的批量数据处理:通常时间跨度在数十分钟到数小时之间

B、 基于历史数据的交互式查询:通常时间跨度在数十秒到数分钟之间

C、 基于实时数据流的数据处理:通常时间跨度在数十秒到数分钟之间

D、 基于实时数据流的数据处理:通常时间跨度在数百毫秒到数秒之间

 11、在实际应用中,大数据处理难免会带来哪些问题?

A、 不同场景之间输入输出数据无法做到无缝共享,通常需要进行数据格式的 转换

B、 不同的软件需要不同的开发和维护团队

C、 需要较高的使用成本

D、 比较难以对同一个集群中的各个系统进行统一的资源协调和分配

12、与 Hadoop MapReduce 计算框架相比,Spark 所采用的 Executor 具有哪些 优点?

A、 利用多线程来执行具体的任务,减少任务的启动开销

B、 Executor 中有一个 BlockManager 存储模块,有效减少 IO 开销

C、 提供了一种高度受限的共享内存模型(RDD)

D、 不同场景之间输入输出数据能做到无缝共享 

13、Spark 运行架构具有以下哪些特点?

A、 每个 Application 都有自己专属的 Executor 进程,并且该进程在 Application 运行期间一直驻留

B、 Executor 进程以多线程的方式运行 Task

C、 Spark 运行过程与资源管理器无关,只要能够获取 Executor 进程并保持通 信即可

D、 Task 采用了数据本地性和推测执行等优化机制

14、Spark 采用RDD 以后能够实现高效计算的原因主要在于?

A、 高效的容错机制

B、 中间结果持久化到内存,数据在内存中的多个

C、 存放的数据可以是 Java 对象,避免了不必要的对象序列化和反序列化

D、 现有容错机制:数据复制或者记录日志

15、Spark 支持三种不同类型的部署方式,包括?

A、 Standalone(类似于 MapReduce1.0,slot 为资源分配单位)

B、 Spark on Mesos(和 Spark 有血缘关系,更好支持 Mesos)

C、 Spark on YARN

D、 Spark on HDFS

12.4 Flink技术栈

Flink 核心组件栈分为三层:物理部署层Runtime 核心层API&Libraries

  • 物理部署层。Flink 的底层是物理部署层。Flink 可以采用 Local 模式运行,启动单个JVM.也可以采用 Standalone 集群模式运行,还可以采用YARN 集群模式运行,或者也可以运行在谷歌云服务(GCE )和亚马逊云服务(EC2) 上。
  • Runtime 核心层。该层主要负责对上层不同接口提供基础服务,也是 Flink 分布式计算框架的核心实现层。该层提供了两套核心的 API: 流处理(DataStream API) 和批处理(DataSet API)。
  • API&Libraries 。作为分布式数据库处理框架,Flink 提供了支撑流计算和批计算的按口,同时,在此基础上抽象出不同的应用类型的组件库,如基于流处理复杂时间处理库CEP、既可以基于流处理、又可以基于批处理的SQL&Table库、基于批处理的机器学习库FlinkML、基于批处理的图计算库Gelly等。

Flink核心组件栈:

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-18 07:56:06       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-18 07:56:06       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-18 07:56:06       58 阅读
  4. Python语言-面向对象

    2024-07-18 07:56:06       69 阅读

热门阅读

  1. DP学习——组合模式

    2024-07-18 07:56:06       19 阅读
  2. (三)js前端开发中设计模式之工厂模式

    2024-07-18 07:56:06       19 阅读
  3. torchvision.utils.make_grid详解

    2024-07-18 07:56:06       17 阅读
  4. HALCON语法

    2024-07-18 07:56:06       23 阅读
  5. cv2:Laplacian详解

    2024-07-18 07:56:06       22 阅读
  6. 自然语言处理NLP--LDA面试题

    2024-07-18 07:56:06       19 阅读