终极核心大数据技术之认识spark

本文介绍了ApacheSpark,一个多语言引擎,用于执行数据工程、数据科学和机器学习任务,强调了其快速、通用、易用的特点,以及与Hadoop生态系统的兼容性和Spark的容错机制、缓存、checkpoint和广播变量等功能。
摘要由CSDN通过智能技术生成

1.什么是spark

Apache Spark™ is a multi-language engine for executing data engineering, data science, and machine learning on single-node machines or clusters.(Apache Spark™ 是一种多语言引擎,用于在单节点机器或集群上执行数据工程、数据科学和机器学习。)

Spark是一种快速、通用、可扩展的大数据分析引擎,2009年诞生于加州大学伯克利分校AMPLab,2010年开源,2013年6月成为Apache孵化项目,2014年2月成为Apache顶级项目。目前,Spark生态系统已经发展成为一个包含多个子项目的集合,其中包含SparkSQL、SparkStreaming、GraphX、MLlib等子项目,Spark是基于内存计算的大数据并行计算框架。Spark基于内存计算,提高了在大数据环境下数据处理的实时性,同时保证了高容错性和高可伸缩性,允许用户将Spark部署在大量廉价硬件之上,形成集群。Spark得到了众多大数据公司的支持,这些公司包括Hortonworks、IBM、Intel、Cloudera、MapR、Pivotal、百度、阿里、腾讯、京东、携程、优酷土豆。当前百度的Spark已应用于凤巢、大搜索、直达号、百度大数据等业务;阿里利用GraphX构建了大规模的图计算和图挖掘系统,实现了很多生产系统的推荐算法;腾讯Spark集群达到8000台的规模,是当前已知的世界上最大的Spark集群。

2.spark作用

中间结果输出:基于MapReduce的计算引擎通常会将中间结果输出到磁盘上,进行存储和容错。出于任务管道承接的,考虑,当一些查询翻译到MapReduce任务时,往往会产生多个Stage,而这些串联的Stage又依赖于底层文件系统(如HDFS)来存储每一个Stage的输出结果。

Spark是MapReduce的替代方案,而且兼容HDFS、Hive,可融入Hadoop的生态系统,以弥补MapReduce的不足。

3.spark特点

快速、通用、易用、随处运行以及代码简洁。

以及还有很强的兼容性(Spark可以非常方便地与其他的开源产品进行融合。比如,Spark可以使用Hadoop的YARN和Apache Mesos作为它的资源管理和调度器,器,并且可以处理所有Hadoop支持的数据,包括HDFS、HBase和Cassandra等。这对于已经部署Hadoop集群的用户特别重要,因为不需要做任何数据迁移就可以使用Spark的强大处理能力。Spark也可以不依赖于第三方的资源管理和调度器,它实现了Standalone作为其内置的资源管理和调度框架,这样进一步降低了Spark的使用门槛,使得所有人都可以非常容易地部署和使用Spark。此外,Spark还提供了在EC2上部署Standalone的Spark集群的工具。)

四、Spark和Hadoop
有些人说Spark的出现代表着Hadoop的死亡,这个观点我是不认同的。Hadoop是一个分布式的系统生态,不是靠着Spark这个引擎可以替代的。

但不得不承认,Spark的出现对于Hadoop来说,确实极大程度上弥补了一些短板,对Hadoop造成了一些影响。而Hadoop的生态,包括资源调度和文件存储的部分,对于Spark这个纯引擎来说,也是很有帮助的。

具体来说,Spark帮助Hadoop实现了用户友好。一个将Spark和Hadoop结合起来使用的人,和一个只使用Hadoop生态内工具的人,感受将会是截然不同的。

第一,使用Spark的时候,不再需要考虑怎么样把各种日常的操作硬塞到map和reduce这两个操作中间去。因为Spark提供了抽象程度更高的接口。

第二,使用Spark的时候,不用再为一个查询而等到油尽灯枯。建立在RDD和内存存储中间数据上的Spark,对实时性的支持很高。

在这里简单讲一下RDD。RDD是一个抽象的概念,一个逻辑上的数据结构,中文全称是弹性分布式数据集,最直接的理解就是一个大的dataframe——这个dataframe可能是所有机器上原始数据的总和,也可能是中间计算到某一步得到的一个中间结果形成的dataframe。

spark结构框架

一、Spark Core
实现了 Spark 的基本功能,包含RDD、任务调度、内存管理、错误恢复、与存储系统交互等模块。
数据结构:RDD
二、Spark SQL
Spark 用来操作结构化数据的程序包。通过 Spark SQL,我们可以使用 SQL操作数据。
数据结构:Dataset/DataFrame = RDD + Schema
三、Spark Streaming
Spark 提供的对实时数据进行流式计算的组件。提供了用来操作数据流的 API。
数据结构:DStream = Seq[RDD],DStream离散化流
四、Spark GraphX
Spark中用于图计算的API,性能良好,拥有丰富的功能和运算符,能在海量数据上自如地运行复杂的图算法。
数据结构:RDD或者DataFrame
五、Spark MLlib
提供常见的机器学习(ML)功能的程序库。包括分类、回归、聚类、协同过滤等,还提供了模型评估、数据导入等额外的支持功能。
数据结构:RDD或者DataFrame。

spark部署模式

1、local
​ spark 任务在本地运行,local[k] 就代表启动 k 个线程来运行,local[*] 就代表启动全部线程来运行。

2、standalone
​ 独立地运行在一个集群上。

3、yarn
​ 运行在资源管理系统上,如 yarn 和 mesos。

运行,local[*] 就代表启动全部线程来运行。

2、standalone
​ 独立地运行在一个集群上。

3、yarn
​ 运行在资源管理系统上,如 yarn 和 mesos。

常用术语:

Application: Appliction都是指用户编写的Spark应用程序,其中包括一个Driver功能的代码和分布在集群中多个节点上运行的Executor代码

Driver:  Spark中的Driver即运行上述Application的main函数并创建SparkContext,创建SparkContext的目的是为了准备Spark应用程序的运行环境,在Spark中有SparkContext负责与ClusterManager通信,进行资源申请、任务的分配和监控等,当Executor部分运行完毕后,Driver同时负责将SparkContext关闭,通常用SparkContext代表Driver

Executor:  某个Application运行在worker节点上的一个进程,  该进程负责运行某些Task, 并且负责将数据存到内存或磁盘上,每个Application都有各自独立的一批Executor, 在Spark on Yarn模式下,其进程名称为CoarseGrainedExecutor Backend。一个CoarseGrainedExecutor Backend有且仅有一个Executor对象, 负责将Task包装成taskRunner,并从线程池中抽取一个空闲线程运行Task, 这个每一个oarseGrainedExecutor Backend能并行运行Task的数量取决与分配给它的cpu个数

Cluter Manager:指的是在集群上获取资源的外部服务。目前有三种类型

Standalon : spark原生的资源管理,由Master负责资源的分配

Apache Mesos:与hadoop MR兼容性良好的一种资源调度框架

Hadoop Yarn: 主要是指Yarn中的ResourceManager

Worker: 集群中任何可以运行Application代码的节点,在Standalone模式中指的是通过slave文件配置的Worker节点,在Spark on Yarn模式下就是NoteManager节点

Task: 被送到某个Executor上的工作单元,但hadoopMR中的MapTask和ReduceTask概念一样,是运行Application的基本单位,多个Task组成一个Stage,而Task的调度和管理等是由TaskScheduler负责

Job: 包含多个Task组成的并行计算,往往由Spark Action触发生成, 一个Application中往往会产生多个Job

Stage: 每个Job会被拆分成多组Task, 作为一个TaskSet, 其名称为Stage,Stage的划分和调度是有DAGScheduler来负责的,Stage有非最终的Stage(Shuffle Map Stage)和最终的Stage(Result Stage)两种,Stage的边界就是发生shuffle的地方

DAGScheduler: 根据Job构建基于Stage的DAG(Directed Acyclic Graph有向无环图),并提交Stage给TASkScheduler。 其划分Stage的依据是RDD之间的依赖的关系找出开销最小的调度方法,如下图

TASKSedulter: 将TaskSET提交给worker运行,每个Executor运行什么Task就是在此处分配的. TaskScheduler维护所有TaskSet,当Executor向Driver发生心跳时,TaskScheduler会根据资源剩余情况分配相应的Task。另外TaskScheduler还维护着所有Task的运行标签,重试失败的Task。下图展示了TaskScheduler的作用

RDD的定义

RDD(Resilient Distributed Dataset)叫做弹性 分布式 数据集,是Spark中最基本的数据抽象,
代表一个不可变类型、可分区、里面的元素可并行计算的集合。可以认为RDD是分布式的"列表List或数组Array"(与其说是列表不如说是元组【其本身是不可变类型,只能通过血缘追踪】

RDD 五大特性
第一个:A list of partitions
每个RDD都由一系列的分区构成**
对于RDD来说,每个分片都会被一个计算任务处理,分片数决定并行度;
用户可以在创建RDD时指定RDD的分片个数,如果没有指定,那么就会采用默认值.

第二个:A function for computing each split
RDD的计算操作,是对RDD每个分区的计算**
Spark中RDD的计算是以分片为单位的,计数函数会被作用到每个分区上.

第三个:A list of dependencies on other RDDs
一个RDD会依赖于其他多个RDD
RDD的每次转换都会生成一个新的RDD,所以RDD之间就会形成类似于流水线一样的前后依赖关系。在部分分区数据丢失时,Spark可以通过这个依赖关系重新计算丢失的分区数据,而不是对RDD的所有分区进行重新计算(Spark的容错机制).

第四个:Optionally, a Partitioner for key-value RDDs (e.g. to say that the RDD is hash-partitioned)
可选的,如果是二元组【KV】类型的RDD,在Shuffle过程中可以自定义分区器
当前Spark中实现了两种类型的分区函数,一个是基于哈希的HashPartitioner,另外一个是基于范围的RangePartitioner;
只有对于于key-value的RDD,才会有Partitioner,非key-va lue的RDD的Parititioner的值是None;
Partitioner函数不但决定了RDD本身的分片数量,也决定了parent RDD Shuffle输出时的分片数量。

第五个:Optionally, a list of preferred locations to compute each split on (e.g. block locations for an HDFS file)
可选的,Spark程序运行时,Task的分配可以指定实现最优路径解:最优计算位置
对于一个HDFS文件来说,这个列表保存的就是每个Partition所在的块的位置。
按照"移动数据不如移动计算"的理念,Spark在进行任务调度的时候,会尽可能选择那些存有数据的worker节点来进行任务计算。(数据本地性)

RDD的分区
分区是一个偏物理层的概念,也是 RDD 并行计算的核心。数在 RDD 内部被切分为多个子集合,每个子集合可以被认为是一个分区,运算逻辑最小会被应用在每一个分区上,每个分区是由一个单独的任务(task)来运行的,所以分区数越多,整个应用的并行度也会越高。子RDD的分区数 = 父RDD的分区数

RDD分区的设置

  1. RDD分区的原则是使得分区的个数尽量等于集群中的CPU核心(core)数目,这样可以充分利用CPU的计算资源;
  2. 在实际中为了更加充分的压榨CPU的计算资源,会把并行度设置为cpu核数的2~3倍;

 RDD 算子分类

RDD模式的lazy模式

代码只定义不执行,不触发job。自然也就不构建Task,不产生RDD的数据。等待真正使用到对应RDD的数据返回给用户时,才会触发了job运行,执行所有RDD的构建和转换。

Tranformation算子:转换算子

  • 功能:用于实现对RDD的数据进行转换
  • 特点:都是lazy模式的,"一般"不会触发job的运行,算子返回值一定是RDD

Action算子:触发算子 行动算子

  • 功能:触发job的运行,用户对RDD的数据进行输出或者保存
  • 特点:一定会触发job的运行,返回值一定不是RDD
  • Spark容错机制
    3.1 RDD 容错机制(persist缓存)
    实际开发中某些RDD的计算或转换可能会比较耗费时间(RDD来之不易,并且使用不止一次),或某些RDD会频繁使用,那么可以将这些RDD进行持久化/缓存,来提高性能。缓存必须要通过触发算子触发,才能生效,如果缓存的RDD丢失了,那么只能通过血脉重新构建缓存。

  • cache:将RDD缓存在内存中

  • persist:将RDD【包含这个RDD的依赖关系】进行缓存,可以自己指定缓存的级别【和cache区别】

  • unpersist: 将缓存的RDD进行释放

  •  checkpoint检查点机制
    RDD 数据可以持久化,但是持久化/缓存可以把数据放在内存中,虽然是快速的,但是也是最不可靠的;也可以把数据放在磁盘上,也不是完全可靠的!例如磁盘会损坏等。
    Checkpoint的产生就是为了更加可靠的数据持久化,在Checkpoint的时候一般把数据放在在 HDFS上,这就天然的借助了HDFS天生的高容错、高可靠来实现数据最大程度上的安全,实现了RDD的容错和高可用。
    对RDD做checkpoint,可以切断对RDD的依赖关系,将RDD数据保存到可靠存储(如HDFS)以便数据恢复;

  • Spark共享变量

  • 广播变量

    广播变量: 将一个变量元素进行广播到每台Worker节点的Executor中,让每个Task直接从本地读取数据,减少网络传输IO,提高性能。如大小表join时,可以将小表进行广播。广播变量是一个只读变量,不能修改

  • Accumulators累加器

    Accumulators累加器: 实现分布式的计算,在每个Task内部构建一个副本进行累加,并且返回每个Task的结果最后进行合并。累加器必须由触发算子触发才会生效。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值