spark基础讲解
一、spark基础
1.1 spark概述
1.1.1 spark定义
基于内存的分布式计算引擎,它的计算速度非常快。但是仅仅只涉及到数据的计算,并没有涉及到数据的存储。在离线计算功能上类似于MapReduce。
1.1.2 为什么要学习spark
MapReduce框架局限性:Map结果写磁盘,Reduce写HDFS,多个MR之间通过HDFS交换数据;任务调度和启动开销大;无法充分利用内存;不适合迭代计算(如机器学习、图计算等等),交互式处理(数据挖掘);不适合流式处理(点击日志分析);MapReduce编程不够灵活,仅支持Map和Reduce两种操作。
1.1.3 Hadoop生态圈
批处理:MapReduce、Hive、Pig
流式计算:Storm
交互式计算:Impala、presto
需要一种灵活的框架可同时进行批处理、流式计算、交互式计算:spark。
1.1.4 spark生态
(1)spark core:相当于MapReduce,是最核心的部分。进行离线计算。
(2)spark sql:类似于Hive。进行离线计算和交互式计算。
(3)spark streaming:准实时,相当于storm、flink。进行实时计算(一批一批)、流式计算(一条一条)。
(4)spark ML(基于DataFrame)、spark mllib(基于RDD):机器学习。
1.1.5 总结
Spark使用Scala语言编写,基于Scala提供了交互式编程体验,同时提供多种方便易用的API。Spark遵循“一个软件栈满足不同应用场景”的设计理念,逐渐形成了一套完整的生态系统,如图1.1所示,分为五大核心技术:分布式计算引擎 Spark Core、基于 Hadoop 的即席查询 SQL 解决方案SparkSQL 、可以实现高吞吐量、具备容错机制的准实时流处理系统 Spark Streaming、构建在 Spark 上的分布式机器学习库 Spark MLlib和分布式图处理框架 Spark GraphX,Spark可以部署在yarn资源管理器上,提供一站式大数据解决方案,可以同时支持批处理、流处理、交互式查询。
图1.1 spark整体架构
Spark作为计算框架只是取代了Hadoop生态系统中的MapReduce计算框架,它仍需要HDFS来实现数据的分布式存储,Hadoop中的其他组件依然在企业大数据系统中发挥着重要作用。
图1.2 Hadoop生态系统
1.2 spark特点
(1)快
与 Hadoop 的 MapReduce 相比,Spark 基于内存的运算要快 100 倍以上,基于硬盘的运算也要快 10 倍以上。Spark 实现了高效的 DAG 执行引擎,可以通过基于内存来高效处理数据流。
(2)易用
Spark 支持 Java、Python、R 和 Scala 的 API,还支持超过 80 种高级算法,使用户可以快速构建不同的应用。而且 Spark 支持交互式的 Python 和 Scala 的 shell,可以非常方便地在这些 shell 中使用 Spark 集群来验证解决问题的方法。
(3)通用
Spark 提供了统一的解决方案。Spark 可以用于批处理、交互式查询(Spark SQL)、实时流处理(Spark Streaming)、机器学习(Spark MLlib)和图计算(GraphX)。这些不同类型的处理都可以在同一个应用中无缝使用。Spark 统一的解决方案非常具有吸引力,毕竟任何公司都想用统一的平台去处理遇到的问题,减少开发和维护的人力成本和部署平台的物力成本。
(4)兼容性
Spark 可以非常方便地与其他的开源产品进行融合。比如,Spark 可以使用 Hadoop 的 YARN 和 Apache Mesos 作为它的资源管理和调度器,并且可以处理所有 Hadoop 支持的数据,包括 HDFS、HBase 和 Cassandra 等。这对于已经部署 Hadoop 集群的用户特别重要,因为不需要做任何数据迁移就可以使用 Spark 的强大处理能力。Spark 也可以不依赖于第三方的资源管理和调度器,它实现了 Standalone作为其内置的资源管理和调度框架,这样进一步降低了 Spark 的使用门槛,使得所有人都可以非常容易地部署和使用 Spark。此外,Spark 还提供了在 EC2 上部署 Standalone 的 Spark 集群的工具。
1.3 spark应用场景
在实际应用中,大数据处理主要包括以下三个类型:
(1)复杂的批量数据处理:通常时间跨度在数十分钟到数小时之间;
(2)基于历史数据的交互式查询:通常时间跨度在数十秒到数分钟之间;
(3)基于实时数据流的数据处理:通常时间跨度在数百毫秒到数秒之间。
同时存在以上场景需要同时部署多个组件,如:MapReduce/Impala/Storm。这样做难免会带来一些问题:不同场景之间输入输出数据无法做到无缝共享,通常需要进行数据格式的转换,不同的软件需要不同的开发和维护团队,带来了较高的使用成本,比较难以对同一个集群中的各个系统进行统一的资源协调和分配。
Spark的设计遵循“一个软件栈满足不同应用场景”的理念,逐渐形成了一套完整的生态系统,Spark所提供的生态系统足以应对上述三种场景,即批处理、交互式查询和流数据处理。
1.4 spark架构
RDD:是Resilient Distributed Dataset(弹性分布式数据集)的简称,是分布式内存的一个抽象概念,提供了一种高度受限的共享内存模型;
DAG:是Directed Acyclic Graph(有向无环图)的简称,反映RDD之间的依赖关系;
应用程序(Application): 基于Spark编写的用户程序,包含了一个Driver Program 和集群中多个的Executor;
驱动程序(Driver Program):运行Application的main()函数并且创建SparkContext,通常用SparkContext代表Driver Program;
执行单元(Executor): 是某Application运行在Worker Node上的一个进程,该进程负责运行Task,并且负责将数据存在内存或者磁盘上,每个Application都有各自独立的Executors;
集群管理程序(Cluster Manager):在集群上获取资源的外部服务(例如:Standalone、Mesos或Yarn);
操作(Operation):作用于RDD的各种操作,分为Transformation和Action;
作业 (Job):在一个Application中有多个Job,每个Job就是一个DAG图,由RDD的Action函数触发。一个作业包含多个RDD及作用于相应RDD上的各种操作;
阶段(Stage):也可称TaskSet,是作业的基本调度单位,一个作业会分为多个阶段,也就是多组任务集(TaskSet),每组任务集被称为阶段,或者也被称为任务集合(TaskSet),代表了一组关联的、相互之间没有Shuffle/宽依赖关系的任务组成的任务集;一个Stage 对应一个TaskSet;
任务( Task ):运行在Executor上的工作单元 ;
Spark运行架构包括集群资源管理器(Cluster Manager)、运行作业任务的工作节点(Worker Node)、每个应用的任务控制节点(Driver)和每个工作节点上负责具体任务的执行单元(Executor),资源管理器可以自带或使用Mesos/YARN。
一个应用由一个Driver和多个Executor组成,在执行应用时,Driver会向Executor发送若干个job,一个job由多个stage构成,一个stage由多个没有Shuffle关系的task,即TaskSet组成。
当执行一个应用时,Driver会向集群管理器申请资源,启动Executor,并向Executor发送应用程序代码和文件,然后在Executor上执行task,运行结束后,执行结果会返回给Driver,或者写到HDFS或者其他数据库中。
1.5 spark运行流程
图1.3 spark的执行流程
SparkContext对象代表了和一个集群的连接:
(1)首先为应用构建起基本的运行环境,即由Driver创建一个SparkContext,进行资源的申请、任务的分配和监控;
(2)资源管理器为Executor分配资源,并启动Executor进程;
(3)SparkContext根据RDD的依赖关系构建DAG图,DAG图提交给DAG Scheduler解析成Stage (Task Set),然后把一个个Task Set提交给底层调度器TaskScheduler处理;Executor向Spark Context申请Task,Task Scheduler将Task发放给Executor运行,并提供应用程序代码;
(4)Task在Executor上运行,把执行结果反馈给TaskScheduler,然后反馈给DAG Scheduler,运行完毕后写入数据并释放所有资源。