众所周知,Spark 它是专门为大规模数据处理而设计的快速通用计算引擎,因此Spark它在数据的挖掘等领域便有着非常广泛的应用,而从现阶段来讲的话它也已经形成了一个高速发展并且应用相当广泛的生态系统了。所以,今天这篇文章便要为大家做一个Spark入门基础的简单介绍,满满干货,请不要错过。
一.关于Spark的概述
我们可以了解到,当前,mapReduce编程模型成为了一种比较主流的分布式编程模型,并且它也极大地方便了编程人员在不会分布式并行编程的情况下,能够将自己的程序运行在分布式系统上。
但其实从MapReduce来看它也存在了一些缺陷的,比如说它的高延迟以及不支持DAG模型,Reduce的中间数据落地等。因此为了优化改进MapReduce的项目,比如交互查询引擎Impala、支持内存计算Spark等这些方面。Spark凭借自身先进的设计理念,一跃成为了社区里面的热门项目。而目前来看Spark相对于MapReduce的一些优势有:低延迟、支持DAG和分布式内存计算。
二.Spark应用框架
客户Spark程序(Driver Program)操作Spark集群其实它是通过SparkContext这个对象来进行的,而SparkContext自身作为一个操作和调度的总入口,它在初始化的过程中集群管理器则会进行DAGScheduler作业调度和TaskScheduler任务调度的创建。
而DAGScheduler作业调度模块则又是依靠于Stage的这个调度模块来进行的,DAG全称 Directed Acyclic Graph。简单的来讲的话,它其实就是一个由顶点和有方向性的边构成的图,然后他可以其中从任意的一个顶点去出发,但是呢又没有路径可以将其带回到出发的顶点。并且它为每个Spark Job计算具有依赖关系的多个Stage任务阶段(通常根据Shuffle来划分Stage,比如说groupByKey, reduceByKey等涉及到shuffle的transformation就会产生新的stage),然后到后面的时候它又会将每个Stage划分为具体的一组任务,最后就以TaskSets的形式提交给底层的任务调度模块来进行一个具体执行。
三.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生态圈介绍
Spark力图整合机器学习(MLib)、图算法(GraphX)、流式计算(Spark Streaming)和数据仓库(Spark SQL)等领域,通过计算引擎Spark,弹性分布式数据集(RDD),架构出一个新的大数据应用平台。
Spark生态圈以HDFS、S3、Techyon为底层存储引擎,以Yarn、Mesos和Standlone作为资源调度引擎;使用Spark,可以实现MapReduce应用;基于Spark,Spark SQL可以实现即席查询,Spark Streaming可以处理实时应用,MLib可以实现机器学习算法,GraphX可以实现图计算,SparkR可以实现复杂数学计算。
四.Spark的优点
①减少磁盘I/O:随着实时大数据应用越来越多,Hadoop作为离线的高吞吐、低响应框架已不能满足这类需求。HadoopMapReduce的map端将中间输出和结果存储在磁盘中,reduce端又需要从磁盘读写中间结果,势必造成磁盘IO成为瓶颈。Spark允许将map端的中间输出和结果存储在内存中,reduce端在拉取中间结果时避免了大量的磁盘I/O。Hadoop Yarn中的ApplicationMaster申请到Container后,具体的任务需要利用NodeManager从HDFS的不同节点下载任务所需的资源(如Jar包),这也增加了磁盘I/O。Spark将应用程序上传的资源文件缓冲到Driver本地文件服务的内存中,当Executor执行任务时直接从Driver的内存中读取,也节省了大量的磁盘I/O。
②增加并行度:由于将中间结果写到磁盘与从磁盘读取中间结果属于不同的环节,Hadoop将它们简单的通过串行执行衔接起来。Spark把不同的环节抽象为Stage,允许多个Stage既可以串行执行,又可以并行执行。
③避免重新计算:当Stage中某个分区的Task执行失败后,会重新对此Stage调度,但在重新调度的时候会过滤已经执行成功的分区任务,所以不会造成重复计算和资源浪费。
④可选的Shuffle排序:HadoopMapReduce在Shuffle之前有着固定的排序操作,而Spark则可以根据不同场景选择在map端排序或者reduce端排序。
⑤灵活的内存管理策略:Spark将内存分为堆上的存储内存、堆外的存储内存、堆上的执行内存、堆外的执行内存4个部分。Spark既提供了执行内存和存储内存之间是固定边界的实现,又提供了执行内存和存储内存之间是“软”边界的实现。Spark默认使用“软”边界的实现,执行内存或存储内存中的任意一方在资源不足时都可以借用另一方的内存,最大限度的提高资源的利用率,减少对资源的浪费。Spark由于对内存使用的偏好,内存资源的多寡和使用率就显得尤为重要,为此Spark的内存管理器提供的Tungsten实现了一种与操作系统的内存Page非常相似的数据结构,用于直接操作操作系统内存,节省了创建的Java对象在堆中占用的内存,使得Spark对内存的使用效率更加接近硬件。Spark会给每个Task分配一个配套的任务内存管理器,对Task粒度的内存进行管理。Task的内存可以被多个内部的消费者消费,任务内存管理器对每个消费者进行Task内存的分配与管理,因此Spark对内存有着更细粒度的管理。
以上本篇内容便是对Spark的一些基础入门的介绍,后续还将对Spark做一些后续的介绍,以便能更加深入的对Spark做一个了解。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。