超越时代的大数据技术——Spark
Spark是UC Berkeley AMP LAB所开源的类MapReduce的通用并行框架, 是专为大规模数据处理而设计的快速通用的计算引擎。Spark是一种与Hadoop MapReduce相似的开源集群计算环境,Spark拥有MapReduce所具有的优点,但不同于MapReduce的是Job中间输出结果可以保存在内存中,从而不再需要读写HDFS,因此Spark的计算效率要比MapReduce快很多,同时Spark也能更好地适用于数据挖掘与机器学习等需要迭代的MapReduce的算法。
Spark的特点
计算速度快:由于Spark是基于内存的分布式计算引擎,因此其运算效率很快。根据官方数据统计,Spark基于内存运算效率是Hadoop的100被以上,基于硬盘的运算奥效率也要快10倍以上。
易用性:Spark编程支持Java、Scala、Python和R等编程语言,并且拥有了80余中算法。另外,Spark同样也支持SHELL命令行的交互模式。
通用性:Spark提供了适用于批处理、交互式查询的SparkSQL,实时流处理SparkStreaming,机器学习SparkMLlib和图计算GraphX,它们可以在同一个应用程序中无缝地结合使用,大大减少大数据开发和维护的人力成本和部署平台的物力成本。
兼容性:Spark可以运行在Hadoop模式、Mesos模式或Standalone独立模式,并且还可以访问各种数据源,包括本地文件系统、HDFS、HBase和Hive等。
Spark的技术架构
Spark主要包含Spark Core、Spark SQL、Spark Streaming、Spark MLib、GraphX等核心模块。各模块的作用介绍如下:
Spark Core:Spark Core包含了Spark的基本功能,包含任务调度、内存管理、错误恢复、存储系统交互等模块,以及对弹性分布式数据集RDD的API定义。
Spark SQL:Spark SQL是操作结构化数据的程序包,通过Spark SQL可以使用SQL来查询多种数据源,比如Hive表、Parquet以及JSON等。
Spark Streaming:Spark Streaming是实时流式数据计算的组件,它允许程序能够像普通RDD一样处理实时数据。
Spark MLlib:Spark MLib是机器学习功能的程序库,包含分类、回归、聚类、协同过滤等操作,同时还提供了模型评估、数据导入等额外的支持功能。
GraphX:GrahpX是控制图、并行图操作和计算的一组算法和工具的集合。GraphX扩展了RDD API,包含控制图、创建子图、访问路径上所有顶点的操作。
支持离线批处理和实时数据计算:Spark同时支持离线的批数据处理和实时流数据的处理。
Spark的部署模式
Spark不一定非要跑在Hadoop集群上,其支持多种运行模式,包括本地模式、独立运行模型、Spark On YARN、Spark On Mesos和Spark On Kubernetes等。各种部署模式介绍如下:
本地模式:本地模式即单机版部署模式,通常用于测试和个人学习,部署方便,仅需一台机器即可。
独立运行模式:独立运行模式即Standalone,是Spark自带资源调度框架的集群管理模式。Standalone是最简单最容易部署的一种集群模式,无需依赖任何其他资源管理系统,其主要的节点有Driver节点、Master节点和Worker节点。
Spark On YARN模式:Spark On YARN是运行在YARN框架上的模式,使用YARN为上层应用提供统一的资源管理和调度。目前Spark On YARN仅支持粗粒度模式(Coarse-grained Mode),即在YARN上的Container资源是不可以动态伸缩的,一旦Container启动之后,可使用的资源将不能进行调整。Spark On YARN包含Cluster和Client运行模式。Cluster适合生产,driver运行在集群子节点,具有容错功能,Client适合调试,dirver运行在客户端。
Spark On Mesos模式:Spark On Mesos是官方推荐的部署模式。Spark 运行在Mesos上会比运行在YARN上更加灵活,更加自然。Spark On Mesos同时支持粗粒度模式(Coarse-grained Mode)和细粒度模式(Fine-grained Mode)。
1)粗粒度模式:每个应用程序的运行环境由一个Dirver和若干个Executor 组成。其中,每个Executor占用若干资源,内部可运行多个Task。应用程序的各个任务正式运行之前,需要将运行环境中的资源全部申请好,且运行过程中要一直占用这些资源。即使不用,要到最后程序运行结束后才能回收这些资源。
2)细粒度模式:鉴于粗粒度模式会造成大量资源浪费,Spark On Mesos 还提供了另外一种调度模式:细粒度模式,这种模式类似于现在的云计算,思想是按需分配。
Spark On Kubernetes:Spark on Kubernetes于Spark 2.3版本引入开始,到 Spark 3.1以后基本上已经具备了在生产环境大规模使用的条件。
Spark的运行原理
Client提交任务,构建Spark Application的运行环境,启动SparkContext;
SparkContext向资源管理器(Standalone、Mesos、YARN、K8S等模式)申请运行Executor资源;
Executor向SparkContext申请任务;
SparkContext构建成DAG图,将DAG图分解成Stage,并将任务集发送给任务调度器,最后由任务调度器将任务发送给Executor运行;
5.任务在资源执行器上运行后,资源管理器释放所有资源。
SparkContext:SparkContext是整个Spark应用程序最关键的一个对象,是Spark所有功能的主要入口点。客户端通过SparkContext与spark集群的连接,SparkContext能够用来在集群上创建RDD、累加器、广播变量等。每个JVM里只能存在一个处于激活状态的SparkContext,在创建新的SparkContext之前必须调用stop()来关闭之前的SparkContext。
RDD: RDD(Resilient Distributed Datasets)是弹性分布式数据集,是一种容错的、可以被并行操作的元素集合,是Spark对所有数据处理的一种基本抽象。可以通过一系列的算子对RDD进行操作,主要分为Transformation和Action两种操作。
Transformation:Transformation是对已有的RDD进行换行生成新的RDD,对于转换过程采用惰性计算机制,不会立即计算出结果。常用的方法有map,filter,flatmap等。
Action:Action对已有对RDD对数据执行计算产生结果,并将结果返回Driver或者写入到外部存储中。常用到方法有reduce,collect,saveAsTextFile等。
DAG:DAG是一个有向无环图。在Spark中,使用DAG来描述计算逻辑。DAG主要分为DAG Scheduler和Task Scheduler。
DAG Scheduler:DAG Scheduler是面向Stage的高层级的调度器,DAG Scheduler把DAG拆分为多个Task,每组Task都是一个Stage,解析时是以Shuffle为边界进行反向构建的,每当遇见一个Shuffle,Spark就会产生一个新的Stage,接着以TaskSet的形式提交给底层的调度器Task Scheduler,每个Stage封装成一个TaskSet。DAG Scheduler需要记录RDD被存入磁盘物化等动作,同时会需要Task寻找最优等调度逻辑,以及监控因Shuffle跨节点输出导致的失败。
Spark的应用场景
复杂的批数据处理及海量数据的能力;
基于历史数据的交互式查询,通常的时间在数十秒到数十分钟之间;
基于实时数据流的大数据处理,通常在数百毫秒到数秒之间;
大数据挖掘场景,基于Spark MKlib的能力实现大数据的机器学习和数据挖掘。
标签