spark调研报告.docx
《spark调研报告.docx》由会员分享,可在线阅读,更多相关《spark调研报告.docx(18页珍藏版)》请在冰豆网上搜索。
spark调研报告
自2013年6月进入Apache孵化器,Spark已经有来自25个组织的120多位开发者参与贡献。
而在不久前,更成为了Apache软件基金会的顶级项目,当下已是知名Hadoop开发商Cloudera和MapR的新宠。
Spark是发源于美国加州大学伯克利分校AMPLab的集群计算平台,它立足于内存计算,性能超过Hadoop百倍,即使使用磁盘,迭代类型的计算也会有10倍速度的提升。
Spark从多迭代批量处理出发,兼收并蓄数据仓库、流处理和图计算等多种计算范式,是罕见的全能选手。
Spark当下已成为Apache基金会的顶级开源项目,拥有着庞大的社区支持——活跃开发者人数已超过HadoopMapReduce)。
这里,我们为大家分享许鹏的“ApacheSpark源码走读”系列博文,从源码方面对这个流行大数据计算框架进行深度了解。
以下为博文
楔子
源码阅读是一件非常容易的事,也是一件非常难的事。
容易的是代码就在那里,一打开就可以看到。
难的是要通过代码明白作者当初为什么要这样设计,设计之初要解决的主要问题是什么。
在对Spark的源码进行具体的走读之前,如果想要快速对Spark的有一个整体性的认识,阅读MateiZaharia做的Spark论文是一个非常不错的选择。
在阅读该论文的基础之上,再结合Spark作者在2012DeveloperMeetup上做的演讲IntroductiontoSparkInternals,那么对于Spark的内部实现会有一个比较大概的了解。
有了上述的两篇文章奠定基础之后,再来进行源码阅读,那么就会知道分析的重点及难点。
基本概念(BasicConcepts)
1.RDD——ResillientDistributedDataset弹性分布式数据集。
2.Operation——作用于RDD的各种操作分为transformation和action。
3.Job——作业,一个JOB包含多个RDD及作用于相应RDD上的各种operation。
4.Stage——一个作业分为多个阶段。
5.Partition——数据分区,一个RDD中的数据可以分成多个不同的区。
6.DAG——DirectedAcyclegraph,有向无环图,反应RDD之间的依赖关系。
7.Narrowdependency——窄依赖,子RDD依赖于父RDD中固定的datapartition。
8.WideDependency——宽依赖,子RDD对父RDD中的所有datapartition都有依赖。
9.CachingManagenment——缓存管理,对RDD的中间计算结果进行缓存管理以加快整体的处理速度。
编程模型(ProgrammingModel)
RDD是只读的数据分区集合,注意是数据集。
作用于RDD上的Operation分为transformantion和action。
经Transformation处理之后,数据集中的内容会发生更改,由数据集A转换成为数据集B;而经Action处理之后,数据集中的内容会被归约为一个具体的数值。
只有当RDD上有action时,该RDD及其父RDD上的所有operation才会被提交到cluster中真正的被执行。
从代码到动态运行,涉及到的组件如下图所示。
演示代码
valsc=newSparkContext("Spark:
//...","MyJob",home,jars)
valfile=sc.textFile("hdfs:
//...")
valerrors=file.filter(_.contains("ERROR"))
errors.cache()
errors.count()
运行态(Runtimeview)
不管什么样的静态模型,其在动态运行的时候无外乎由进程,线程组成。
用Spark的术语来说,staticview称为datasetview,而dynamicview称为paritionview。
关系如图所示
在Spark中的task可以对应于线程,worker是一个个的进程,worker由driver来进行管理。
那么问题来了,这一个个的task是如何从RDD演变过来的呢?
下节将详细回答这个问题。
部署(Deploymentview)
当有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接口(RDDInterface)
RDD由以下几个主要部分组成
1.partitions——partition集合,一个RDD中有多少datapartition
2.dependencies——RDD依赖关系
3.compute(parition)——对于给定的数据集,需要作哪些计算
4.preferredLocations——对于datapartition的位置偏好
5.partitioner——对于计算出来的数据结果如何分发
缓存机制(caching)
RDD的中间计算结果可以被缓存起来,缓存先选Memory,如果Memory不够的话,将会被写入到磁盘中。
根据LRU(last-recentupdate)来决定哪先内容继续保存在内存,哪些保存到磁盘。
容错性(Fault-tolerant)
从最初始的RDD到衍生出来的最后一个RDD,中间要经过一系列的处理。
那么如何处理中间环节出现错误的场景呢?
Spark提供的解决方案是只对失效的datapartition进行事件重演,而无须对整个数据全集进行事件重演,这样可以大大加快场景恢复的开销。
RDD又是如何知道自己的datapartition的number该是多少?
如果是HDFS文件,那么HDFS文件的block将会成为一个重要的计算依据。
集群管理(clustermanagement)
task运行在cluster之上,除了Spark自身提供的Standalone部署模式之外,Spark还内在支持Yarn和mesos。
Yarn来负责计算资源的调度和监控,根据监控结果来重启失效的task或者是重新distributedtask一旦有新的node加入cluster的话。
这一部分的内容需要参Yarn的文档。
小结
在源码阅读时,需要重点把握以下两大主线。
∙静态view 即RDD,transformationandaction
∙动态view 即 lifeofajob, 每一个job又分为多个stage,每一个stage中可以包含多个rdd及其transformation,这些stage又是如何映射成为task被distributed到cluster中
∙
April:
Lightning-FastClusterComputingwithSparkandShark
∙April16,2013·6:
30PM
∙BrontoSoftware,Inc.
Speakers:
MayureshKunjir and HaroldLim,DukeUniversity
Sparkisanopen-sourcecluster-computingsystemdevelopedbytheAMPLabattheUniversityofCalifornia,Berkeley.Sparkprovidesveryfastperformanceandeaseofdevelopmentforavarietyofdataanalyticsneedssuchasmachinelearning,graphprocessing,andSQL-likequeries.Sparksupportsdistributedin-memorycomputations thatcanbeupto100xfasterthanHadoop.
SharkisaHive-compatibledatawarehousingsystembuiltonSpark.SharksupportstheHiveQLquerylanguage,theHiveMetastore,andall theserializationformatssupportedbyHive.TheuseofSparkanda numberofbuilt-inoptimizationsmakeSharkperformupto100xfaster thanHive.
ThistalkwilldiscusstheinternalsofSparkandShark,theapplicationsthatthesesystemssupport,andshowademothatincludes performancecomparisonswithHive.
ApacheSpark源码走读之2--Job的提交与运行
概要
本文以wordCount为例,详细说明Spark创建和运行job的过程,重点是在进程及线程的创建。
实验环境搭建
在进行后续操作前,确保下列条件已满足。
1.下载sparkbinary0.9.1
2.安装scala
3.安装sbt
4.安装java
启动spark-shell
单机模式运行,即local模式
local模式运行非常简单,只要运行以下命令即可,假设当前目录是$SPARK_HOME
MASTER=localbin/spark-shell
"MASTER=local"就是表明当前运行在单机模式
localcluster方式运行
localcluster模式是一种伪cluster模式,在单机环境下模拟Standalone的集群,启动顺序分别如下
1.启动master
2.启动worker
3.启动spark-shell
master
$SPARK_HOME/sbin/start-master.sh
注意运行时的输出,日志默认保存在$SPARK_HOME/logs目录。
master主要是运行类 org.apache.spark.deploy.master.Master,在8080端口启动监听,日志如下图所示
修改配置
1.进入$SPARK_HOME/conf目录
2.将spark-env.sh.template重命名为spark-env.sh
3.修改spark-env.sh,添加如下内容
exportSPARK_MASTER_IP=localhost
exportSPARK_LOCAL_IP=localhost
运行worker
bin/spark-classorg.apache.spark.deploy.worker.Workerspark:
//localhost:
7077-i127.0.0.1-c1-m512M
worker启动完成,连接到master。
打开maser的webui可以看到连接上来的worker.MasterWEbUI的监听地址是http:
//localhost:
8080
启动spark-shell
MASTER=spark:
//localhost:
7077bin/spark-shell
如果一切顺利,将看到下面的提示信息。
Createdsparkcontext..
Sparkcontextavailableassc.
可以用浏览器打开localhost:
4040来查看如下内容
1.stages
2.storage
3.environment
4.executors
wordcount
上述环境准备妥当之后,我们在sparkshell中运行一下最简单的例子,在spark-shell中输入如下代码
scala>sc.textFile("README.md").filter(_.contains("Spark")).count
上述代码统计在README.md中含有Spark的行数有多少
部署过程详解
Spark布置环境中组件构成如下图所示。
∙DriverProgram 简要来说在spark-shell中输入的wordcount语句对应于上图的DriverProgram。
∙ClusterManager 就是对应于上面提到的master,主要起到deploymanagement的作用
∙WorkerNode 与Master相比,这是slavenode。
上面运行各个executor,executor可以对应于线程。
executor处理两种基本的业务逻辑,一种就是driverprogramme,另一种就是job在提交之后拆分成各个stage,每个stage可以运行一到多个task
Notes:
在集群(cluster)方式下,ClusterManager运行在一个jvm进程之中,而worker运行在另一个jvm进程中。
在localcluster中,这些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->executor.launchTask->TaskRunner.run
代码片段executor.lauchTask
deflaunchTask(context:
ExecutorBackend,taskId:
Long,serializedTask:
ByteBuffer){
valtr=newTaskRunner(context,taskId,serializedTask)
runningTasks.put(taskId,tr)
threadPool.execute(tr)
}
说了这么一大通,也就是讲最终的逻辑处理切切实实是发生在TaskRunner这么一个executor之内。
运算结果是包装成为MapStatus然后通过一系列的内部消息传递,反馈到DAGScheduler,这一个消息传递路径不是过于复杂,有兴趣可以自行勾勒。
Twitter将采用Spark分析大数据
Twitter数据科学家EdwinChen最近在接受媒体采访的时候透露,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)和互动数据挖掘(HiveonSpark)。
在这两个应用中,Spark的速度是HadoopMapReduce的30倍!
这是因为运行Spark系统时,服务器可以把中间数据存储在RAM内存中,而无需经常从头加载。
这意味着分析结果的返回速度大大加快,足以胜任互动分析工作。
(见下图)
在Spark的出生地——加州伯克利大学的AMP实验室,研究人员用Spark分析垃圾邮件过滤、自然语言处理以及交通路况预测等任务。
Spark还被用来给Conviva、Klout和Quantifind等公司的数据分析服务提速。
无疑,Spark处理分布式数据集的框架不仅是有效的,而且是高效的(通过简洁的Scala脚本)。
Spark和Scala目前都还尚处于开发中。
尽管如此,随着加入更多的关键互联网特性,它越来越从有趣的开源软件过渡为基础的web技术。
大数据计算新贵Spark在腾讯雅虎优酷成功应用解析
发表于2014-06-0514:
50| 7223次阅读|来源腾讯大数据| 9 条评论|作者佚名
大数据腾讯sparkhadoop集群机器学习开源项目Shark
摘要:
MapReduce在实时查询和迭代计算上仍有较大的不足,目前,Spark由于其可伸缩、基于内存计算等特点,且可以直接读写Hadoop上任何格式的数据,逐渐成为大数据处理的新宠,腾讯分享了Spark的原理和应用案例。
【编者按】MapReduce由于其设计上的约束只适合处理离线计算,在实时查询和迭代计算上仍有较大的不足,而随着业务的发展,业界对实时查询和迭代分析有更多的需求,单纯依靠MapReduce框架已经不能满足业务的需求了。
Spark由于其可伸缩、基于内存计算等特点,且可以直接读写Hadoop上任何格式的数据,成为满足业务需求的最佳候选者。
本文来自腾讯大数据。
免费订阅“CSDN云计算”微信公众号,实时掌握第一手云中消息!
CSDN作为国内最专业的云计算服务平台,提供云计算、大数据、虚拟化、数据中心、OpenStack、CloudStack、Hadoop、Spark、机器学习、智能算法等相关云计算观点,云计算技术,云计算平台,云计算实践,云计算产业资讯等服务。
以下为原文:
Spark作为Apache顶级的开源项目,项目主页见http:
//spark.apache.org。
在迭代计算,交互式查询计算以及批量流计算方面都有相关的子项目,如Shark、SparkStreaming、MLbase、GraphX、SparkR等。
从13年起Spark开始举行了自已的SparkSummit会议,会议网址见http:
//spark-summit.org。
Amplab实验室单独成立了独立公司Databricks来支持Spark的研发。
为了满足挖掘分析与交互式实时查询的计算需求,腾讯大数据使用了Spark平台来支持挖掘分析类计算、交互式实时查询计算以及允许误差范围的快速查询计算,目前腾讯大数据拥有超过200台的Spark集群,并独立维护Spark和Shark分支。
Spark集群已稳定运行2年,我们积累了大量的案例和运营经验能力,另外多个业务的大数据查询与分析应用,已在陆续上线并稳定运行。
在SQL查询性能方面普遍比MapReduce高出2倍以上,利用内存计算和内存表的特性,性能至少在10倍以上。
在迭代计算与挖掘分析方面,精准推荐将小时和天级别的模型训练转变为Spark的分钟级别的训练,同时简洁的编程接口使得算法实现比MR在时间成本和代码量上高出许多。
SparkVSMapReduce
尽管MapReduce适用大多数批处理工作,并且在大数据时代成为企业大数据处理的首选技术,但由于以下几个限制,它对一些场景并不是最优选择:
∙缺少对迭代计算以及DAG运算的支持
∙Shuffle过程多次排序和落地,MR之间的数据需要落Hdfs文件系统
Spark在很多方面都弥补了MapReduce的不足,比MapReduce的通用性更好,迭代运算效率更高,作业延迟更低,它的主要优势包括:
∙提供了一套支持DAG图的分布式并行计算的编程框架,减少多次计算之间中间结果写到Hdfs的开销
∙提供Cache机制来支持需要反复迭代计算或者多次数据共享,减少数据读取的IO开销
∙使用多线程池模型来减少task启动开稍,shuffle过程中避免不必要的sort操作以及减少磁盘IO操作
∙广泛的数据集操作类型
MapReduce由于其设计上的约束只适合处理离线计算,在实时查询和迭代计算上仍有较大的不足,而随着业务的发展,业界对实时查询和迭代分析有更多的需求,单纯依靠MapReduce框架已经不能满足业务的需求了。
Spark由于其可伸缩、基于内存计算等特点,且可以直接读写Hadoop上任何格式的数据,成为满足业务需求的最佳候选者。
应用Spark的成功案例
目前大数据在互联网公司主要应用在广告、报表、推荐系统等业务上。
在广告业务方面需要大数据做应用分析、效果分析、定向优化等,在推荐系统方面则需要大数据优化相关排名、个性化推荐以及热点点击分析等。
这些应用场景的普遍特点是计算