本文最后更新于 2024-06-20,文章内容可能已经过时。

1.概述

1.1 数据:

数据是对客观事物的观测(测量)或描述而得到的符号或数字集合

1.2 大数据:

特点:

  • 数据量大

  • 数据类型繁多

  • 处理速度快

  • 价值密度低

2.分布式文件系统:HDFS:

2.1 简介:

分布式文件系统把文件分布存储到多个计算机节点上,成千上万的计算机节点构成计算机集群。

与之前使用多个处理器和专用高级硬件的并行化处理装置不同的是,目前的分布式文件系统所采用的计算机集群,都是由普通硬件构成的,这就大大降低了硬件上的开销。

2.2 结构:

主从复制结构。

分布式文件系统在物理结构上是由计算机集群中的多个节点构成的,这些节点分为两类,一类叫“主节点”(Master Node)或者也被称为“名称结点”(NameNode),另一类叫“从节点”(Slave Node)或者也被称为“数据节点”(DataNode)

image-20240619165620909

2.3 命名空间:

HDFS的命名空间包含目录、文件和块

在HDFS1.0体系结构中,在整个HDFS集群中只有一个命名空间,并且只有唯一一个名称节点,该节点负责对这个命名空间进行管理。

HDFS使用的是传统的分级文件体系,因此,用户可以像使用普通文件系统一样,创建、删除目录和文件,在目录间转移文件,重命名文件等。

2.4 网络通信:

所有的HDFS通信协议都是构建在TCP/IP协议基础之上的。

客户端通过一个可配置的端口向名称节点主动发起TCP连接,并使用客户端协议与名称节点进行交互,名称节点和数据节点之间则使用数据节点协议进行交互。

2.5 存储原理:

2.5.1 冗余数据保存:

HDFS采用了多副本方式对数据进行冗余存储,通常一个数据块的多个副本会被分布

到不同的数据节点上。

2.5.2 数据存取策略:

2.5.2.1 存:

第一个副本:放置在上传文件的数据节点;如果是集群外提交,则随机

挑选一台磁盘不太满、CPU不太忙的节点

第二个副本:放置在与第一个副本不同的机架的节点上

第三个副本:与第一个副本相同机架的其他节点上

更多副本:随机节点

2.5.2.2 读:

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

取自己所属的机架ID。

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

2.5.3 数据错误与恢复:

HDFS具有较高的容错性,可以兼容廉价的硬件,它把硬件出错看作一种常态,而不

是异常。

2.5.3.1 命名节点出错:

名称节点保存了所有的元数据信息,其中,最核心的两大数据结构是FsImage和Editlog,如果这两个文件发生损坏,那么整个HDFS实例将失效。因此,HDFS设置了备份机制,把这些核心文件同步复制到备份服务器SecondaryNameNode上。当名称节点出错时,就可以根据备份服务器SecondaryNameNode中的FsImage和Editlog数据进行恢复。

2.5.3.2 数据节点出错:

每个数据节点会定期向名称节点发送“心跳”信息,向名称节点报告自己的状态。

当数据节点发生故障,或者网络发生断网时,名称节点就无法收到来自一些数据节点

的心跳信息,这时,这些数据节点就会被标记为“宕机”,节点上面的所有数据都会被

标记为“不可读”,名称节点不会再给它们发送任何I/O请求。

这时,有可能出现一种情形,即由于一些数据节点的不可用,会导致一些数据块的副本数量小于冗余因子,名称节点会定期检查这种情况,一旦发现某个数据块的副本数量小于冗余因子,就会启动数据冗余复制,为它生成新的副本。

HDFS和其它分布式文件系统的最大区别就是可以调整冗余数据的位置。

2.5.3.3 数据出错:

网络传输和磁盘错误等因素,都会造成数据错误。

在文件被创建时,客户端就会对每一个文件块进行信息摘录,并把这些信息写入到同一个路径的隐藏文件里面。

当客户端读取文件的时候,会先读取该信息文件,然后,利用该信息文件对每个读取的数据块进行校验,如果校验出错,客户端就会请求到另外一个数据节点读取该文件块,并且向名称节点报告这个文件块有错误,名称节点会定期检查并且重新复制这个块。

3.分布式数据库:HBase:

HBase是一个高可靠、高性能、面向列、可伸缩的分布式数据库,是谷歌BigTable的开源实现,主要用来存储非结构化和半结构化的松散数据。HBase的目标是处理非常庞大的表,可以通过水平扩展的方式,利用廉价计算机集群处理由超过10亿行数据和数百万列元素组成的数据表.

3.1 数据模型:

HBase是一个稀疏、多维度、排序的映射表,这张表的索引是行键、列族、列限定符和时间戳。

image-20240619170815757

HBase中需要根据行键、列族、列限定符和时间戳来确定一个单元格,因此,可以视为一个“四维坐标”,即[行键,列族,列限定符,时间戳]

3.2 功能组件:

HBase的实现包括三个主要的功能组件:

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

(2)一个Master主服务器

(3)许多个Region服务器

3.2.1 Master主服务器:

负责管理和维护HBase表的分区信息。

3.2.2 Region服务器:

负责存储和维护分配给自己的Region,并处理来自客户端的请求。

3.2.3 客户端:

客户端不与master通信,通过zookeeper获取region位置信息,然后去对应的region服务器上获取数据,这种设计使得master负载比较小。

3.3 Region:

可以理解为分表。

image-20240619171356518

3.3.1 定位:

image-20240619171526137

客户端访问数据时进行三级寻地址,首先访问zookeepr获取root表,然后获取meta表,最后获取用户表。

3.4 系统架构:

image-20240619171721985

Zookeeper可以帮助选举出一个Master作为集群的总管,并保证在任何时刻总有唯一一个Master在运行,这就避免了Master的“单点失效”问题。

4.MapReduce:

4.1 分布式并行编程:

分布式计算。

分布式程序运行在大规模计算机集群上,可以并行执行大规模数据处理任务,从而获得海量的计算能力。

image-20240619172105306

4.2 模型:

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

  1. Map函数

    • Map函数是MapReduce模型中的第一个阶段,它的作用是将输入数据集(通常是键值对的形式)映射成一系列中间键值对。

    • 每个输入项都会被传递给Map函数,Map函数会根据一定的逻辑处理这些数据,并输出一系列中间结果。

    • Map函数通常用于过滤、排序和聚合数据,可以看作是对数据进行初步处理的阶段。

  2. Reduce函数

    • Reduce函数是MapReduce模型中的第二个阶段,它的作用是对Map函数输出的所有中间结果进行归并处理。

    • Reduce函数接收Map函数输出的中间结果,按照中间结果的键进行分组,并对每一组的值进行汇总或合并操作。

    • Reduce函数通常用于合并数据,比如求和、计算平均值等,可以看作是对数据进行最终处理的阶段。

image-20240619172508803

4.3 架构:

主从架构。一个master节点,多个slave节点。

主要有四个组件组成:Client、JobTracker、TaskTracker以及Task。

image-20240619173014670

4.3.1 client:

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

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

4.3.2 JobTracker:

JobTracker负责资源监控和作业调度,部署在master节点上。

JobTracker 监控所有TaskTracker与Job的健康状况,一旦发现失败,就

将相应的任务转移到其他节点

JobTracker 会跟踪任务的执行进度、资源使用量等信息,并将这些信息

告诉任务调度器(TaskScheduler),而调度器会在资源出现空闲时,选

择合适的任务去使用这些资源。

4.3.3 TaskTracker:

部署在slave节点上。

TaskTracker 会周期性地通过“心跳”将本节点上资源的使用情况和任

务的运行进度汇报给JobTracker,同时接收JobTracker 发送过来的命令

并执行相应的操作(如启动新任务、杀死任务等)

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

一个Task 获取到一个slot 后才有机会运行,而Hadoop调度器的作用就是

将各个TaskTracker上的空闲slot分配给Task使用。slot 分为Map slot 和

Reduce slot 两种,分别供MapTask 和Reduce Task 使用。

4.3.4 Task:

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

4.4 工作流程:

image-20240619173210932

5.Hive:

Hive是一个构建于Hadoop顶层的数据仓库工具.

依赖分布式文件系统HDFS存储数据

依赖分布式并行计算模型MapReduce处理数据

5.1 系统架构:

image-20240619173522489

5.2 工作流程:

Hive本身不做具体的数据处理和存储,而是把自己定义的sql语句转换成相关的mapreduce作业。

image-20240620122559097

6.Impala:

Impala是一个新兴查询系统,可以通过sql语义查询存储在hadoop的hdfs和habse上的数据。

6.1 系统架构:

image-20240620122829307

7.Spark:

Spark是是基于内存计算的大数据并行计算框架,可用于构建大型的、低延迟的数据

分析应用程序。

7.1 特点:

•运行速度快:使用DAG执行引擎以支持循环数据流与内存计算

•容易使用:支持使用Scala、Java、Python和R语言进行编程,可以通过Spark Shell进行交互式编程

•通用性:Spark提供了完整而强大的技术栈,包括SQL查询、流式计算、机器学习和图算法组件

•运行模式多样:可运行于独立的集群模式中,可运行于Hadoop中,也可运行于Amazon EC2等云环境中,并且可以访问HDFS、Cassandra、HBase、Hive等多种数据源

7.2 Scala:

Scala是一门现代的多范式编程语言,运行于Java平台(JVM,Java 虚拟机),并兼容现有的Java程序。

Scala是Spark的主要编程语言,但Spark还支持Java、Python、R作为编程语言

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

7.3 与hadoop的区别:

  • Spark的计算模式也属于MapReduce,但不局限于Map和Reduce操作,还提供了多种数据集操作类型,编程模型比Hadoop MapReduce更灵活

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

  • Spark基于DAG的任务调度执行机制,要优于Hadoop MapReduce的迭代执行机制

image-20240620123231156

7.4 系统架构:

image-20240620123346945

7.5 工作流程:

image-20240620123511827

一个Application由一个Driver和若干个Job构成,一个Job由多个Stage构成,

一个Stage由多个没有Shuffle关系的Task组成

当执行一个Application时,Driver会向集群管理器申请资源,启动Executor,

并向Executor发送应用程序代码和文件,然后在Executor上执行Task,运行

结束后,执行结果会返回给Driver,或者写到HDFS或者其他数据库中。

7.6 RDD:

目前的MapReduce框架都是把中间结果写入到HDFS中,带来了大量的数据复制、磁盘IO和序列化开销

RDD就是为了满足这种需求而出现的,它提供了一个抽象的数据架构,我们不必担心底层数据的分布式特性,只需将具体的应用逻辑表达为一系列转换处理,不同RDD之间的转换操作形成依赖关系,可以实现管道化,避免中间数据存储.

7.6.1 概念:

一个RDD就是一个分布式对象集合,本质上是一个只读的分区记录集合,每个RDD可分成多个分区,每个分区就是一个数据集片段,并且一个RDD的不同分区可以被保存到集群中不同的节点上,从而可以在集群中的不同节点上进行并行计算

7.6.2运行原理:

image-20240620125159299

7.7 Spark Sql:

Spark SQL在Hive兼容层面仅依赖HiveQL解析、Hive元数据,也就是说,从HQL被解析成抽象语法树(AST)起,就全部由Spark SQL接管了。Spark SQL执行计划生成和优化都由Catalyst(函数式关系查询优化框架)负责。

image-20240620125334842

8.Flink:

分布式大数据处理引擎.

Flink实现了Google Dataflow流计算模型,是一种兼具高吞吐、低延迟和高性能的实时流计算框架,并且同时支持批处理和流处理。此外,Flink支持高度容错的状态管理,防止状态在计算过程中因为系统异常而出现丢失。因此,Flink就成为了能够满足流处理架构要求的理想的流计算框架。

8.1 处理架构:

8.1.1 传统架构:

传统数据处理架构的一个显著特点就是采用一个中心化的数据库系统,用于存储事务性数据。

image-20240620125518949

8.1.2 大数据Lambda架构:

大数据Lambda架构主要包含两层,即批处理层和实时处理层,在批处理层中,采用MapReduce、Spark等技术进行批量数据处理,而在实时处理层中,则采用Storm、Spark Streaming等技术进行数据的实时处理。

image-20240620125631228

复杂度过高,而且运维成本比较高。

8.1.3 流处理架构:

image-20240620125759114

为了高效地实现流处理架构,一般需要设置消息传输层和流处理层。

消息传输层从各种数据源采集连续事件产生的数据,并传输给订阅了这些数据的应用程序;流处理层会持续地将数据在应用程序和系统间移动,聚合并处理事件,并在本地维持应用程序的状态。

流处理架构的核心是使各种应用程序互连在一起的消息队列,消息队列连接应用程序,并作为新的共享数据源,这些消息队列取代了从前的大型集中式数据库。

77e83daf892786dd421b8d598544f364

8.2 应用场景:

8.2.1 事件驱动型应用:

事件驱动型应用是一类具有状态的应用,它从一个或多个事件数据流中读取事件,并根据到来的事件做出反应,包括触发计算、状态更新或其他外部动作等。事件驱动型应用是在传统的应用设计基础上进化而来的。

典型的事件驱动型应用包括反欺诈、异常检测、基于规则的报警、业务流程监控、Web 应用(社交网络)等。

8.2.2 数据分析应用:

分析作业会从原始数据中提取信息,并得到富有洞见的观察。传统的数据分析通常先对事件进行记录,然后在这个有界的数据集上执行批量查询。为了把最新的数据融入到查询结果中,就必须把这些最新的数据添加到被分析的数据集中,然后重新运行查询。查询的结果会被写入到一个存储系统中,或者形成报表。

8.2.3 数据流水线应用:

Extract-transform-load(ETL)是一个在存储系统之间转换和移动数据的常见方法。通常而言,ETL作业会被周期性地触发,从而把事务型数据库系统中的数据复制到一个分析型数据库或数据仓库中。

8.3 系统架构:

8.3.1 组件:

image-20240620130353589

8.3.2 架构:

主从架构。

image-20240620130436962

8.3.3 编程模型:

image-20240620130513212

9.数据理解:

在统计学中称为exploratory data analysis(EDA)

借助人类对数据的观察和“模式”识别能力,对数据进行初步研究,以便更好地理解它的特性,有助于选择合适的数据预处理和数据分析、挖掘技术。

9.1 主要方法:

image-20240620130650270

9.2 基于统计数据的数据理解方法:

9.2.1 集中趋势度量:

image-20240620130818826

9.2.2 散布程度度量:

image-20240620130901521

10.综合应用:

电影推荐系统可根据用户的喜好,向用户推荐可能感兴趣的电影。

系统设计:

image-20240620131102837