大数据之Spark

本文详细介绍了大数据处理框架Spark的基础知识,包括SparkCore、Spark SQL和Spark Streaming的使用。同时,探讨了Spark与其他大数据组件如Kafka、Storm的集成,并深入到Scala编程语言、RPC机制以及JVM的原理,为读者提供全面的Spark技术解析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、Spark

(一)Spark基础知识

1、Spark的产生背景

 1. MapReduce的发展 
 
   1.1、MRv1的缺陷 
   
   (1)MRv1包括: 
    运行时环境(JobTracker和TaskTracker) 
    编程模型(MapReduce) 
    数据处理引擎(MapTask和ReduceTask) 
   (2)不足:
    可扩展性差:JobTracker既负责资源调度又负责任务调度
    可用性差:采用单节点Master,容易产生单点故障
    资源利用率低
    不能支持多种MapReduce框架
    
   1.2、MRv2的缺陷 
   
   (1)运行时环境被重构:
   	JobTracker拆分为:
   	资源调度平台(ResourceManager)、
   	节点管理器(NodeManager)
   	负责各个计算框架的任务调度模型(ApplicationMaster)
   (2)不足:
   	由于对HDFS的频繁操作(包括计算结果持久化、数据备份、资源下载及Shuffle等)
   	导致磁盘I/O成为系统性能的瓶颈,因此只适用于离线数据处理或批处理,而不能支持
   	对迭代式、交互式、流式数据的处理。
   	
   1.3、Spark的产生
   
   (1)减少磁盘I/O:Spark允许将map端的中间输出和结果存储在内存中,reduce端
   在拉取中间结果是避免了大量的磁盘I/O。Spark将应用程序上传的资源文件缓冲到Driver
   本地文件服务的内存中,当Executor执行任务时直接从Driver的内存中读取,也节省
   了大量的磁盘I/O。
   (2)增加并行度:Spark把不同的环节抽象为Stage,允许多个Stage既可以串行执行,
   又可以并行执行。
   (3)避免重新计算:当Spark中的某个分区的task执行失败后,会重新对此stage调度,
   但在调度的时候会过滤掉已经执行成功的分区任务,所以不会造成重复计算和资源浪费。
   (4)可选的Shuffle和排序:Hadoop MapReduce在Shuffle之前有着固定的排序
   操作(只能对key进行字典排序),Spark可以根据不同的场景选择在map端排序或者
   reduce端排序。
   (5)灵活的内存管理策略:Spark将内存分为堆上的存储内存、堆外的存储内存、堆上
   堆上的执行内存、堆外的执行内存。
   
2、Spark特点

 1. 快速高效
 2. 简洁易用
 3. 全栈式数据处理
   3.1、支持批处理(SparkCore)
   3.2、支持交互式查询(SparkSQL)
   3.3、支持流式计算(SparkStreaming)
   3.4、 支持机器学习(Spark MLlib)
   3.5、 支持图计算(Spark GraghX)
   3.6、 支持Python操作(PySpark)
   3.7、支持R语言(SparkR)
 4. 兼容
   4.1、可用性高
   4.2、丰富的数据源支持
   
3、Spark应用场景

 1. 复杂的批量处理(SparkCore)
 2. 基于历史数据的交互式查询(SparkSQL)
 3. 基于实时数据流的数据处理(SparkStreaming)

(二)SparkCore

1、Spark核心概念

 1.Application
 	表示应用程序,包含一个Driver Program和若干Executor
 2.Driver Program
 	Spark中的Driver,即运行上述Application的main()函数并且创建SparkContext,其中
 创建SparkContext的目的是为了准备Spark应用程序的运行环境。由SparkContext负责与
 Cluster Manager 通信,进行资源的申请,任务的分配和监控等。程序执行完毕后关闭
 SparkContext。
 3.ClusterManager
 	在standalone模式中即为Master(主节点),控制这个集群,监控Worker。在YARN模式
 中为资源管理器。
 4.SparkContext
 	整个应用的上下文,控制应用程序的生命周期,负责调度各个运算资源,协调各个Worker
 上的Executor。初始化的时候,会初始化DAGScheduler和TaskScheduler两个核心组件。
 5.RDD
 	Spark的基本计算单元,一组RDD可形成执行的有向无环图RDD Gragh。
 6.DAGScheduler
 	根据Job构建基于Stage的DAG,并提交Stage给TaskScheduler,其划分Stage的依据是
 RDD之间的依赖关系:宽依赖,也叫Shuffle依赖。
 7.TaskScheduler
 	将Taskset提交给Worker(集群)运行,每个Executor运行什么Task就是在此处分配的。
 8.Worker
 	集群中可以运行Application代码的节点。在Standalone模式中指的是通过slave文件配置的
 worker节点,在Spark on YARN模式中指的就是NodeManager节点。
 9.Executor
 	某个Application运行在Worker节点上的一个进程,该进程负责运行某些task,并且把数据
 存在内存或者磁盘上。
 10.Stage
 	每个Job会被拆成很多组Task,每组作为一个TaskSet,其名称为Stage。
 11.Job
 	包含多个Task组成的并行计算,是由Action行为触发的
 12.Task
 	在Executor进程中执行任务的工作单元,多个Task组成一个Stage。
 13.SparkEnv
 	线程级别的上下文,存储运行时的重要组件的引用。
 	SparkEnv内创建并包含如下一些重要组件的引用:
 		MapOutPutTracker:负责Shuffle元数据的存储
 		BroadcastManager:负责广播变量的控制与元信息的存储
 		BlockManager:负责存储管理、创建和查找块
 		MetricsSystem:监控运行时性能指标信息
 		SparkConf:负责存储配置信息
 		
2、Spark核心功能

 1. SparkContext
 	通常而言,DriverApplication 的执行与输出都是通过 SparkContext 来完成的,
 在正式提交Application 之前,首先需要初始化 SparkContext。SparkContext 
 隐藏了网络通信、分布式部署、消息通信、存储能力、计算能力、缓存、测量系统、文件
 服务、Web 服务等内容,应用程序开发者只需要使用 SparkContext 提供的 API 完成
 功能开发。
	SparkContext 内置的 DAGScheduler 负责创建 Job,将 DAG 中的 RDD 划分
 到不同的 Stage,提交 Stage 等功能。
	SparkContext 内置的 TaskScheduler 负责资源的申请、任务的提交及请求集群
 对任务的调度等工作。
 2.存储体系
 	Spark 优先考虑使用各节点的内存作为存储,当内存不足时才会考虑使用磁盘,
 这极大地减少了磁盘 I/O,提升了任务执行的效率
 3.计算引擎
 	计算引擎由 SparkContext 中的 DAGScheduler、RDD 以及具体节点上的 Executor 
 负责执行的 Map 和 Reduce 任务组成。
 4.部署模式
  	通过使用 Standalone、YARN、Mesos、kubernetes、Cloud等部署模式为 Task 
 分配计算资源,提高任务的并发执行效率。
 
3、Spark基本架构

 Spark集群组成:
 1.Cluster Manager:
 	Spark的集群管理器,主要负责资源的分配和管理。集群管理器分配的资源属于一级分配,
 它将各个Worker上的内存、CPU等资源分配给应用程序,但是并不负责对Executor的资源
 分配。目前,Standalone、YARN、Mesos、K8S,EC2 等都可以作为 Spark的集群管理
 器。
 2.Master:Spark集群的主节点
 3.Worker:
 	Spark的工作节点。对Spark应用程序而言,有集群管理器分配得到资源的Worker节点
 主要负责以下工作:创建Executor,将资源和任务进一步分配给Executor,
 同步资源信息给Cluster Manager。
 4.Executor:
 	执行计算任务的一些进程。主要负责任务的执行以及与Worker、Driver Application
 的信息同步。
 5.Driver Application:
 	客户端驱动程序,也可以理解为客户端应用程序,用于将任务程序转化为RDD和DAG,
 并与Cluster Manager进行通信和调度。
 
4、Spark运行流程

 1.构建DAG
 	使用算子操作RDD进行各种Transformation操作,最后通过action操作出发Spark作业运行。
 提交之后Spark会根据转换过程所产生的RDD之间的依赖关系构建有向无环图。
 2.DAG切割
 	DAG切割主要根据RDD的依赖是否为宽依赖来决定切割节点,当遇到宽依赖就将任务划分为
 一个新的调度阶段(stage)。每个Stage中包含一个或多个Task。这些Task将形成任务集
 (Taskset),提交给底层调度器进行调度运行。
 3.任务调度
 	每一个Spark任务调度器只为一个SparkContext实例服务。当任务调度器收到任务集后负责
 把任务集以Task的形式分发给Worker节点的Executor进程中运行,如果某个任务执行失败,
 任务调度器负责重新分配该任务的计算。
 4.执行任务
 	当Executor收到发送过来的任务后,将以多线程(会在启动executor的时候就初始化好了一
 各线程池)的形式执行任务的计算,每个线程负责一个任务,任务结束后会根据任务的类型选
 择相应的返回形式将结果返回给任务调度器。

5、RDD概述

 1.什么是RDD
 	RDD叫做分布式数据集,是Spark中最基本的抽象概念,它代表一个不可变、可分区、
 里面的元素可并行计算的集合。
 	1.1、数据集DataSet
 		RDD是数据集合的抽象,是复杂物理介质存在数据的一种逻辑视图。从外部来看,
 	RDD的确可以被看待成经过封装,带扩展特性的数据集合。
 	1.2、分布式Distributed
 		RDD的数据可能在物理上存储在多个节点的磁盘或内存中,也就是所谓的多级存储。
 	1.3、弹性Resilient
 		虽然RDD内部存储的数据是可读的,但是我们可以去修改并行计算单元的划分结构,
 	也就是分区的数量。
 2.RDD的特点
 	自动容错、位置感知性调度、可伸缩性
 3.RDD的属性
 	3.1、A list of partitions
 		一组分片(partition),及数据集的基本组成单位。分区的个数决定了并行的粒度。
 	分区的个数可以在创建RDD的时候进行设置,若没有,则默认为cores个数。每个partition
 	最终会bei被逻辑映射为BlockManager中的一个Block,而这个Block会被下一个Task使用
 	进行计算。
 	3.2、A function for computing each split
 		一个计算每个分区的函数,也就是算子。
 	3.3、A list of dependencies on other RDDs
 		RDD之间的依赖关系:宽依赖和窄依赖
 		宽依赖:一个子RDD中的分区可以依赖于父RDD分区中一个或多个完整分区。
 		窄依赖:父RDD的一个partition中的部分数据与RDDx的一个partition相关,而另一部分
 		数据则与RDDx中的另一个partition有关。
 	3.4、Optionally, a Partitioner for key-value RDDs (e.g. to say that the RDD is hash-partitioned)
 		一个partitioner,即RDD的分片函数。
 	3.5、Optionally, a list of preferred locations to compute each split on (e.g. block locations for an HDFS file)
 		一个列表,存储存取每个partition的优先位置。
 4.RDD创建
 	4.1、由一个已经存在的Scala数据集合创建
 		val rdd = sc.parallelize(Array(1,2,3,4,5,6,7,8))
        val rdd = sc.makeRDD(Array(1,2,3,4,5,6,7,8))
    4.2、由外部存储系统的数据集创建
    	val rdd = sc.textFile("hdfs://myha01/spark/wc/input/words.txt")
    4.3、扩展
    	从 HBase 当中读取
        从 ElasticSearch 中读取    
 5.Transformation转换
 	转换算子:map、filter、flatMap、mapPartitions、sample、union、intersection、
 	distinct、groupByKey、aggregateByKey、sortByKey、sortBy、join、coalesce、
 	repartition、foldByKey、combineByKey、partitionBy、cache、persist、substract、
 	leftOuterJoin、rightOuterJoin、subtractByKey
 	总结:Transformation返回值还是一个RDD。它使用l了链式调用的设计模式,对一个
 	RDD进行计算后,变换成另一个RDD,然后这个RDD又可以进行另外一次转换。这个
 	过程是分布式的。
 6.Action
 	Action算子:reduce、reduceByKeyLocally、collect、count、first、take、takeSample、
 	top、takeOrdered、countByKey、foreach、foreachPartition、fold、aggregate、
 	lookup、saveASTextFile、saveAsSequenceFile、saveAsObjectFile
 	总结:Action返回值不是一个RDD。它要么是一个Scala的普通集合,要么是一个值,
 	要么是空,最终返回到Driver程序,或把RDD写入到文件系统中。
 	
6、Spark任务执行流程

Spark任务执行流程

 7、Spark On StandAlone运行过程

<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值