大数据框架之Spark详解

1 Spark概述

1.1 Spark是什么?

Spark是一种基于内存的快速、通用、可扩展的大数据分析引擎。

1.2 Spark内置模块

在这里插入图片描述
Spark Core:实现了 Spark 的基本功能,包含任务调度、内存管理、错误恢复、与存储
系统交互等模块。Spark Core 中还包含了对弹性分布式数据集(Resilient Distributed
DataSet,简称 RDD)的 API 定义。

Spark SQL: 是 Spark 用来操作结构化数据的程序包。通过 Spark SQL,我们可以使用
SQL 或者 Apache Hive 版本的 SQL 方言(HQL)来查询数据。Spark SQL 支持多种数据源,
比如 Hive 表、Parquet 以及 JSON 等。

Spark Streaming: 是 Spark 提供的对实时数据进行流式计算的组件。提供了用来操作数
据流的 API,并且与 Spark Core 中的 RDD API 高度对应。

Spark MLlib: 提供常见的机器学习(ML)功能的程序库。包括分类、回归、聚类、协同
过滤等,还提供了模型评估、数据 导入等额外的支持功能。

集群管理器: Spark 设计为可以高效地在一个计算节点到数千个计算节点之间伸缩计
算。为了实现这样的要求,同时获得最大灵活性,Spark 支持在各种集群管理器(Cluster
Manager)上运行,包括 Hadoop YARN、Apache Mesos,以及 Spark 自带的一个简易调度
器,叫作独立调度器。

Spark 得到了众多大数据公司的支持,这些公司包括 Hortonworks、IBM、Intel、
Cloudera、MapR、Pivotal、百度、阿里、腾讯、京东、携程、优酷土豆。当前百度的
Spark 已应用于大搜索、直达号、百度大数据等业务;阿里利用 GraphX 构建了大规模的图
计算和图挖掘系统,实现了很多生产系统的推荐算法;腾讯 Spark 集群达到 8000 台的规
模,是当前已知的世界上最大的 Spark 集群。

1.3 Spark 特点

**1)快:**与Hadoop的MapReduce相比,Spark基于内存的运算要快100倍以上,基于硬盘的运算也要快10倍以
上。Spark实现了高效的DAG执行引擎,可以通过基于内存来高效处理数据流。计算的中间结果是存在于内存中
的。
2)易用: Spark支持Java、Python和Scala的API,还支持超过80种高级算法,使用户可以快速构建不同的应
用。而且Spark支持交互式的Python和Scala的Shell,可以非常方便地在这些Shell中使用Spark集群来验证解决问
题的方法。
3)通用: Spark提供了统一的解决方案。Spark可以用于批处理、交互式查询(Spark SQL)、实时流处理
(Spark Streaming)、机器学习(Spark MLlib)和图计算(GraphX)。这些不同类型的处理都可以在同一个应
用中无缝使用。减少了开发和维护的人力成本和部署平台的物力成本。
4)兼容性: Spark可以非常方便地与其他的开源产品进行融合。比如,Spark可以使用Hadoop的YARN和
Apache Mesos作为它的资源管理和调度器,并且可以处理所有Hadoop支持的数据,包括HDFS、HBase等。这对
于已经部署Hadoop集群的用户特别重要,因为不需要做任何数据迁移就可以使用Spark的强大处理能力。

2 RDD概述

2.1 什么是RDD?

RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是 Spark 中最基本的数据抽象。代码中是一个抽象类,它代表一个弹性的、不可变、可分区、里面的元素可并行计算的集合。

2.2 RDD的属性

在这里插入图片描述
(1)一组分区(Partition),即数据集的基本组成单位;
(2)一个计算每个分区的函数;
(3)RDD 之间的依赖关系;
(4)一个 Partitioner,即 RDD 的分片函数;
(5)一个列表,存储存取每个 Partition 的优先位置(preferred location)。

2.3 RDD特点

RDD 表示只读的分区的数据集,对 RDD 进行改动,只能通过 RDD 的转换操作,由一个 RDD 得到一个新的 RDD,新的 RDD 包含了从其他 RDD 衍生所必需的信息。RDDs 之间存在依赖,RDD 的执行是按照血缘关系延时计算的。如果血缘关系较长,可以通过持久化RDD 来切断血缘关系。

2.4 弹性体现在哪?

  • 存储的弹性:内存与磁盘的自动切换;
  • 容错的弹性:数据丢失可以自动恢复;
  • 计算的弹性:计算出错重试机制;
  • 分片的弹性:可根据需要重新分片。

2.5 分区

RDD 逻辑上是分区的,每个分区的数据是抽象存在的,计算的时候会通过一个 compute函数得到每个分区的数据。如果 RDD 是通过已有的文件系统构建,则 compute 函数是读取指定文件系统中的数据,如果 RDD 是通过其他 RDD 转换而来,则 compute 函数是执行转换逻辑将其他 RDD 的数据进行转换。

2.6 分区

RDD 是只读的,要想改变 RDD 中的数据,只能在现有的 RDD 基础上创
建新的 RDD。

由一个 RDD 转换到另一个 RDD,可以通过丰富的操作算子实现,不再像 MapReduce那样只能写 map 和 reduce 了。

RDD 的操作算子包括两类,一类叫做 transformations,它是用来将 RDD 进行转化,构建 RDD 的血缘关系;另一类叫做 actions,它是用来触发 RDD 的计算,得到 RDD 的相关计算结果或者将 RDD 保存的文件系统中。下图是 RDD 所支持的操作算子列表。

2.7 依赖

RDDs 通过操作算子进行转换,转换得到的新 RDD 包含了从其他 RDDs 衍生所必需的信息,RDDs 之间维护着这种血缘关系,也称之为依赖。如下图所示,依赖包括两种,一种是窄依赖,RDDs 之间分区是一一对应的,另一种是宽依赖,下游 RDD 的每个分区与上游RDD(也称之为父 RDD)的每个分区都有关,是多对多的关系。
在这里插入图片描述

2.8 缓存

如果在应用程序中多次使用同一个 RDD,可以将该 RDD 缓存起来,该 RDD 只有在第一次计算的时候会根据血缘关系得到分区的数据,在后续其他地方用到该 RDD 的时候,会直接从缓存处取而不用再根据血缘关系计算,这样就加速后期的重用。如下图所示,RDD- 1 经过一系列的转换后得到 RDD-n 并保存到 hdfs,RDD-1 在这一过程中有个中间结果,如果将其缓存到内存,那么在随后的 RDD-1 转换到 RDD-m 这一过程中,就不会计算其之前的 RDD-0 了。
在这里插入图片描述

2.9 CheckPoint

虽然 RDD 的血缘关系天然地可以实现容错,当 RDD 的某个分区数据失败或丢失,可以通过血缘关系重建。但是对于长时间迭代型应用来说,随着迭代的进行,RDDs 之间的血缘关系会越来越长,一旦在后续迭代过程中出错,则需要通过非常长的血缘关系去重建,势必影响性能。为此,RDD 支持 checkpoint 将数据保存到持久化的存储中,这样就可以切断之前的血缘关系,因为 checkpoint后的RDD 不需要知道它的父RDDs 了,它可以从 checkpoint处拿到数据。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值