spark调研报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

自2013年6月进入Apache孵化器,Spark已经有来自25个组织的120多位开发者参与贡献。

而在不久前,更成为了Apache软件基金会的顶级项目,当下已是知名Hadoop开发商Cloudera和MapR的新宠。

Spark是发源于美国加州大学伯克利分校AMPLab的集群计算平台,它立足于内存计算,性能超过Hadoop百倍,即使使用磁盘,迭代类型的计算也会有10倍速度的提升。

Spark从多迭代批量处理出发,兼收并蓄数据仓库、流处理和图计算等多种计算范式,是罕见的全能选手。

Spark当下已成为Apache基金会的顶级开源项目,拥有着庞大的社区支持——活跃开发者人数已超过Hadoop MapReduce)。

这里,我们为大家分享许鹏的“Apache Spark源码走读”系列博文,从源码方面对这个流行大数据计算框架进行深度了解。

以下为博文
楔子
源码阅读是一件非常容易的事,也是一件非常难的事。

容易的是代码就在那里,一打开就可以看到。

难的是要通过代码明白作者当初为什么要这样设计,设计之初要解决的主要问题是什么。

在对Spark的源码进行具体的走读之前,如果想要快速对Spark的有一个整体性的认识,阅读Matei Zaharia做的Spark论文是一个非常不错的选择。

在阅读该论文的基础之上,再结合Spark作者在2012 Developer Meetup上做的演讲Introduction to Spark Internals,那么对于Spark的内部实现会有一个比较大概的了解。

有了上述的两篇文章奠定基础之后,再来进行源码阅读,那么就会知道分析的重点及难点。

基本概念(Basic Concepts)
1. RDD——Resillient Distributed Dataset 弹性分布式数据集。

2. Operation——作用于RDD的各种操作分为transformation和action。

3. Job——作业,一个JOB包含多个RDD及作用于相应RDD上的各种operation。

4. Stage——一个作业分为多个阶段。

5. Partition——数据分区,一个RDD中的数据可以分成多个不同的区。

6. DAG——Directed Acycle graph,有向无环图,反应RDD之间的依赖关系。

7. Narrow dependency——窄依赖,子RDD依赖于父RDD中固定的data partition。

8. Wide Dependency——宽依赖,子RDD对父RDD中的所有data partition都有依赖。

9. Caching Managenment——缓存管理,对RDD的中间计算结果进行缓存管理以加快整体的处理速度。

编程模型(Programming Model)
RDD是只读的数据分区集合,注意是数据集。

作用于RDD上的Operation分为transformantion和action。

经Transformation处理之后,数据集中的内容会发生更改,由数据集A转换成为数据集B;而经Action处理之后,数据集中的内容会被归约为一个具体的数值。

只有当RDD上有action时,该RDD及其父RDD上的所有operation才会被提交到cluster 中真正的被执行。

从代码到动态运行,涉及到的组件如下图所示。

演示代码
运行态(Runtime view)
不管什么样的静态模型,其在动态运行的时候无外乎由进程,线程组成。

用Spark的术语来说,static view称为dataset view,而dynamic view称为parition view。

关系如图所示
在Spark中的task可以对应于线程,worker是一个个的进程,worker由driver来进行管理。

那么问题来了,这一个个的task是如何从RDD演变过来的呢?下节将详细回答这个问题。

部署(Deployment view)
当有Action作用于某RDD时,该action会作为一个job被提交。

在提交的过程中,DAGScheduler模块介入运算,计算RDD之间的依赖关系。

RDD之间的依赖关系就形成了DAG。

每一个JOB被分为多个stage,划分stage的一个主要依据是当前计算因子的输入是否是确定的,如果是则将其分在同一个stage,避免多个stage之间的消息传递开销。

当stage被提交之后,由taskscheduler来根据stage来计算所需要的task,并将task提交到对应的worker。

Spark支持以下几种部署模式,Standalone、Mesos和YARN。

这些部署模式将作为taskscheduler的初始化入参。

RDD接口(RDD Interface)
RDD由以下几个主要部分组成
1.partitions——partition集合,一个RDD中有多少data partition
2.dependencies——RDD依赖关系
pute(parition)——对于给定的数据集,需要作哪些计算
4.preferredLocations——对于data partition的位置偏好
5.partitioner——对于计算出来的数据结果如何分发
缓存机制(caching)
RDD的中间计算结果可以被缓存起来,缓存先选Memory,如果Memory不够的话,将会被写入到磁盘中。

根据LRU(last-recent update)来决定哪先内容继续保存在内存,哪些保存到磁盘。

容错性(Fault-tolerant)
从最初始的RDD到衍生出来的最后一个RDD,中间要经过一系列的处理。

那么如何处理中间环节出现错误的场景呢?
Spark提供的解决方案是只对失效的data partition进行事件重演,而无须对整个数据全集进行事件重演,这样可以大大加快场景恢复的开销。

RDD又是如何知道自己的data partition的number该是多少?如果是HDFS文件,那么HDFS文件的block将会成为一个重要的计算依据。

集群管理(cluster management)
task运行在cluster之上,除了Spark自身提供的Standalone部署模式之外,Spark还内在支持Yarn和mesos。

Yarn来负责计算资源的调度和监控,根据监控结果来重启失效的task或者是重新distributed task一旦有新的node加入cluster的话。

这一部分的内容需要参Yarn的文档。

小结
在源码阅读时,需要重点把握以下两大主线。

∙静态view即RDD,transformation and action
∙动态view即life of a job,每一个job又分为多个stage,每一个stage中可以包含多个rdd及其transformation,这些stage又是如何映射成为task被distributed到cluster 中

April: Lightning-Fast Cluster Computing with Spark and Shark
∙April 16, 2013 · 6:30 PM
∙Bronto Software, Inc.
Speakers: Mayuresh Kunjir and Harold Lim, Duke University
Spark is an open-source cluster-computing system developed by theAMPLab at the University of California, Berkeley. Spark provides veryfast performance and ease of development for a variety of dataanalytics needs such as machine
learning, graph processing, andSQL-like queries. Spark supports distributed
in-memory computations that can be up to 100x faster than Hadoop.
Shark is a Hive-compatible data warehousing system built on Spark.Shark
supports the HiveQL query language, the Hive Metastore, and all the serialization formats supported by Hive. The use of Spark and a number of built-in
optimizations make Shark perform up to 100x faster than Hive.
This talk will discuss the internals of Spark and Shark, theapplications that these systems support, and show a demo that includes performance comparisons with Hive.
概要
本文以wordCount为例,详细说明Spark创建和运行job的过程,重点是在进程及线程的创建。

实验环境搭建
在进行后续操作前,确保下列条件已满足。

1.下载spark binary 0.9.1
2.安装scala
3.安装sbt
4.安装java
启动spark-shell
单机模式运行,即local模式
local模式运行非常简单,只要运行以下命令即可,假设当前目录是$SPARK_HOME
"MASTER=local"就是表明当前运行在单机模式
local cluster方式运行
local cluster模式是一种伪cluster模式,在单机环境下模拟Standalone的集群,启动顺序分别如下
1.启动master
2.启动worker
3.启动spark-shell
master
注意运行时的输出,日志默认保存在$SPARK_HOME/logs目录。

master主要是运行类org.apache.spark.deploy.master.Master,在8080端口启动监听,日志如下图所示
修改配置
运行worker
worker启动完成,连接到master。

打开maser的web ui可以看到连接上来的worker. Master WEb UI的监听地址是http://localhost:8080
启动spark-shell
如果一切顺利,将看到下面的提示信息。

可以用浏览器打开localhost:4040来查看如下内容
1.stages
2.storage
3.environment
4.executors
wordcount
上述环境准备妥当之后,我们在sparkshell中运行一下最简单的例子,在spark-shell中输入如下代码
上述代码统计在README.md中含有Spark的行数有多少
部署过程详解
Spark布置环境中组件构成如下图所示。

∙Driver Program简要来说在spark-shell中输入的wordcount语句对应于上图的Driver Program。

∙Cluster Manager 就是对应于上面提到的master,主要起到deploy management的作用
∙Worker Node 与Master相比,这是slave node。

上面运行各个executor,executor可以对应于线程。

executor处理两种基本的业务逻辑,一种就是driver programme,另一种就是job在提交之后拆分成各个stage,每个stage可以运行一到多个task
Notes:在集群(cluster)方式下,Cluster Manager运行在一个jvm进程之中,而worker 运行在另一个jvm进程中。

在local cluster中,这些jvm进程都在同一台机器中,如果是真正的Standalone或Mesos及Yarn集群,worker与master或分布于不同的主机之上。

JOB的生成和运行
job生成的简单流程如下
1.首先应用程序创建SparkContext的实例,如实例为sc
2.利用SparkContext的实例来创建生成RDD
3.经过一连串的transformation操作,原始的RDD转换成为其它类型的RDD
4.当action作用于转换之后RDD时,会调用SparkContext的runJob方法
5.sc.runJob的调用是后面一连串反应的起点,关键性的跃变就发生在此处
调用路径大致如下
1.sc.runJob->dagScheduler.runJob->submitJob
2.DAGScheduler::submitJob会创建JobSummitted的event发送给内嵌类
eventProcessActor
3.eventProcessActor在接收到JobSubmmitted之后调用processEvent处理函数
4.job到stage的转换,生成finalStage并提交运行,关键是调用submitStage
5.在submitStage中会计算stage之间的依赖关系,依赖关系分为宽依赖和窄依赖两种
6.如果计算中发现当前的stage没有任何依赖或者所有的依赖都已经准备完毕,则提交
task
7.提交task是调用函数submitMissingTasks来完成
8.task真正运行在哪个worker上面是由TaskScheduler来管理,也就是上面的
submitMissingTasks会调用TaskScheduler::submitTasks
9.TaskSchedulerImpl中会根据Spark的当前运行模式来创建相应的backend,如果是在
单机运行则创建LocalBackend
10.LocalBackend收到TaskSchedulerImpl传递进来的ReceiveOffers事件
11.receiveOffers->unchT ask->T askRunner.run
代码片段uchTask
说了这么一大通,也就是讲最终的逻辑处理切切实实是发生在TaskRunner这么一个executor之内。

运算结果是包装成为MapStatus然后通过一系列的内部消息传递,反馈到DAGScheduler,这一个消息传递路径不是过于复杂,有兴趣可以自行勾勒。

/art/201208/354994.htm
Twitter将采用Spark分析大数据
Twitter数据科学家Edwin Chen最近在接受媒体采访的时候透露,Twitter内部希望尝试一种全新的大数据系统——Spark。

AD:WOT2014:用户标签系统与用户数据化运营培训专场Spark是一个基于内存计算的开源的集群计算系统(点此下载),目的是让数据分析更加快速。

Spark非常小巧玲珑,由加州伯克利大学AMP实验室的Matei为主的小团队所开发。

使用的语言是Scala,项目的core部分的代码只有63个Scala文件,非常短小精悍。

与Hadoop 不同的是,Spark和Scala紧密集成,Scala像管理本地collective对象那样管理分布式数据集。

Edwin认为:”MapReduce或hadoop任务都是批处理,所以启动一项Hadoop任务,或等待结果返回都需要等待很长时间,这一点很难改变,因为Hadoop天生就是一个批处理系统,你无法在上面运行互动分析。

不过Hadoop对于分析海量数据还是很有用的。


Spark开发之初是为了两个能被内存计算提速的应用:互动算法(常见于机器学习中,例如Google的PR)和互动数据挖掘(Hive on Spark)。

在这两个应用中,Spark的速度是Hadoop MapReduce的30倍!这是因为运行Spark系统时,服务器可以把中间数据存储在RAM 内存中,而无需经常从头加载。

这意味着分析结果的返回速度大大加快,足以胜任互动分析工作。

(见下图)
在Spark的出生地——加州伯克利大学的AMP实验室,研究人员用Spark分析垃圾邮件过滤、自然语言处理以及交通路况预测等任务。

Spark还被用来给Conviva、Klout和Quantifind等公司的数据分析服务提速。

无疑,Spark处理分布式数据集的框架不仅是有效的,而且是高效的(通过简洁的Scala脚本)。

Spark和Scala目前都还尚处于开发中。

尽管如此,随着加入更多的关键互联网特性,它越来越从有趣的开源软件过渡为基础的web 技术。

免费订阅“CSDN云计算”微信公众号,实时掌握第一手云中消息!
CSDN作为国内最专业的云计算服务平台,提供云计算、大数据、虚拟化、数据中心、OpenStack、CloudStack、Hadoop、Spark、机器学习、智能算法等相关云计算观点,云计算技术,云计算平台,云计算实践,云计算产业资讯等服务。

以下为原文:
Spark作为Apache顶级的开源项目,项目主页见。

在迭代计算,交互式查询计算以及批量流计算方面都有相关的子项目,如Shark、Spark Streaming、MLbase、GraphX、SparkR等。

从13年起Spark开始举行了自已的Spark Summit会议,会议网址见。

Amplab实验室单独成立了独立公司Databricks来支持Spark的研发。

为了满足挖掘分析与交互式实时查询的计算需求,腾讯大数据使用了Spark平台来支持挖掘分析类计算、交互式实时查询计算以及允许误差范围的快速查询计算,目前腾讯大数据拥有超过200台的Spark集群,并独立维护Spark和Shark分支。

Spark集群已稳定运行2年,我们积累了大量的案例和运营经验能力,另外多个业务的大数据查询与分析应用,已在陆续上线并稳定运行。

在SQL查询性能方面普遍比MapReduce高出2倍以上,利用内存计算和内存表的特性,性能至少在10倍以上。

在迭代计算与挖掘分析方面,精准推荐将小时和天级别的模型训练转变为Spark的分钟级别的训练,同时简洁的编程接口使得算法实现比MR在时间成本和代码量上高出许多。

Spark VS MapReduce
尽管MapReduce适用大多数批处理工作,并且在大数据时代成为企业大数据处理的首选技术,但由于以下几个限制,它对一些场景并不是最优选择:
∙缺少对迭代计算以及DAG运算的支持
∙Shuffle过程多次排序和落地,MR之间的数据需要落Hdfs文件系统
Spark在很多方面都弥补了MapReduce的不足,比MapReduce的通用性更好,迭代运算效率更高,作业延迟更低,它的主要优势包括:
∙提供了一套支持DAG图的分布式并行计算的编程框架,减少多次计算之间中间结果写到Hdfs的开销
∙提供Cache机制来支持需要反复迭代计算或者多次数据共享,减少数据读取的IO开销∙使用多线程池模型来减少task启动开稍,shuffle过程中避免不必要的sort操作以及减少磁盘IO操作
∙广泛的数据集操作类型
MapReduce由于其设计上的约束只适合处理离线计算,在实时查询和迭代计算上仍有较大的不足,而随着业务的发展,业界对实时查询和迭代分析有更多的需求,单纯依靠MapReduce框架已经不能满足业务的需求了。

Spark由于其可伸缩、基于内存计算等特点,且可以直接读写Hadoop上任何格式的数据,成为满足业务需求的最佳候选者。

应用Spark的成功案例
目前大数据在互联网公司主要应用在广告、报表、推荐系统等业务上。

在广告业务方面需要大数据做应用分析、效果分析、定向优化等,在推荐系统方面则需要大数据优化相关排名、个性化推荐以及热点点击分析等。

这些应用场景的普遍特点是计算量大、效率要求高。

Spark恰恰满足了这些要求,该项目一经推出便受到开源社区的广泛关注和好评。

并在近两年内发展成为大数据处理领域最炙手可热的开源项目。

本章将列举国内外应用Spark的成功案例。

1. 腾讯
广点通是最早使用Spark的应用之一。

腾讯大数据精准推荐借助Spark快速迭代的优势,围绕“数据+算法+系统”这套技术方案,实现了在“数据实时采集、算法实时训练、系统实时预测”的全流程实时并行高维算法,最终成功应用于广点通pCTR投放系统上,支持每天上百亿的请求量。

基于日志数据的快速查询系统业务构建于Spark之上的Shark,利用其快速查询以及内存表等优势,承担了日志数据的即席查询工作。

在性能方面,普遍比Hive高2-10倍,如果使用内存表的功能,性能将会比Hive快百倍。

2. Yahoo
Yahoo将Spark用在Audience Expansion中的应用。

Audience Expansion是广告中寻找目标用户的一种方法:首先广告者提供一些观看了广告并且购买产品的样本客户,据此进行学习,寻找更多可能转化的用户,对他们定向广告。

Yahoo采用的算法是logistic regression。

同时由于有些SQL负载需要更高的服务质量,又加入了专门跑Shark的大内存集群,用于取代商业BI/OLAP工具,承担报表/仪表盘和交互式/即席查询,同时与桌面BI工具对接。

目前在Yahoo部署的Spark集群有112台节点,9.2TB内存。

3. 淘宝
阿里搜索和广告业务,最初使用Mahout或者自己写的MR来解决复杂的机器学习,导致效率低而且代码不易维护。

淘宝技术团队使用了Spark来解决多次迭代的机器学习算法、高计算复杂度的算法等。

将Spark运用于淘宝的推荐相关算法上,同时还利用Graphx解决了许多生产问题,包括以下计算场景:基于度分布的中枢节点发现、基于最大连通图的社区发现、基于三角形计数的关系衡量、基于随机游走的用户属性传播等。

4. 优酷土豆
优酷土豆在使用Hadoop集群的突出问题主要包括:第一是商业智能BI方面,分析师提交任务之后需要等待很久才得到结果;第二就是大数据量计算,比如进行一些模拟广告投放之时,计算量非常大的同时对效率要求也比较高,最后就是机器学习和图计算的迭代运算也是需要耗费大量资源且速度很慢。

最终发现这些应用场景并不适合在MapReduce里面去处理。

通过对比,发现Spark性能比MapReduce提升很多。

首先,交互查询响应快,性能比Hadoop提高若干倍;模拟广告投放计算效率高、延迟小(同hadoop比延迟至少降低一个数量级);机器学习、图计算等迭代计算,大大减少了网络传输、数据落地等,极大的提高的计算性能。

目前Spark已经广泛使用在优酷土豆的视频推荐(图计算)、广告业务等。

Spark与Shark的原理
1.Spark生态圈
如下图所示为Spark的整个生态圈,最底层为资源管理器,采用Mesos、Yarn等资源管理集群或者Spark自带的Standalone模式,底层存储为文件系统或者其他格式的存储系统如HBase。

Spark作为计算框架,为上层多种应用提供服务。

Graphx和MLBase提供数据挖掘服务,如图计算和挖掘迭代计算等。

Shark提供SQL查询服务,兼容Hive语法,性能比Hive快3-50倍,BlinkDB是一个通过权衡数据精确度来提升查询晌应时间的交互SQL查
询引擎,二者都可作为交互式查询使用。

Spark Streaming将流式计算分解成一系列短小的批处理计算,并且提供高可靠和吞吐量服务。

2.Spark基本原理
Spark运行框架如下图所示,首先有集群资源管理服务(Cluster Manager)和运行作业任务的结点(Worker Node),然后就是每个应用的任务控制结点Driver和每个机器节点上有具体任务的执行进程(Executor)。

与MR计算框架相比,Executor有二个优点:一个是多线程来执行具体的任务,而不是像MR那样采用进程模型,减少了任务的启动开稍。

二个是Executor上会有一个BlockManager 存储模块,类似于KV系统(内存和磁盘共同作为存储设备),当需要迭代多轮时,可以将中间过程的数据先放到这个存储系统上,下次需要时直接读该存储上数据,而不需要读写到hdfs等相关的文件系统里,或者在交互式查询场景下,事先将表Cache到该存储系统上,提高读写IO性能。

另外Spark在做Shuffle时,在Groupby,Join等场景下去掉了不必要的Sort操作,相比于MapReduce只有Map和Reduce二种模式,Spark还提供了更加丰富全面的运算操作如filter,groupby,join等。

Spark采用了Scala来编写,在函数表达上Scala有天然的优势,因此在表达复杂的机器学习算法能力比其他语言更强且简单易懂。

提供各种操作函数来建立起RDD的DAG计算模
型。

把每一个操作都看成构建一个RDD来对待,而RDD则表示的是分布在多台机器上的数据集合,并且可以带上各种操作函数。

如下图所示:
首先从hdfs文件里读取文本内容构建成一个RDD,然后使用filter()操作来对上次的RDD 进行过滤,再使用map()操作取得记录的第一个字段,最后将其cache在内存上,后面就可以对之前cache过的数据做其他的操作。

整个过程都将形成一个DAG计算图,每个操作步骤都有容错机制,同时还可以将需要多次使用的数据cache起来,供后续迭代使用。

3.Shark的工作原理
Shark是基于Spark计算框架之上且兼容Hive语法的SQL执行引擎,由于底层的计算采用了Spark,性能比MapReduce的Hive普遍快2倍以上,如果是纯内存计算的SQL,要快5倍以上,当数据全部load在内存的话,将快10倍以上,因此Shark可以作为交互式查询应用服务来使用。

上图就是整个Shark的框架图,与其他的SQL引擎相比,除了基于Spark的特性外,Shark 是完全兼容Hive的语法,表结构以及UDF函数等,已有的HiveSql可以直接进行迁移至Shark上。

与Hive相比,Shark的特性如下:
1.以在线服务的方式执行任务,避免任务进程的启动和销毁开稍,通常MapReduce里的每个任务都是启动和关闭进程的方式来运行的,而在Shark中,Server运行后,所有的工作节点也随之启动,随后以常驻服务的形式不断的接受Server发来的任务。

2.Groupby和Join操作不需要Sort工作,当数据量内存能装下时,一边接收数据一边执行计算操作。

在Hive中,不管任何操作在Map到Reduce的过程都需要对Key进行Sort操作。

3.对于性能要求更高的表,提供分布式Cache系统将表数据事先Cache至内存中,后续的查询将直接访问内存数据,不再需要磁盘开稍。

4.还有很多Spark的特性,如可以采用Torrent来广播变量和小数据,将执行计划直接传送给Task,DAG过程中的中间数据不需要落地到Hdfs文件系统。

腾讯大数据Spark的概况
腾讯大数据综合了多个业务线的各种需求和特性,目前正在进行以下工作:
1.经过改造和优化的Shark和Spark吸收了TDW平台的功能,如Hive的特有功能:元数据重构,分区优化等,同时可以通过IDE或者洛子调度来直接执行HiveSql查询和定时调度Spark的任务;
2.与Gaia和TDW的底层存储直接兼容,可以直接安全且高效地使用TDW集群上的数据;
3.对Spark底层的使用门槛,资源管理与调度,任务监控以及容灾等多个功能进行完善,并支持快速的迁移和扩容。

编辑注:TDW是腾讯内部规模最大的分布式系统,为腾讯的各个产品提供海量数据存储和分析服务,目前该项目已经开源
/s?__biz=MzA3MDQ4MzQzMg==&mid=205137135&idx=1&sn=24de5f0 a11d8a4f3bb40854717c1fa42&scene=4&uin=MTEyNDM1NzgxMA%3D%3D&key=88c7ba82076ac ca7edd27801f1257cdb75ade13b909dd6ed6c053bc893f6cc1ca31174495f0c63c423df1953fbdbad
d7&devicetype=android-17&version=25030050&lang=zh_CN
/article/2013-07-08/2816149 Spark:大数据的“电光石火”。

相关文档
最新文档