本复习提纲主要参考北京大学计算机学院研究生课程《网络大数据管理与应用》课程资料以及厦门大学计算机科学系研究生课程 《大数据技术基础》相关材料整理而成,供广大网友学习参考,如有版权问题请联系作者删除:guanmeige001@pku.edu.cn

Part1 Hadoop

Hadoop简介

Hadoop的功能和作用:

高效地存储,管理,分析海量数据 Hadoop采用分布式存储方式, 提高了读写速度,并扩大了存储容量,通过冗余存储保证了安全性。MapReduce可以高效地分析和处理数据。 为什么不用关系型数据库加上更多磁盘来做大规模批量分析?

B树适合更新小部分数据,在更新大部分数据库数据的时候,B 树的效率没有 MapReduce 的效率高,因为它需要使用排序/合并来重建数据库。 MapReduce适合批处理,关系型数据库适合交互型访问和批处理 关系型数据是结构化的,MapReduce可以处理非结构化或半结构化数据 Hadoop的优点:

高容错性、高可靠性:通过冗余存储,维护多个数据副本,确保能处理节点崩溃的情况 高效性:通过并行处理加快数据处理速度 高可扩展性:在可用的计算机集群之内分配数据并完成计算任务,可以在节点之间动态迁移数据,集群大小可伸缩 低成本:依赖于廉价服务器 Linux平台,支持多种编程语言 缺点(GPT):

不适合交互式查询和实时数据处理 延迟高,不适合对延迟要求高的场景 冗余存储占用额外空间

Hadoop的结构

最底层是HDFS,存储Hadoop所有存储节点上的文件 上一层是MapReduce计算引擎(包括JobTrackers和TaskTrackers) 再上层是Pig,Hive等各种应用

Part2 HDFS

HDFS的优缺点

硬件出错:能快速恢复 流数据读写:假设程序是批量处理数据的,要求程序使用流读取来提高数据吞吐量。重视吞吐量而非响应速度 大数据集:文件通常是GB/TB级别 简单的文件模型:假设文件只有一次写入和多次读取。(适合搜索引擎) 强大的跨平台兼容性(基于Java实现,只要是JDK支持的平台都可兼容)

相应的问题:

满足不了低延迟 无法高效存储大量小文件(NameNode压力会增加) 不支持多用户写入同一个文件,以及在任意位置修改文件(只能进行追加操作)

基本概念

块:与文件系统的块(几百~几千byte)相比更大,默认为64MB,是文件存储和处理的逻辑单元 NameNode目录节点:维护和管理文件名,保存数据块和DataNode的的映射关系,通常由性能较好的机器负责 DataNode数据节点:存储数据块

默认副本数为3;一个文件存储的份数称为冗余因子,可以在文件创建时指定,之后再改 客户端向某个节点的写入 和 节点向其他节点的数据备份是pipeline进行的 DataNode定时向NameNode发送心跳表明存活,并发送数据块列表(包括了节点上所有数据块编号)

文件复制功能,除了提高容错性,还提高了服务的伸缩性scalability(多个client同时请求同一个文件时可以从多个副本处读取)

Part3 MapReduce

一个job会把数据切分成若干数据块,由map task并行地处理它们 框架包含1个JobTracker和一堆TaskTracker, JobTracker负责创建和提交任务

计算流程

Map阶段

输入: 输出:一个或多个

相同key的输出会被分发到同一个reducer map的输出系统会先自动排序,然后发给reducer Reduce阶段

输入: 输出: Combine阶段:可以将map的结果先进行一次合并

类似提前做一次reduce操作 Combine的输出是reduce的输入,一定得保证正确性(通常用于reduce的输入输出类型相同的场景,例如求max, sum等等) Partition&Shuffle阶段

Shuffle指把map的输出移动到reducer的过程 Partitioner负责决定Map阶段产生的 pair发送到哪个Reducer,默认情况下用key的hash值来分配

伪代码

Wordcount

word count (baseline):

class MAPPER

 method MAP(docid a, doc d)

   for all str word in d do

emit (word, 1)

class REDUCER

 method REDUCE(str word, counts[c1, c2, ...])

sum ← 0

   for all count in counts do

sum ← sum + c

   emit (word, sum)

word count (in-mapper combine):

比combiner更高效,因为combiner的执行次数是不一定的 主要是在初始化mapper的时候弄一个关联数组,

class MAPPER

 method INIT()

H ← new ASSOCIATIVEARRAY

 method MAP(docid a, doc d)

   for all str word in d do

H[t] ← H[t] + 1

method CLOSE

 for all str t in H.keys() do

   emit (t, H[t])

class REDUCER

 method REDUCE(str word, counts[c1, c2, ...])

sum ← 0

   for all count in counts do

sum ← sum + c

   emit (word, sum)

Shuffle实现细节

Mapper端

mapper端有一个memory buffer, 每次buffer达到一定阈值(如80%)时先排序,然后向磁盘溢写(spill),最终在disk上形成很多个段。 在发送给reducer之前,要对相同key的段进行merge,这里如果有combiner也可以先combine Reducer端

不断从各个map task拉取最终结果,对来自不同的mapper的结果做合并, 首先请求map task所在的TaskTracker获取map task的输出文件

新框架Yarn

即新版本Mapreduce采取的MapreduceV2架构 将JobTracker两个主要功能分离为单独的组件:资源管理+任务调度/监控 原框架中核心的 JobTracker 和 TaskTracker 不见了,取而代之的是 ResourceManager、ApplicationMaster 与 NodeManager 三个部分

container类似于机器的概念 ResourceManager:

ResourceManager中心化地进行job和资源的调度——一部分JobTracker功能 负责接收 JobSubmitter 提交的作业,调度、启动每一个 Job 所属的 ApplicationMaster,并且监控 ApplicationMaster 的存在情况。 NodeManager:负责Container状态的维护,并向ResourceManager发送心跳。 ApplicationMaster:

负责监控task的运行情况——另一部分JobTracker功能 负责一个 Job 生命周期内的所有工作,每一个 Job都有一个 ApplicationMaster, 它可以运行在 ResourceManager 以外的机器上。用户可以自己配置

Part4 Spark

Spark简介

开源的分布式并行计算系统 支持迭代算法、交互式数据分析 思想:内存集群计算 实现:scala语言

Spark与Mapreduce对比

Mapreduce每次读写都需要序列化到磁盘,一个复杂任务需要几十次磁盘读写;Spark只需要一次磁盘读写,大部分处理在内存中进行 Spark的优势:

部分场景下性能比Mapreduce快很多

小数据集:可以达到亚秒级延迟 大数据集:迭代类应用快10~100x 提供比Hadoop更高层的API,算法实现代码量低(1/10或1/100) 比Hadoop更通用,有map和reduce之外的更多操作(transformations、actions两大类操作);节点之间的通信模型不像hadoop只有shuffle一种模式;可以控制中间结果的存储和分区等 兼容Hadoop存储API,支持读写所有hadoop支持的系统,如HDFS, Hbase等 容错性:checkpoint机制 可用性:scala, java, python API

基本概念

RDD: 弹性分布式数据集(Resilient Distributed Dataset),是分布式内存的一个抽象概念,提供一种高度受限的共享内存模型 DAG: 有向无环图, 反映RDD之间的依赖关系 Executor: 运行在工作节点上的一个进程,负责运行task task:运行在executor上的工作单元 Job: 包含多个RDD以及对他们的各种操作 Stage: 作业的基本调度单位,一个job分为多个stage, 一个stage包括一组task,互相之间有一定关联且没有shuffle依赖关系

运行架构

集群资源管理器cluster manager: master节点,指在集群上获取资源的外部服务,有以下几种

standalone:spark原生的资源管理,由master负责资源管理 Yarn:由yarn中的resource manager负责资源管理 Mesos: 由Mesos的Mesos Master负责资源管理 负责给executor分配资源并启动executor进程

工作节点worker node:worker节点,每个节点包含一个executor用于执行任务

standalone中指的是worker spark on yarn模式中指的就是NodeManager Executor(执行进程):负责运行task并将数据存在内存或磁盘上,每个application都有一批自己的executor.

任务控制节点driver: 运行application的main()函数并给任务创建一个SparkContext

DAGscheduler:运行在driver节点上,sparkContext根据RDD的依赖关系构建DAG图,DAG图交给DAGScheduler形成stage划分,并提交给taskScheduler taskScheduler: 把任务分发给worker节点执行

RDD

RDD的特点:在集群节点上不可变的、已分区的数据对象,是可序列化的(可以溢写到磁盘),是静态类型的 RDD是Spark的最基本抽象 只能从持久化存储或通过transformations操作产生,相比于分布式共享内存(DSM)可以更高效地实现容错性,不一定要使用checkpoint,丢失的分区可以通过lineage计算出来 RDD的不变性使得它可以实现类似Mapreduce的推测式执行

当某个机器运行很慢的时候,可以在另一台机器上并行地重新执行该任务,取先执行完的结果 RDD分区的特点可以通过数据的本地性来提高性能

与分布式共享内存(DSM)的区别:

DSM需要通过checkpoint来恢复,RDD可以通过lineage来计算丢失的分区 RDD是批量处理,最细粒度是哈希或范围分区,不能像DSM一样精确地读写某个内存位置 RDD有两种类型的操作,transformations和actions

transformations: map, filter, groupby, join。并不马上执行,直到遇到actions再真正执行 Actions: count, collect, save actions返回某个结果或把结果写到存储系统中,是触发spark计算的动因 lineage:DAG拓扑排序的结果 spark不适用的场景:

无法支持细粒度、异步更新的操作 比如图计算 还有需要细粒度的日志更新和数据checkpoint的应用

容错机制

总结:基于lineage,也可以指定checkpoint

宽依赖和窄依赖

窄依赖:父亲RDD的分区只会对应子RDD的一个分区,没有shuffle操作 宽依赖:父亲RDD的分区对应子RDD的多个分区,涉及shuffle操作 如果有宽依赖:重新计算某个子RDD的某分区时,其父RDD对应到子RDD其他分区的部分也会被重新计算,造成了冗余的计算;此外一个子RDD通常对应多个父RDD,这就意味着其他父RDD也得重新计算 如果是窄依赖,就直接pipeline地计算所有父分区就行了,不用shuffle,效率很高 通常把尽量多的窄依赖划分到同一个stage里

Part5 HBase

HBase简介

HBase=Hadoop Database 高可靠,高性能,面向列,可伸缩的分布式存储系统 表通常非常大,可以很稀疏(空的列不占据存储空间)

与传统关系型数据库对比

数据类型:HBase只有字符串类型,关系数据库有多种类型 数据操作:HBase操作简单,只有插入、查询、删除、清空操作;表和表之间没什么关系,不需要实现表的连接等操作;关系型数据库有函数、连接操作 存储模式:HBase基于列存储;关系数据库基于表格结构和行模式存储 数据维护:HBase更新数据时是插入新版本而不删除旧版本,关系数据库是替换修改 可伸缩性:HBase可以轻易地增减硬件数量(主要是为了处理硬件错误的情况),容错性高;关系型数据库需要增加中间层才能实现类似的功能

HBase更适合海量存储和互联网应用的需求(互联网应用是以字符为基础的)

以下内容来自GPT3.5:

NoSQL(Not Only SQL)数据库是一类非关系型的数据库管理系统,它们采用了不同于传统关系型数据库的数据存储模型。NoSQL 数据库的出现主要是为了解决传统关系型数据库难以应对大规模、高并发、分布式环境下的数据存储和处理需求。

NoSQL 数据库通常具有以下特点:

灵活的数据模型:与固定的表结构相比,NoSQL 数据库通常采用灵活的数据模型,如文档型、键值对、列族、图形等,能够更好地适应不同类型和格式的数据。横向扩展性:NoSQL 数据库设计时考虑了横向扩展的可能性,可以方便地增加节点来处理更大规模的数据和更高的并发请求。高性能:针对特定的使用场景进行了优化,能够提供较高的读写性能和低延迟。分布式架构:NoSQL 数据库天生支持分布式架构,能够在多个节点上分布存储和处理数据。

NoSQL 数据库种类繁多,包括文档型数据库(如 MongoDB)、键值对数据库(如 Redis)、列存储数据库(如 HBase)、图形数据库(如 Neo4j)等。每种类型的 NoSQL 数据库都有自己的特点和适用场景。

总的来说,NoSQL 数据库旨在通过提供更灵活、高性能、可伸缩的数据存储和处理解决方案,满足当前互联网时代大规模数据应用的需求。它们在大数据、实时分析、高并发访问等方面有着广泛的应用。

HBase数据模型

Hbase的写操作是锁行的,可以按行加锁,每一行有一个时间戳

几个重要概念

行键

Hbase表的主键,表中的记录根据行键排序 可以通过单个行键/行键区间范围/全表扫描访问行 列族

每个列都属于某个列族 列族是表的结构的一部分,必须在使用表之前定义;列名可以自己定义 时间戳

通过行和列确定的一个存储单元称为cell,每个cell都有同一数据的多个版本,

概念视图

物理视图

按列存储,空白区域不存,请求会返回null

不同列族的数据会存储在不同文件中;同一列族的数据在一个文件内,按行键从小到大排序,同一行的数据按列键排序

HBase的实现

HRegion

每个表由一个或多个HRegion组成 每个HRegion包含了一段key区间内的很多行,内部也按照行键的字典序排列 一开始每个表只有一个HRegion,随着表的增大,HRegion会自动分裂成多个HRegion HRegion是分布式存储的最小单元,但不是物理存储的最小单元,HRegion由多个HStore组成,每个HStore又包含一个memStore和零至多个StoreFile

HRegion的定位

Zookeeper file-ROOT-META-table Zookeeper file记录了ROOT表的位置信息,ROOT表(只有一个root region)记录了meta表的region信息,meta表记录了用户表的HRegion信息 中间需要多次网络操作,client表会进行缓存 

server分为两种,master server和region server,主从式结构 zookeeper是一个cluster,会跟每个region server保持心跳联系,master server定时向zookeeper轮询状态

大数据管理系统

(以下由GPT4生成)

这张图展示的是一个典型的大数据管理系统架构,主要基于Apache Hadoop生态系统。这样的系统设计通常涉及以下几个关键组件和它们之间的交互:

数据存储:HDFS(Hadoop分布式文件系统)是基础,用于存储大量数据。它具备高容错性、高可靠性,并且能够存储和处理大量分散的数据。 数据处理:MapReduce是一个编程模型,用于处理和生成大数据集。它能够在分布式环境中并行处理大量数据。 数据访问:Hive和Pig提供数据仓库功能,允许用户使用类SQL语言(HiveQL)和脚本语言(Pig Latin)进行复杂的数据分析和处理。 实时/随机访问:HBase是建立在HDFS之上的非关系型分布式数据库,它支持实时的数据访问。 数据集成:Sqoop是用于在关系型数据库和Hadoop之间传输数据的工具,而HCatalog允许用户使用统一的表格视图访问位于不同数据处理工具中的数据。 协调服务:ZooKeeper是一个为分布式应用提供一致性服务的软件,它用于维护配置信息、命名、提供分布式同步以及提供组服务。 管理监控:Ambari是用于监控和管理Hadoop集群的工具,提供了集群的安装、配置和维护功能。

从设计思路上看,这种架构的目的是为了处理大规模数据集,并提供高效的存储、快速处理、灵活的数据访问以及方便的管理监控功能。一个成功的大数据管理系统应该能够确保扩展性、高性能、容错性和数据一致性。

这样的设计也是模块化的,允许在不同的层面进行优化和定制,以满足特定的业务需求。例如,对于需要快速读写访问的应用场景,可以选择使用HBase。而对于需要复杂数据分析的场景,可以选择使用Hive。

整体上,设计大数据管理系统时,需要考虑数据的来源、大小、处理速度和使用方式,以及系统的可维护性、扩展性和安全性。

推荐链接

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。