这篇文章能让你对于高性能Spark的理解更上一层楼

引言:摘抄自《中国新通信》: 近年来,大数据成为工业界与学术界关注的热点,因为随着存储设备容量的快速增长、CUP外理能力的大幅提开,网络带宽的不断增加。也为大数据时代提共了强有力的技术支撑。从web1.0到web2.0,每个用户都成为一个自媒体,一个互联网内容的提供者,这样数据产生方式的变革更是推动着大数据时代的到来。”

什么是大数据呢?

大数据是由结构化与非结构化数据组成的,其中10%为结构化数据,存储于各类数据库中,90%为非结构化数据,非结构化数据如图片、视频、邮件、网页等,现如今,大数据应用以渗透到各行各业,数据驱动决策,信息社会智能化程度大幅提高。目前,国内相关技术主要集中在数据挖掘相关算法、实际应用及有关理论方面的研究,涉及行业比较广泛,包括零售业、制造业、金融业、电信业、网络相关专业、医疗保健及科学领域,单位集中在部分高等院校、研究所和公司,特别是在it等新兴领域,阿里巴巴、腾讯、百度等巨头对技术发展推动作用巨大,而这些互联网巨头们在大数据处理中,又纷纷采用了hadoop、spark这一处理框架。

什么是Spark呢?

Apache Spark是一个围绕速度、易用性和复杂分析构建的大数据处理框架,最初在2009年由加州大学伯克利分校的AMPLab开发,并于2010年成为Apache的开源项目之一,与Hadoop和Storm等其他大数据和MapReduce技术相比,Spark有如下优势:

  • Spark提供了一个全面、统一的框架用于管理各种有着不同性质(文本数据、图表数据等)的数据集和数据源(批量数据或实时的流数据)的大数据处理的需求。
  • 官方资料介绍Spark可以将Hadoop集群中的应用在内存中的运行速度提升100倍,甚至能够将应用在磁盘上的运行速度提升10倍。
    在这里插入图片描述
架构及生态:

什么是Spark生态系统呢?Spark生态系统称为BDAS(伯努利数据分析栈),本文旨在简单介绍Spark生态系统中一些常用的组件,让大家对Spark生态系统(BDAS)有个简单的了解,知道什么组件能做什么事在这里插入图片描述

组件介绍
  • Spark Core:Spark的核心组件,其操作的数据对象是RDD(弹性分布式数据集),图中在Spark Core上面的四个组件都依赖于Spark Core,可以简单认为Spark Core就是Spark生态系统中的离线计算框架,eg:Spark Core中提供的map,reduce算子可以完成mapreduce计算引擎所做的计算任务。
  • Spark Streaming:Spark生态系统中的流式计算框架,其操作的数据对象是DStream,其实Spark Streaming是将流式计算分解成一系列短小的批处理作业。这里的批处理引擎是Spark Core,也就是把Spark Streaming的输入数据按照batch size(批次间隔时长)(如1秒)分成一段一段的数据系列(DStream),每一段数据都转换成Spark Core中的RDD,然后将Spark Streaming中对DStream的转换计算操作变为针对Spark中对RDD的转换计算操作,如下官方提供的图:在这里插入图片描述
    在内部实现上,DStream由一组时间序列上连续的RDD来表示。每个RDD都包含了自己特定时间间隔内的数据流(如上图中0到1秒接收到的数据成为一个RDD,1到2秒接收到的数据成为一个RDD),使用Spark Streaming对图中DStream的操作就会转化成使用Spark Core中的对应算子(函数)对Rdd的操作。
  • Spark Sql:可以简单认为可以让用户使用写SQL的方式进行数据计算,SQL会被SQL解释器转化成Spark core任务,让懂SQL不懂spark的人都能通过写SQL的方式进行数据计算,类似于hive在Hadoop生态圈中的作用,提供SparkSql CLI(命令行界面),可以再命令行界面编写SQL。
  • Spark Graphx:Spark生态系统中的图计算和并行图计算,目前较新版本已支持PageRank、数三角形、最大连通图和最短路径等6种经典的图算法。
  • Spark Mlib:一个可扩展的Spark机器学习库,里面封装了很多通用的算法,包括二元分类、线性回归、聚类、协同过滤等。用于机器学习和统计等场景。
  • Tachyon:Tachyon是一个分布式内存文件系统,可以理解为内存中的HDFS。
  • Local,Standalone,Yarn,Mesos:Spark的四种部署模式,其中Local是本地模式,一般用来开发测试,Standalone是Spark 自带的资源管理框架,Yarn和Mesos是另外两种资源管理框架,Spark用哪种模式部署,也就是使用了哪种资源管理框架。

通常当需要处理的数据量超过了单机尺度(比如我们的计算机有4GB的内存,而我们需要处理100GB以上的数据)这时我们可以选择spark集群进行计算,有时我们可能需要处理的数据量并不大,但是计算很复杂,需要大量的时间,这时我们也可以选择利用spark集群强大的计算资源,并行化地计算,其架构示意图如下:
在这里插入图片描述

  • Spark Core:包含Spark的基本功能;尤其是定义RDD的API、操作以及这两者上的动作。其他Spark的库都是构建在RDD和Spark Core之上的
  • Spark SQL:提供通过Apache Hive的SQL变体Hive查询语言(HiveQL)与Spark进行交互的API。每个数据库表被当做一个RDD,Spark SQL查询被转换为Spark操作。
  • Spark Streaming:对实时数据流进行处理和控制。Spark Streaming允许程序能够像普通RDD一样处理实时数据
  • MLlib:一个常用机器学习算法库,算法被实现为对RDD的Spark操作。这个库包含可扩展的学习算法,比如分类、回归等需要对大量数据集进行迭代的操作。
  • GraphX:控制图、并行图操作和计算的一组算法和工具的集合。GraphX扩展了RDD API,包含控制图、创建子图、访问路径上所有顶点的操作
  • Spark架构的组成图如下:
    在这里插入图片描述
  • Cluster Manager:在standalone模式中即为Master主节点,控制整个集群,监控worker。在YARN模式中为资源管理器
  • Worker节点:从节点,负责控制计算节点,启动Executor或者Driver。
  • Driver: 运行Application 的main()函数
  • Executor:执行器,是为某个Application运行在worker node上的一个进程

Spark与hadoop

  • Hadoop有两个核心模块,分布式存储模块HDFS和分布式计算模块Mapreduce
  • spark本身并没有提供分布式文件系统,因此spark的分析大多依赖于Hadoop的分布式文件系统HDFS
  • Hadoop的Mapreduce与spark都可以进行数据计算,而相比于Mapreduce,spark的速度更快并且提供的功能更加丰富
  • 关系图如下:
    在这里插入图片描述
  • spark运行流程图如下:
    在这里插入图片描述
  • 构建Spark Application的运行环境,启动SparkContext
  • SparkContext向资源管理器(可以是Standalone,Mesos,Yarn)申请运行Executor资源,并启动StandaloneExecutorbackend,
  • Executor向SparkContext申请Task
  • SparkContext将应用程序分发给Executor
  • SparkContext构建成DAG图,将DAG图分解成Stage、将Taskset发送给Task Scheduler,最后由Task Scheduler将Task发送给Executor运行
  • Task在Executor上运行,运行完释放所有资源

Spark运行特点:

  • 每个Application获取专属的executor进程,该进程在Application期间一直驻留,并以多线程方式运行Task。这种Application隔离机制是有优势的,无论是从调度角度看(每个Driver调度他自己的任务),还是从运行角度看(来自不同Application的Task运行在不同JVM中),当然这样意味着Spark Application不能跨应用程序共享数据,除非将数据写入外部存储系统
  • Spark与资源管理器无关,只要能够获取executor进程,并能保持相互通信就可以了
  • 提交SparkContext的Client应该靠近Worker节点(运行Executor的节点),最好是在同一个Rack里,因为Spark Application运行过程中SparkContext和Executor之间有大量的信息交换
  • Task采用了数据本地性和推测执行的优化机制

Spark运行模式:

Spark的运行模式多种多样,灵活多变,部署在单机上时,既可以用本地模式运行,也可以用伪分布模式运行,而当以分布式集群的方式部署时,也有众多的运行模式可供选择,这取决于集群的实际情况,底层的资源调度即可以依赖外部资源调度框架,也可以使用Spark内建的Standalone模式。对于外部资源调度框架的支持,目前的实现包括相对稳定的Mesos模式,以及hadoop YARN模式。

  • standalone:独立集群运行模式
    Standalone模式使用Spark自带的资源调度框架;采用Master/Slaves的典型架构,选用ZooKeeper来实现Master的HA
  • 框架结构图如下:
    在这里插入图片描述
    该模式主要的节点有Client节点、Master节点和Worker节点。其中Driver既可以运行在Master节点上中,也可以运行在本地Client端。当用spark-shell交互式工具提交Spark的Job时,Driver在Master节点上运行;当使用spark-submit工具提交Job或者在Eclips、IDEA等开发平台上使用”new SparkConf.setManager(“spark://master:7077”)”方式运行Spark任务时,Driver是运行在本地Client端上的。运行过程如下图:(参考至:http://blog.csdn.net/gamer_gyt/article/details/51833681)
    在这里插入图片描述
  1. SparkContext连接到Master,向Master注册并申请资源(CPU Core 和Memory)
  2. Master根据SparkContext的资源申请要求和Worker心跳周期内报告的信息决定在哪个Worker上分配资源,然后在该Worker上获取资源,然后启动StandaloneExecutorBackend;
  3. StandaloneExecutorBackend向SparkContext注册;
  4. SparkContext将Applicaiton代码发送给StandaloneExecutorBackend;并且SparkContext解析Applicaiton代码,构建DAG图,并提交给DAG Scheduler分解成Stage(当碰到Action操作时,就会催生Job;每个Job中含有1个或多个Stage,Stage一般在获取外部数据和shuffle之前产生),然后以Stage(或者称为TaskSet)提交给Task Scheduler,Task Scheduler负责将Task分配到相应的Worker,最后提交给StandaloneExecutorBackend执行;
  5. StandaloneExecutorBackend会建立Executor线程池,开始执行Task,并向SparkContext报告,直至Task完成
  6. 所有Task完成后,SparkContext向Master注销,释放资源
总结:数据处理应用Spark的另外一个主要的使用可以从工程师的角度进行描述。在这里,工程师指使用Spark来构建生产数据处理应用的大量的软件开发者。这些开发者了解软件工程的概念和原则,如封装、接口设计和面向对象编程。他们通常有计算机学科的学位。他们通过自己的软件工程技能来设计和构建实现某个商业使用场景的软件系统。对工程师而言,Spark提供了一个简单的方式在集群之间并行化这些应用,隐藏了分布式系统、网络通信和容错处理的复杂性。系统使得工程师在实现任务的同时,有充足的权限监控、检查和调整应用。API的模块特性使得重用已有工作和本地测试变得简单。

最后我们再来简单的说一下几个面试时会被问到的很常见的问题。

hadoop和spark的shuffle相同和差异:

从 high-level 的角度来看,两者并没有大的差别。 都是将 mapper(Spark 里是 ShuffleMapTask)的输出进行 partition,不同的 partition 送到不同的 reducer(Spark 里 reducer 可能是下一个 stage 里的 ShuffleMapTask,也可能是 ResultTask)。Reducer 以内存作缓冲区,边 shuffle 边 aggregate 数据,等到数据 aggregate 好以后进行 reduce() (Spark 里可能是后续的一系列操作)。

从 low-level 的角度来看,两者差别不小。 Hadoop MapReduce 是 sort-based,进入 combine() 和 reduce() 的 records 必须先 sort。这样的好处在于 combine/reduce() 可以处理大规模的数据,因为其输入数据可以通过外排得到(mapper 对每段数据先做排序,reducer 的 shuffle 对排好序的每段数据做归并)。目前的 Spark 默认选择的是 hash-based,通常使用 HashMap 来对 shuffle 来的数据进行 aggregate,不会对数据进行提前排序。如果用户需要经过排序的数据,那么需要自己调用类似 sortByKey() 的操作;如果你是Spark 1.1的用户,可以将spark.shuffle.manager设置为sort,则会对数据进行排序。在Spark 1.2中,sort将作为默认的Shuffle实现。

从实现角度来看,两者也有不少差别。 Hadoop MapReduce 将处理流程划分出明显的几个阶段:map(), spill, merge, shuffle, sort, reduce() 等。每个阶段各司其职,可以按照过程式的编程思想来逐一实现每个阶段的功能。在 Spark 中,没有这样功能明确的阶段,只有不同的 stage 和一系列的 transformation(),所以 spill, merge, aggregate 等操作需要蕴含在 transformation() 中。

Mapreduce和Spark的都是并行计算,那么他们有什么相同和区别:

  • hadoop的一个作业称为job,job里面分为map task和reduce task,每个task都是在自己的进程中运行的,当task结束时,进程也会结束。
  • spark用户提交的任务成为application,一个application对应一个sparkcontext,app中存在多个job,每触发一次action操作就会产生一个job。这些job可以并行或串行执行,每个job中有多个stage,stage是shuffle过程中DAGSchaduler通过RDD之间的依赖关系划分job而来的,每个stage里面有多个task,组成taskset有TaskSchaduler分发到各个executor中执行,executor的生命周期是和app一样的,即使没有job运行也是存在的,所以task可以快速启动读取内存进行计算。
  • hadoop的job只有map和reduce操作,表达能力比较欠缺而且在mr过程中会重复的读写hdfs,造成大量的io操作,多个job需要自己管理关系。
  • spark的迭代计算都是在内存中进行的,API中提供了大量的RDD操作如join,groupby等,而且通过DAG图可以实现良好的容错。

spark的优化怎么做?

spark调优比较复杂,但是大体可以分为三个方面来进行,1)平台层面的调优:防止不必要的jar包分发,提高数据的本地性,选择高效的存储格式如parquet,2)应用程序层面的调优:过滤操作符的优化降低过多小任务,降低单条记录的资源开销,处理数据倾斜,复用RDD进行缓存,作业并行化执行等等,3)JVM层面的调优:设置合适的资源量,设置合理的JVM,启用高效的序列化方法如kyro,增大off head内存等等.

发布了36 篇原创文章 · 获赞 13 · 访问量 1051

猜你喜欢

转载自blog.csdn.net/weixin_44598691/article/details/105021603