Spark学习
文章平均质量分 70
竹落
这个作者很懒,什么都没留下…
展开
-
(一) spark源码理解之SparkContext
好久没更新博客了,过年在家变懒了,哈哈。。继续坚持写博客,刚开始接触Spark是在学校举行的一次讲座上,在那之前对于Spark一无所知,听完讲座后觉得Spark在这个大数据时代必然会有它的用武之地,刚好又碰上师兄的毕业设计用到了Spark,于是开始尝试了解Spark,学习Spark的过程是比较艰辛且孤独的,因为身边懂Spark的人比较少,网上资源也不尽详细,但是我仍然收获颇多,可能接下来关于Spa原创 2015-03-04 18:34:58 · 2171 阅读 · 0 评论 -
(七)Spark源码理解之TaskScheduler----part1
TaskScheduler是Spark的任务调度器,属于低级调度器,一个SparkContext只有一个TaskScheduler,它负责接收DAGScheduler为每个stage生成的任务集,接着将任务集分配到集群中运行,再将结果返回给DAGScheduler,TaskScheduler通过TaskSchedulerImpl实现,因此了解了TaskSchedulerImpl就可以了解TaskS原创 2015-04-14 17:46:09 · 594 阅读 · 0 评论 -
(七)Spark源码理解之TaskScheduler----part4
resourceOffers():该方法是TaskSchedulerImpl的核心所在,实现将任务指定给对应的从节点中的executor,其主要思路可以概述为:首先将获取的每个executor的资源,组成组成WorkerOffer序列,然后将其打乱,接着对每个任务集进行操作,首先判断第一个executor,如果它的CPU个数符合任务集中的任务所需,则将该任务集中挂在该executor下的任务取原创 2015-04-20 17:52:11 · 474 阅读 · 0 评论 -
(七)Spark源码理解之TaskScheduler----part2
2. TaskSetManagerTaskSetManager任务集管理器,负责管理为stage生成的任务集,是任务调度中比较重要的一个部分,包括如何查找任务,对TaskSchedulerImpl的任务分配做出回应,它有几个重要的变量:pendingTasksForExecutor---在一个executor上执行的任务,用HashMap存储,key值为executor的id,value为原创 2015-04-15 17:50:07 · 405 阅读 · 0 评论 -
(七)Spark源码理解之TaskScheduler----part5
3.4 SchedulerBackend的不同实现方式Spark的部署模式不同决定了其资源管理方法也会有所不同,即SchedulerBackend也会有不同的实现方式,首先介绍SchedulerBackend的两种主要的实现方式或者说子类。3.4.1 LocalBackendLocalBackend属于本地模式下的调度后台支撑服务,所谓本地模式我理解为只有一个executor,exec原创 2015-04-24 17:27:18 · 677 阅读 · 0 评论 -
(七)Spark源码理解之TaskScheduler----part3
3.TaskSchedulerImpl具体实现TaskScheduler,是TaskScheduler的子类,也是整个任务实现过程的核心,在对这部分讲述之前介绍几个比较重要的变量:taskIdToTaskSetId:HashMap容器,key值为task的Id,value值为TaskSet的Id;taskIdToExecutorId:HashMap容器,key值为task的Id,val原创 2015-04-16 18:01:04 · 442 阅读 · 0 评论 -
(九)Spark应用程序在不同部署模式下的运行方式
我们知道Spark可以运行在不同模式下,这样的话当我们提交程序给Spark集群时就要修改相应的参数设置,在Spark学习的最后,我总结了几种常用模式下的运行命令(在Linux下运行) PS:下文提到过的jar包是这样来的,我是在Windows下的eclipse中用scala语言编写的程序,所以我把程序导出为一个jar包,之后再传到Linux中相应的目录下yarn模式:./bin/spar原创 2015-10-16 17:41:12 · 1050 阅读 · 0 评论 -
Spark---ending
哈哈。。。终于把Spark这部分的源码写完了,讲得这几个部分中当然会有很多不足或者说不正确的地方,因此希望各位网友积极指正。。。学习Spark纯属个人兴趣爱好,学习的过程中也是很枯燥的,特别是在阅读源码的过程中,同时因为Spark刚刚兴起,关于Spark的书籍,资料并不是很齐全,因此在学习的过程中碰到问题就只能从网上寻找帮助了,不过,整个过程我还是收获颇多,至少,在以后的学习过程中我可以保持踏实,原创 2015-10-23 17:23:40 · 459 阅读 · 0 评论 -
(七)Spark源码理解之TaskScheduler----part6
恩。。。。由于最近这段时间都在实习以及找工作,因此就将博客给落下了,现在继续将spark的部分"搬上"。。PS:虽然我自己也忘得差不多了。。4.ExecutorExecutor类完成任务的装载,任务的运行等功能,它有个变量为ExecutorSource对象,这个对象主要实现注册executor的各项资源,在此省略不讲,此外Executor类有个核心方法launchTask(),该方原创 2015-10-12 17:35:34 · 541 阅读 · 0 评论 -
(八)Spark源码理解之DAGScheduler---part1
DAGScheduler是Spark中另一比较重要的部分,它属于高级调度,主要实现stage的划分,接着生成整个DAG图,以及如何为每个stage生成任务集,并且将任务集提交给TaskScheduler,基于这两点我将对DAGScheduler的源码展开阅读,下图是DAGScheduler的简单构成图:在讲述DAGScheduler之前,先介绍DAGScheduler中几个重要的变原创 2015-10-13 17:48:17 · 542 阅读 · 0 评论 -
(八)Spark源码理解之DAGScheduler---part2
承接上篇博文所述,接下来我对getShuffleMapStage以及newStage这两个方法的代码进行主要的介绍getShuffleMapStage:该方法主要是通过调用newOrUsedStage生成stageprivate def getShuffleMapStage(shuffleDep: ShuffleDependency[_,_], jobId: Int): Stage =原创 2015-10-14 17:39:51 · 443 阅读 · 0 评论 -
(八)Spark源码理解之DAGScheduler---part3
讲讲自己对于ShuffleMapTask和ResultTask的区别 简单来说两者都是Task类的子类,不同的是操作类型,前者的操作类型是MapStaus类,是在shuffle map stage生成的,后者的操作类型是数据,是在final stage生成的,多说一句,所谓的Spark基于内存存储中间数据应该就是存储MapStatus(分区的映射状态),鉴于它们都是Task类的子类,因此原创 2015-10-15 17:39:36 · 490 阅读 · 0 评论 -
(六)Spark源码理解之RDD----part5
4.checkpointcheckpoint解释为检查点,RDD的源代码中提到了这个概念,我是比较模糊的,也不想深究这个,暂且理解为将RDD缓存到文件中,这样的话和persist,或者cache的意思差不多,不过checkpoint的作用是用来支持容错,避免血系过长,当血系图过长时,就将RDD缓存,然后清除依赖,具体的网上也有详细介绍此外,Spark中有个PairRDDFunctions类原创 2015-04-13 17:32:51 · 791 阅读 · 0 评论 -
(六)Spark源码理解之RDD----part4
3.2 动作Spark中也有相应的动作函数,这些动作即可生成我们所需的最终结果,也是因为这些动作才真正触发了Spark的调度3.2.1 foreach foreach()函数是对RDD中的每个元素调用函数,结果为Unit,即空类型如:valdisData1=sc.parallelize(Array(1,2,3,4),2)d.foreach(println)结果:1,原创 2015-04-10 17:47:21 · 437 阅读 · 0 评论 -
(二)spark源码理解之SparkEnv
SparkEnv是Spark中比较重要的一部分,它构成了Spark赖以生存的环境,只有这个环境搭建好了,Spark才能正常运行1.创建安全管理器securityManager,它主要负责spark在不同部署模式下的安全工作,包括认证(网络连接时需要,它有口令认证方式,认证的构成部分包括请求的URL,请求端口,请求协议等等),和密钥的生成(在yarn部署模式下,通过generateSecretK原创 2015-03-05 17:26:04 · 1144 阅读 · 0 评论 -
(四)Spark源码理解之BlockManager---part1
RDD是分布式数据集,它将数据分为一个个的块,因此需要块管理器(BlockManager),所谓的块即分区,块管理器属于Spark的存储部分,顾名思义,它主要负责管理块(分区)的存储位置,值,状态等等1.BlockManagerMaster主节点上的BlockManager,它有个Actor消息传递模型,定义了消息传递重试的次数,重试的间隔时间,便于之后的各种操作,比如注册原创 2015-03-07 17:57:32 · 574 阅读 · 0 评论 -
(三)spark源码理解之MapOutTracker
MapOutTracker主要用来存放shuffle map stage的输出,因为主从节点的MapOutTracker实现机制不一样,所以它是一个抽象类,主要维护和记录map的状态,添加或移除shuffle,以及从节点从主节点上获取相应shuffle的状态 1.MapOutTrackerMaster原创 2015-03-06 17:26:19 · 1358 阅读 · 0 评论 -
(五)Spark源码理解之BroadcastManager
1.BroadcastManager,广播变量,是Spark实现分布式并行的一个重要特点之一,当一个stage读取了广播变量后,其他的stage也可以对该变量进行读写,从而加快数据处理速度BroadcastManager有两种类型,一种为:HttpBroadcast,一种为TorrentBroadcast,Spark源码是以HttpBroadcast为例,所以我以HttpBroadcast为例原创 2015-03-20 18:05:30 · 933 阅读 · 0 评论 -
(四)Spark源码理解之BlockManager---part5
块存于内存的时候有个统一的数据结构此外,若块进行了反序列化,则用ArrayBuffer来存放,否则用 ByteBuffer以putValues()为例override def putValues(//putValues将数据块进行反序列化存储 blockId: BlockId, values: ArrayBuffer[Any],/原创 2015-03-17 18:01:24 · 622 阅读 · 0 评论 -
(四)Spark源码理解之BlockManager---part2
2.BlockManagerMasterActorBlockManagerMasterActor是主节点上的actor模型(消息传递模型),用来跟踪所有块管理器的信息,创建BlockManagerMatser时需要用到,它有比较重要的三个变量:blockManagerInfo:HashMap容器,key值为BlockManagerID对象,value值为Bolck信息(即BlockMana原创 2015-03-09 17:20:50 · 472 阅读 · 0 评论 -
(六)Spark源码理解之RDD
RDD看起来好像很抽象,但我的理解就是类似于我们自己写一个java程序,会编写一个数据模型的类来组织我们的数据一样,RDD其实就是Spark中的数据模型,也就是Spark自己编写的类,RDD有三个必不可少的部分:(1)RDD对其他RDD的依赖,即血系图;(2)分区列表;(3)针对分区的计算函数;(1)RDD对其他RDD的依赖1.1 RDD中persist和unpersist方法实质上就是往原创 2015-03-21 17:45:25 · 389 阅读 · 0 评论 -
(四)Spark源码理解之BlockManager---part3
2.4 BlockStatus存储了Block块的存储级别(是内存存储还是磁盘存储等),内存,磁盘以及tachyon的大小BlockManagerMasterActor有很多比较重要的方法,正是由于这些方法才使得主节点可以管理块(分区)private def removeRdd(rddId: Int): Future[Seq[Int]] = {//返回的是一个Seq[Int原创 2015-03-10 18:08:26 · 680 阅读 · 0 评论 -
(六)Spark源码理解之RDD----part1
(3)针对分区的计算函数接下来讲讲RDD的各种函数操作,正是有了这些函数才使得RDD能完成各自功能3.1.转换 RDD中有各种转换操作,正是因为有了这些转换操作,我们才能实现各种应用程序,正如之前我们所说RDD实质上就是一个Java类,因此它的各种转换操作其实也就是RDD类中的方法,转换操作其实就是从RDD类生成了其他的类,如MappedRDD,FilteredRDD类等等3原创 2015-03-22 18:33:17 · 506 阅读 · 0 评论 -
(六)Spark源码理解之RDD----part2
3.1.3 filterFilter()函数也是对RDD中的每一个元素都调用了f函数,若函数值为真,则保留该元素,最终保留的元素构成一个新集合,新生成了FilteredRDD,也是一对一的操作,如:valdisData=sc.parallelize(Array(1,2,3,4,5),2)vald1=disData.filter(s=>(s>2)).collect原创 2015-03-30 17:50:16 · 551 阅读 · 0 评论 -
(六)Spark源码理解之RDD----part3
3.1.9 cartesiancartesian()函数返回RDD和其他RDD的笛卡尔乘机,生成新的RDD,即CartesianRDD如:valdisData1=sc.parallelize(Array(1,2,3),2) valdisData2=sc.parallelize(Array(2,3),2)vald=disData1.cartesian(dis原创 2015-03-31 17:36:13 · 646 阅读 · 0 评论 -
Windows7+Pycharm搭建Spark的开发环境
一般,我都会在Eclipse中安装Scala插件,用Scala语言编写Spark程序,之后将程序导出为JAR文件,再复制到Spark平台上运行,因为XX原因,现在想尝试用python写Spark程序,于是在Windows+Pycharm的环境下搭建了相应的开发环境首先,安装py4j(虽然其实我并不知道这是个什么东东,但是,因为没有安装它搞得一直出问题,所以啊。。。谨慎。。)本来我最开始是打原创 2016-03-30 19:23:00 · 9016 阅读 · 1 评论