简介:Spark是分布式大规模数据处理的通用引擎,由加州大学伯克利分校的AMP实验室开放。它具有高吞吐量、低延迟、通用可扩展性和高容错性的特点。Spark提供了丰富的开发库,集成了数据分析引擎Spark SQL、图形计算框架GraphX、机器学习库MLlib和流计算引擎Spark Streaming。
Spark是用Scala这种函数式编程语言实现的,它提供了丰富的开发API,支持Scala、Java、Python、R等开发语言。同时Spark提供了多种运行模式,可以独立部署,也可以由Hadoop YARN、Apache Mesos等资源管理器调度。
目前,Spark已经广泛应用于金融、交通、医疗、气象等多个领域。
如需转载,请联系大数据(ID: hzdashuju)
01火花概述
1.核心概念介绍
Spark架构示意图如图2-1所示,下面将分别介绍各个核心组件。
Client:客户端进程,负责提交作业。Driver:一个Spark作业有一个Spark Context,一个Spark Context对应一个Driver进程,作业的main函数运行在Driver中。Driver主要负责Spark作业的解析,以及通过DAGScheduler划分Stage,将Stage转化成TaskSet提交给TaskScheduler任务调度器,进而调度Task到Executor上执行。Executor:负责执行Driver分发的Task任务。集群中一个节点可以启动多个Executor,每一个Executor可以执行多个Task任务。Catche:Spark提供了对RDD不同级别的缓存策略,分别可以缓存到内存、磁盘、外部分布式内存存储系统Tachyon等。Application:提交的一个作业就是一个Application,一个Application只有一个Spark Context。Job:RDD执行一次Action操作就会生成一个Job。Task:Spark运行的基本单位,负责处理RDD的计算逻辑。Stage:DAGScheduler将Job划分为多个Stage,Stage的划分界限为Shuffle的产生,Shuffle标志着上一个Stage的结束和下一个Stage的开始。TaskSet:划分的Stage会转换成一组相关联的任务集。RDD(Resilient Distributed Dataset):弹性分布式数据集,可以理解为一种只读的分布式多分区的数组,Spark计算操作都是基于RDD进行的,下面会有详细介绍。DAG(Directed Acyclic Graph):有向无环图。Spark实现了DAG的计算模型,DAG计算模型是指将一个计算任务按照计算规则分解为若干子任务,这些子任务之间根据逻辑关系构建成有向无环图。▲图2-1火花架构示意图
2.RDD简介
从字面上很难理解RDD。我们可以把它想象成一个分布式多分区只读阵列,Spark计算操作都是基于RDD的。
RDD有几个特点:只读、多分区和分布式。HDFS区块文件可以转换成RDD,一个或多个RDD也可以转换成新RDD,故障后可以自动重建。基于这些特点,RDD可以在分布式环境中高效地并行处理。
每个映射任务生成与减少任务数据相同数量的文件,并获取键的哈希值,并将它们写入相应的文件,如图2-7所示。
生成的文件数file num = maptasknum×reduce tasknum。如果有许多maptasks和reducetasks,将生成大量小文件。在写入文件的过程中,每个文件都会占用一部分缓冲区。占用的总缓冲区大小为totalbuffersize = core num×reduce tasknum×file buffersize,大量小文件会占用更多缓冲区,导致不必要的内存开销,大量随机写操作会大大降低磁盘io的性能。
▲图2-7基于哈希的实现方法
由于简单的基于hash的Hash实现可扩展性差,内存资源利用率低,并且文件拉取过程中过多的小文件增加了磁盘IO和网络开销,需要进一步优化基于Hash的实现,所以引入了Consolidate机制。
如图2-8所示,在同一个Core中执行的Task的输出结果写入同一个文件,生成的文件数为filenam = corenum×reduce tasknum。这种optimizatIOn方法减少了生成的文件数量,提高了磁盘io的吞吐量,但是文件缓存占用的空并没有减少,性能也没有得到显著有效的提高。
▲图2-8优化的基于哈希的实现
设置方法:
代码中设置:conf.get("spark.shuffle.manager", "hash")配置文件中设置:在conf/spark-default.conf配置文件中添加spark.shuffle.managerhashhash的优点基于Hash的实现的缺点;
优点:实现简单,小数量级数据处理操作方便。缺点:产生小文件过多,内存利用率低,大量的随机读写造成磁盘IO性能下降。为了解决很多基于hHashh的实现问题,Spark Shuffle引入了基于Sort的实现,如图2-9所示。这样,每个Map Task任务生成两个文件,一个是数据文件,一个是索引文件,生成的文件数为FileNum=MapTaskNum×2。
数据文件中的数据按照Key分区在不同分区之间排序,而同一分区中的数据不排序。索引文件记录文件中每个分区的偏移量和范围。Reduce Task在读取数据时,首先读取索引文件,找到对应的分区数据偏移量和范围,然后从数据文件中读取指定的数据。
设置方法:
代码中设置:conf.get("spark.shuffle.manager", "sort")配置文件中设置:在conf/spark-default.conf配置文件中添加spark.shuffle.manager sort▲图2-9基于排序的实现
优点和缺点基于排序的排序实现:
优点:顺序读写能够大幅提高磁盘IO性能,不会产生过多小文件,降低文件缓存占用内存空间大小,提高内存使用率。缺点:多了一次粗粒度的排序。2.混洗读取的实现
在随机读取阶段,任务直接读取本地随机写入阶段生成的中间结果数据,或者通过HTTP从远程随机写入阶段提取中间结果数据进行处理。在随机写入阶段,基于哈希和基于排序的实现生成的中间结果数据在随机读取阶段采用相同的实现。
获取需要拉取的数据信息,根据数据本地性原则判断采用哪种级别的拉取方式。判断是否需要在Map端聚合(reduceByKey会在Map端预聚合)。Shuffle Read阶段Task拉取过来的数据如果涉及聚合或者排序,则会使用HashMap结构在内存中存储,如果拉取过来的数据集在HashMap中已经存在相同的键则将数据聚合在一起。此时涉及一个比较重要的参数——spark.shuffle.spill,决定在内存被写满后是否将数据以文件的形式写入到磁盘,默认值为true,如果设置为false,则有可能会发生OOM内存溢出的风险,建议开启。排序聚合之后的数据以文件形式写入磁盘将产生大量的文件内数据有序的小文件,将这些小文件重新加载到内存中,随后采用归并排序的方式合并为一个大的数据文件。关于作者:资深大数据R&D工程师,有多年大数据工作经验,对高性能分布式系统架构、大数据技术、数据分析等有深入研究。
本文摘自经出版社授权的《企业大数据处理:Spark、Druid、Flume、卡夫卡应用实践》。
企业大数据处理扩展阅读
点击上图学习购买
转载请联系微信:DoctorData
推荐语言:资深大数据工程师,立足企业真实场景,系统梳理并详细讲解全栈大数据核心技术;为企业大数据技术选择和大数据平台建设提供了成熟的解决方案,包括大量实际案例。
多找几本好书
“大数据”内容合作伙伴的“阅读团队”上线了!
你最近在看什么书?有哪些经验想和大家分享?
近日,数据大叔做了一件大事——与高质量的图书出版者——机械工业出版社——华章公司联合开展图书评估活动。
简单来说,你可以免费看新书。可以免费看新书,同时也只需要做个读书笔记。详情请回复大数据微信官方账号后台对话框中的合作伙伴。
▼
问:关于Spark你还想知道什么?
转载/提交请联系:baiyu@hzbook.com
1.《rdd Spark入门必读:核心概念介绍及常用RDD操作》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。
2.《rdd Spark入门必读:核心概念介绍及常用RDD操作》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/shehui/1058258.html