已阅读5页,还剩44页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
深入浅出Spark,2015年8月 研究院 王凤,目录,Spark简介,核心模块的实现,Spark应用,Spark与Hadoop的区别与联系,Spark总体流程,Spark应用库,大数据的电花火石,什么是Spark,Apache Sparkis a fast and general engine for large-scale data processing,Spark是UC Berkeley AMPLab开发的是一种计算框架,分布式资源工作交由集群管理软件(Mesos、YARN),a MapReduce-like cluster computing framework designed for low-latency iterative jobs and interactive use from an interpreter,Spark的发展历程,Spark代码贡献者每个月的增长曲线,2009:Spark诞生于伯克利大学 AMPLab 2010:开源 2013.6:Apache孵化器项目 2014.2:Apache顶级项目 目前为止,发布的最新版本为Spark1.4.1 Spark在最近6年内发展迅速,相较于其他大数据平台或框架而言,Spark的代码库最为活跃。,/,截止2015年6月 Spark的Contributor比2014年涨了3倍,达到730人; 总代码行数也比2014年涨了2倍多,达到40万行 Spark应用也越来越广泛,最大的集群来自腾讯8000个节点,单个Job最大分别是阿里巴巴和Databricks1PB,Spark特点,Logistic regression in Hadoop and Spark,高效,提供Cache机制来支持需要反复迭代的计算或者多次数据共享,减少数据读取的IO开销。 与Hadoop的MapReduce相比,Spark基于内存的运算比MR要快100倍;而基于硬盘的运算也要快10倍!,易用,Spark提供广泛的数据集操作类型(20+种),不像Hadoop只提供了Map和Reduce两种操作。 Spark支持Java,Python和Scala API,支持交互式的Python和Scala的shell。,与Hadoop无缝衔接,Spark可以使用YARN作为它的集群管理器 读取HDFS,HBase等一切Hadoop的数据,先进架构,Spark采用Scala语言编写,底层采用了actor model的akka作为通讯框架,代码十分简洁高效。 基于DAG图的执行引擎,减少多次计算之间中间结果写到Hdfs的开销。 建立在统一抽象的RDD(分布式内存抽象)之上,使得它可以以基本一致的方式应对不同的大数据处理场景。,提供整体 解决方案,以其RDD模型的强大表现能力,逐渐形成了一套自己的生态圈,提供了full-stack的解决方案。 主要包括Spark内存中批处理,Spark SQL交互式查询,Spark Streaming流式计算, GraphX和MLlib提供的常用图计算和机器学习算法。,One Stack to rule them all,Spark整体架构,Spark SQL,Spark Streaming,GraphX (graph),MLlib (machine learning),Mesos,YARN,S3,Spark,Standalone,存储层,资源调度层,计算层,工具层,Cassandra,Hbase,Tachyon,HDFS,Spark提供了多种高级工具: Shark SQL应用于即席查询(Ad-hoc query)、Spark Streaming应用于流式计算、 MLlib应用于机器学习、GraphX应用于图处理。 Spark可以基于自带的standalone集群管理器独立运行,也可以部署在Apache Mesos 和 Hadoop YARN 等集群管理器上运行。 Spark可以访问存储在HDFS、 Hbase、Cassandra、Amazon S3、本地文件系统等等上的数据,Spark支持文本文件,序列文件,以及任何Hadoop的InputFormat。,目录,Spark简介,核心模块的实现,Spark应用,Spark与Hadoop的区别与联系,Spark总体流程,Spark应用库,Spark组件 Driver Program (驱动程序) 是Spark 的核心组件 构建SparkContext(Spark应用的入口,它负责和整个集群的交互,创建需要的变量,还包含集群的配置信息等) 将用户提交的job转换为DAG图(类似数据处理的流程图) 根据策略将DAG图划分为多个stage,根据分区从而生成一系列tasks 根据tasks要求向资源管理器申请资源 提交任务并检测任务状态 Executor 真正执行task的单元,一个Worker Node上可以有多个Executor,Spark任务 应用程序:由一个driver program和多个job构成; job:由多个stage组成; stage:对应一个taskset, taskset:对应一组关联的相互之间没有shuffle依赖关系的task组成。 task:任务最小的工作单元,资源管理组件 YARN(通用) Master/Slave结构 Resource Manager(RM) 全局的资源管理器,负责系统的资源管理和分配 Node Manager(NM) 每个节点上的资源和任务管理器 ApplicationMaster(AM) 每个应用程序都有一个,负责任务的调度和监视,并与RM调度器协商为任务获取资源。 Standalone(Spark自带) Master/Slave结构 Master 类似于YARN的RM Worker 类似于YARN的NM,Spark核心概念,Spark任务提供多层分解的概念,Spark组件将用户的应用程序分解为内部执行任务并提供执行容器,资源管理为spark组件提供资源管理和调度。,Spark端到端流程,整体流程 Spark的Driver Program (简称Driver)包含用户的应用程序 Driver完成task的解析和生成 Driver向Cluster Manager(集群资源管理器)申请运行task需要的资源。 集群资源管理器为task分配满足要求的节点,并在节点按照要求创建Executor 创建的Executor向Driver注册。 Driver将spark应用程序的代码和文件传送给分配的executor executor运行task,运行完之后将结果返回给Driver或者写入HDFS或其他介质。,Spark流程,DriveProgram,Driver运行在Client,Driver运行在Worker,执行流程描述: 1.客户端把作业发布到Master 2.Master让一个Worker启动Driver,并将作业推送给Driver 3. Driver进程生成一系列task 4.Driver向Master申请资源 5.Master让调度的Worker启动Exeuctor 6. Exeuctor启动后向Driver注册。 7.Driver将task调度到Exeuctor执行。 8. Executor执行结果写入文件或返回Driver,执行流程描述: 1. .客户端启动后直接运行用户程序,启动Driver 2. Driver进程生成一系列task 3. Driver向Master申请资源 4. Master让调度的Worker启动Exeuctor 5. Exeuctor启动后向Driver注册。 6. Driver将task调度到Exeuctor执行。 7. Executor执行结果写入文件或返回Driver,Spark on Standalone,Spark流程,Master和Worker是standalone的角色,Driver和Executor是Spark的角色。 Master负责分配资源,分配Driver和Executor,让Worker启动driver和executor,只管理到executor层,不涉及任务; Driver负责生成task,并与executor通信,进行任务的调度和结果跟踪,不涉及资源。,Spark on YARN,Yarn Client,Yarn Cluster,Driver运行在AM(Application Master): 1.客户端把作业发布到YARN 2. RM为该job在某个NM上分配一个AM,NM启动AppMaster,App Master启动Driver。 3.AM启动后完成初始化作业。Driver生成一系列Task。 4.AM向RM申请资源,RM返回Executor信息。 5.AM通过RPC启动相应的SparkExecutor。 6.Driver向Executor分配task。 7. Executor执行结果写入文件或返回Driver,Driver运行在Cleint : 1. .客户端启动后直接运行用户程序,直接启动Driver。 2. Driver初始化并生成一系列Task 3.客户端将App Commands发布到YARN。 4. RM为该job在某个NM上分配一个AM 。 5.AM向RM申请资源,RM返回Executor信息。 6.AM通过RPC启动相应的SparkExecutor。 7.Exeuctor启动后向Driver注册。 8.Driver向Executor分配task。 9.Executor执行结果写入文件或返回Driver,Spark流程,与Standalone类似,不过YARN架构更通用,可以在同一集群部署Hadoop、Spark等。 RM、NM和AM是YARN的角色,Driver和Executor是Spark的角色。 RM负责资源分配,分配App Master和Executor;AM负责向RM申请资源,启动Driver和启动Executor Driver负责task的生成,task的调度和结果跟踪,目录,Spark简介,核心模块的实现,Spark应用,Spark与Hadoop的区别与联系,Spark总体流程,Spark应用库,核心模块,核心模块的实现,Spark的关键运算组件,Spark的核心组件包括RDD、Scheduler、Storage、Shuffle四部分: RDD是Spark最核心最精髓的部分,spark将所有数据都抽象成RDD。 Scheduler是Spark的调度机制,分为DAGScheduler和TaskScheduler。 Storage模块主要管理缓存后的RDD、shuffle中间结果数据和broadcast数据 Shuffle分为Hash方式和Sort方式,两种方式的shuffle中间数据都写本地盘,核心模块RDD整体介绍,RDD是什么?,RDDs are fault-tolerant, parallel data structures that let users explicitly persist intermediate results in memory, control their partitioning to optimize data placement, and manipulate them using a rich set of operators.,Resilient Distributed Datasets,RDD是Spark的基石,也是Spark的灵魂。 RDD是弹性分布式数据集,是只读的分区记录集合。 每个RDD有5个主要的属性: 一组分片(Partition):数据集的最基本组成单位 一个计算每个分片的函数:对于给定的数据集,需要做哪些计算 依赖(Dependencies):RDD的依赖关系,描述了RDD之间的lineage preferredLocations(可选):对于data partition的位置偏好 partitioner(可选) - 对于计算出来的数据结果如何分发,核心模块的实现,作用于RDD上的Operation分为转换(transformantion)和动作(action)。 Spark中的所有“转换”都是惰性的,在执行“转换”操作,并不会提交Job,只有在执行“动作”操作,所有operation才会被提交到cluster中真正的被执行。这样可以大大提升系统的性能。,RDD拥有的操作比MR丰富的多,不仅仅包括Map、Reduce操作,还包括右图的filter、sort、join、save、count等操作,所以Spark比MR更容易方便完成更复杂的任务。,RDD部分Operation,核心模块RDD操作,核心模块的实现,核心模块RDD持久化,默认情况下,每一个转换过的RDD都会在它之上执行一个动作时被重新计算。 如果rdd只被使用一次或者很少次,不需要持久化。如果rdd被重复使用或者计算其代价很高,才考虑持久化。另外,shuffle后生成的rdd尽量持久化,因为shuffle代价太高。,是否持久化,使用 persist方法(或者cache方法),持久化一个RDD在内存或磁盘中。 cache()过程是将RDD persist在内存里,persist()操作可以为RDD指定StorageLevel。,持久化方法,RDD被缓存后,Spark将会在集群中,保存相关元数据,下次查询这个RDD时,它将能更快速访问,不需要计算。 如果持久化无谓的RDD,会浪费内存(或硬盘)空间,反而降低系统整体性能,持久化效果,核心模块的实现,核心模块RDD依赖关系,RDD只能基于在稳定物理存储中的数据集和其他已有的RDD上执行确定性操作来创建。 能从其他RDD通过确定操作创建新的RDD的原因是RDD含有从其他RDD衍生(即计算)出本RDD的相关信息(即Lineage) Dependency代表了RDD之间的依赖关系,即血缘(Lineage),分为窄依赖和宽依赖。,窄依赖: 一个父RDD最多被一个子RDD用 在一个集群节点上管道式执行。 比如map、filter、union等;,宽依赖: 指子RDD的分区依赖于父RDD的所有分区,这是因为shuffle类操作要求所有父分区可用。 比如groupByKey、reduceByKey、 sort、partitionBy等;,核心模块的实现,注意:一个RDD对不同的父节点可能有不同的依赖方式,可能对父节点1是宽依赖,对父节点2是窄依赖。,核心模块RDD依赖关系,根据RDD依赖关系的不同,Spark将每 一个job分为不同的stage,stage之间 的依赖关系形成了DAG图。,窄依赖 Spark将其尽量划分在同一个stage中,因为它们可以进行流水线计算。,宽依赖 往往意味着shuffle操作,这也是Spark划分stage的主要边界。,一个Stage的开始就是从外部存储或者shuffle结果中读取数据;一个Stage的结束就是发生shuffle或者生成结果时。 由于rdd F是rdd G的宽依赖,所以将F与G分别划分到不同的stage,但是B是G的窄依赖(B的每个分区只被使用一次),所以B与G还保持在一个stage。 由于rdd A是rdd B的宽依赖,所以A和B划分在不同的stage 在图中Stage2中,从map到union都是窄依赖,在一个stage,这两步操作可以形成一个流水线操作,通过map操作生成的partition可以不用等待整个RDD计算结束,而是继续进行union操作,这样大大提高了计算的效率。,核心模块的实现,核心模块RDD容错机制,宽/窄依赖的概念不止用在stage划分中,对容错也很有用。,核心模块的实现,核心模块Scheduler整体介绍,核心模块的实现,Scheduler模块作为Spark最核心的模块之一,充分体现了Spark与MapReduce的不同之处,体现了Spark DAG思想的精巧和设计的优雅。 Scheduler模块分为两大主要部分,DAGScheduler和TaskScheduler。,核心模块Scheduler之DAGScheduler,核心模块的实现,对应的任务,DAGScheduler把一个spark作业转换成成stage的DAG(Directed Acyclic Graph有向无环图),根据RDD和stage之间的关系,找出开销最小的调度方法,然后把stage以TaskSet的形式提交给TaskScheduler。,核心模块Scheduler之TaskScheduler,核心模块的实现,TaskScheduler模块用于与DAGScheduler交互,负责任务的具体调度和运行。 任务调度模块基于两个Trait:TaskScheduler和 SchedulerBackend,TaskScheduler:定义了任务调度模块的对外接口(submitTasks等),供DAGScheduler调用。 TaskSchedulerImpl是TaskScheduler的具体实现,完成资源与任务的调度。 SchedulerBackend封装了各种backend,用于与底层资源调度系统交互,配合TaskSchedulerImpl实现任务执行所需的资源分配。 SchedulableBuilder负责taskset的调度。 TaskSetManager负责一个taskset中task的调度。,核心模块TaskScheduler之SchedulableBuilder,SchedulableBuilder主要负责TaskSet的调度。 核心接口是:getSortedTaskSetQueue,该接口返回排序后的TaskSetManager队列,该接口供TaskSchedulerImpl调用。 SchedulableBuilder维护的是一颗树,根节点是rootpool,叶子节点是TaskSetManager对象。,核心模块的实现,核心模块TaskScheduler之TaskSetManager,TaskSetManager主要负责一个taskset中task的调度和跟踪。 核心接口是:resourceOffer,该接口根据输入的资源 在taskset内部调度一个task,主要考虑因素是Locality,该接口供TaskSchedulerImpl调用。,Locality,NODE_LOCAL,PROCESS_LOCAL,RACK_LOCAL,NO_PREF,ANY,根据task的preferredLocations得到每个task的Locality level。 resourceOffe根据资源和maxLocality(最大宽松的本地化级别)调度task。 最终调度task的allowedLocality是该TaskSet允许的Locality(最大不超过输入的maxLocality) ,该TaskSet允许的Locality最初默认值是最严格本地化级别。如果lastLaunchTime(最近一次该taskset发布task的时间)与当前时间差超时,会放宽locality的要求,选择低一优先级的locality。 在allowedLocality范围内,优先调度更local的task,也就是最好在同个进程里,次好是同个node(即机器)上,再次是同机架。在allowedLocality范围内,在该taskset没有找到task,那么返回None。(上一层调用会继续查询其他taskset是否有满足指定locality Level的task),优先级降低,核心模块的实现,核心模块TaskScheduler之SchedulerBackend,SchedulerBackend是trait,封装了多种backend,用于与底层资源调度系统交互(如mesos/YARN),配合TaskScheduler实现具体任务执行所需的资源分配。 核心接口是: reviveOffers,与TaskSchedulerImpl交互完成task的Launch。 SchedulerBackend只关心资源,不关心task。提交资源供TaskSchedulerImpl分配task。,ReviveOffers的实现 将空闲资源(freeCore、executor、host)以workerOffer List形式组织。 调用TaskSchedulerImpl的resourceOffers() ,为workerOffer List空闲资源分配相应的task 。 调用launchTasks,向executorActor发送LaunchTask消息,核心模块的实现,核心模块TaskScheduler之TaskSchedulerImpl,TaskSchedulerImpl实现了TaskScheduler Trait,实现了资源和任务的调度。 核心接口是: ResourceOffers,根据提供的资源列表offers,返回满足条件的tasks,供SchedulerBackend 调用。 资源和任务调度的核心思想:资源驱动。即当有空闲资源时,查看是否有task需要运行(遵循Locality),ResourceOffers的实现 将输入的offers( SchedulerBackend返回的 workerOffer List,即可用的空闲资源 )添加到可用的资源类表(加入到不同级别的资源列表,比如executor、host、rack)。 将offers shuffle一下,调整空闲资源的顺序,避免前面的空闲资源一直被分配任务。 调用rootPool的getSortedTaskSetQueue获取需要运行的TaskSet(SchedulableBuilder提供的接口) 对每个TaskSet循环处理(每个TaskSet都有一个TaskSetManager),调用TaskSetManager的resourceOffer给输入的空闲资源寻找task。 返回为offers查找的tasks,submitTasks流程,核心模块的实现,核心模块TaskScheduler,TaskScheduler是trait,用于与DAGScheduler交互,主要负责任务的调度和运行,无具体实现,仅仅为对外统一接口。 核心接口是: submitTasks,具体实现见TaskSchedulerImpl 中的submitTasks 。 接收DAGScheduler的Task请求,分发Task到集群运行并监控运行状态,并将结果以event的形式汇报给DAGScheduler 。,SchedulableBuilder,TaskSetManager,SchedulerBackend,Task调度与低层的资源管理器分离,仅仅根据提供的资源调度task,不关心资源的来源。 资源调度仅仅关心资源,与多种不同的资源调度系统(YARN/MESOS/Standalone)交互,获得空闲资源。 TaskSchedulerImp在接收到submitTasks时,从资源调度系统中获取到空闲资源,然后将空闲资源提交到到task调度系统,调度满足locality要求的task,并将task launch到executor。,资源调度,Task调度,TaskScheduler (TaskSchedulerImpl),核心模块的实现,核心模块Storage,核心模块的实现,Storage模块主要分为两层: 通信层:storage模块采用的是master-slave结构来实现通信层,master和slave之间传输控制信息、状态信息,这些都是通过通信层来实现的。 存储层:storage模块需要把数据存储到disk或是memory上面,有可能还需replicate到远端,这都是由存储层来实现和提供相应接口。 Storage模块提供了统一的操作类BlockManager,外部类与storage模块打交道都需要通过调用BlockManager相应接口来实现。 Storage模块存取的最小单位是数据块(Block),Block与RDD中的Partition一一对应,所以所有的转换或动作操作最终都是对Block进行操作。,数据写入过程分析 1. RDD的iterator调用CacheManager的getOrCompute函数 2.CacheManager调用BlockManager的put接口来写入数据 3.BlockManager根据输入的storageLevel来确定是写内存还是写硬盘 4.通知BlockManagerMaster有新的数据写入,在BlockManagerMaster中保存元数据 5.将写入的数据与其它slave worker进行同步(一般来说在本机写入的数据,都会另先一台机器来进行数据的备份,即replicanumber=1),核心模块Storage,核心模块的实现,通 信 层,Driver和Executor都有一个BlockManager,里面都包含了BlockManagerMasterActor和BlockManagerSlaveActor BlockManagerMasterActor类主要负责控制消息和状态之间的传递和处理。传递的消息包括Register、StorageStatus、updateBlockInfo、getLocation等,消息处理包括返回或更新block以及executor的元数据信息,并调用BlockManagerSlaveActor(ref )与Executor通信。 BlockManagerSlaveActor类传递的消息主要是removeRdd、removeBlock等消息,消息处理主要是对本executor进行rdd和block的删除操作。,存储 层,BlockManager包含了DiskStore类和MemoryStore类 DiskStore:每一个block都被存储为一个file,通过计算block id的hash值将block映射到文件中。 MemoryStore:内部维护了一个hash map来管理所有的block,以block id为key将block存放到hash map中。,核心模块Shuffle,核心模块的实现,hash方式,Sort方式,shuffle不排序,效率高 生成MXR个shuffle中间文件,一个分片一个文件 产生和生成这些中间文件会产生大量的随机IO,磁盘效率低 shuffle时需要全部数据都放在内存,对内存消耗大 适合数据量能全部放到内存,reduce操作不需要排序的场景,shuffle需要排序 生成M个shuffle中间数据文件,一个Map所有分片放到一个数据文件中,外加一个索引文件记录每个分片在数据文件中的偏移量 shuffle能够借助磁盘(外部排序)处理庞大的数据集 数据量大于内存时只能使用Sort方式,也适用于Reduce操作需要排序的场景,shuffle 中Map任务产生的结果会根据所设置的partitioner算法填充到当前执行任务所在机器的每个桶中。 Reduce任务启动时时,会根据任务的ID,所依赖的Map任务ID以及MapStatus从远端或本地的BlockManager获取相应的数据作为输入进行处理。 Shuffle数据必须持久化磁盘,不能缓存在内存。,目录,Spark简介,核心模块的实现,Spark应用,Spark与Hadoop的区别与联系,Spark总体流程,Spark应用库,应用库整体介绍,Spark应用库,spark之上提供了四种应用库: Spark SQL 是为处理结构化数据而设计的模块 Spark Streaming 可以很容易地创建可扩展和容错性的流式应用 MLlib 是Spark的可扩展机器学习库 GraphX 是Spark的并行图计算API,应用库Spark SQL,Spark应用库,集成性 Spark程序可以与SQL查询无缝衔接,统一的数据访问方式 可以从多种数据源加载和查询数据,与Hive兼容性 可以在现有的数据仓库上运行不做任何修改的Hive查询,支持标准连接 支持JDBC和ODBC 连接,应用库Spark Streaming,Spark应用库,Spark Streaming是建立在Spark上的实时计算框架,通过它提供丰富的API、基于内存的高速执行引擎,用户可以结合流式、批处理和交互试查询应用。 Saprk的低延迟执行引擎(100MS+)可以用于实时处理 相比于strom(基于Record),RDD数据更容易做容错。 可以与kafka,Flume,ZeroMQ等进行数据源的对接 小批量处理的方式使得它可以同时兼容批量和实时数据处理的逻辑和算法。方便了一些需要历史数据和实时数据联合分析的特定应用场合。,应用库Spark Streaming,Spark应用库,Spark Streaming基本原理是将流数据分成小的时间片段(几秒),以类似批处理方式来处理这部分小数据。 处理流程: Spark Streaming把实时输入数据流以时间片t (如1秒)为单位切分成块 Spark Streaming会把每块数据作为一个RDD,并使用RDD操作处理每一小块数据 每个块都会生成一个Spark Job处理 最终结果也返回多块,使用Spark Streaming编写的程序与编写Spark程序非常相似 在Spark程序中,主要通过操作RDD(Resilient Distributed Datasets弹性分布式数据集)提供的接口,如map、reduce、filter等,实现数据的批处理。 而在Spark Streaming中,则通过操作DStream(表示数据流的RDD序列)提供的接口,这些接口和RDD提供的接口类似。,应用库MLlib和GraphX,Spark应用库,MLlib 是Spark对常用的机器学习算法的实现库,同时包括相关的测试和数据生成器。MLlib 目前支持四种常见的机器学习问题:二元分类,回归,聚类以及协同过滤,同时也包括一个底层的梯度下降优化基础算法。,易用性:可以使用JAVA、Scala、Python接口 高性能:比MR快100+倍 快速部署:可以运行在已经安装好的Hadoop 2.0 集群上,GraphX是一个分布式图处理框架,基于Spark平台提供对图计算和图挖掘简洁易用的而丰富多彩的接口,极大的方便了大家对分布式图处理的需求。,灵活性:图表和集合可以无缝衔接 高性能:比其他图处理软件处理快 算法种类多:提供更多的图算法,目录,Spark简介,核心模块的实现,Spark应用,Spark与Hadoop的区别与联系,Spark总体流程,Spark应用库,spark是对MapReduce计算模型的改进,可以说没有HDFS,MapReduce,就没有spark.,Spark与Hadoop的联系,Spark可以使用YARN作为它的集群管理器,并且可以处理HDFS的数据。这对于已经部署Hadoop集群的用户特别重要,毕竟不需要做任何的数据迁移就可以使用Spark的强大处理能力。,Hadoop,Spark,MapRedcue由Map和Reduce两个阶段,并通过shuffle将两个阶段连接起来的。 但是套用MapReduce模型解决问题,不得不将问题分解为若干个有依赖关系的子问题,每个子问题对应一个MapReduce作业,最终所有这些作业形成一个DAG。,Spark是通用的DAG框架,可以将多个有依赖关系的作业转换为一个大的DAG。 核心思想是将Map和Reduce两个操作进一步拆分为多个元操作,这些元操作可以灵活组合,产生新的操作,并经过一些控制程序组装后形成一个大的DAG作业。,框架,在DAG中,由于有多个MapReduce作业组成,每个作业都会从HDFS上读取一次数据和写一次数据(默认写三份),即使这些MapReduce作业产生的数据是中间数据也需要写HDFS。 这种表达作业依赖关系的方式比较低效,会浪费大量不必要的磁盘和网络IO,根本原因是作业之间产生的数据不是直接流动的,而是借助HDFS作为共享数据存储系统。,在Spark中,使用内存(内存不够使用本地磁盘)替代了使用HDFS存储中间结果。 对于迭代运算效率更高。,中间结果存储方式,Spark与Hadoop的区别,中间结果是指reduce操作后生成的结果,Hadoop只提供了Map和Reduce两种操作 所有的作业都得转换成Map和Reduce的操作,Spark提供很多种的数据集操作类型 比如Transformations 包括map, filter, flatMap, sample, groupByKey, reduceByKey, union, join, cogroup, mapValues,sort,partionBy等多种操作类型,还提供actions操作包括Count,collect, reduce, lookup, save等多种。 这些多种多样的数据集操作类型,给开发上层应用的用户提供了方便。,操作模型,Hadoop就是唯一的Data Shuffle一种模式,spark用户可以命名,物化,控制中间结果的存储、分区等,编程方式更灵活,spark使用scala语言,更简洁高效 spark对机器学习算法,图计算能力有很好的支持。,Hadoop对迭代计算效率低,其他,Hadoop,Spark,Spark与Hadoop的区别,离线大规模分析处理,Hadoop适用的场景基本上都适合 ( 在只有map操作或者只有一次reduce操作的场景下,Spark比Hadoop的优势不明显) 对于迭代计算比Hadoop有更大的优势,编程模型,应用场景,总的来说,Spark采用更先进的架构,使得灵活性、易用性、性能等方面都比Hadoop更有优势,有取代Hadoop的趋势,但其稳定性有待进一步提高。,*详情见附录,Hadoop无法缓存数据集,spark的60%内存用来缓存RDD,对于缓存后的rdd进行操作,节省IO,效率高,缓存,目录,Spark简介,核心模块的实现,Spark应用,Spark与Hadoop的区别与联系,Spark总体流程,Spark应用库,Spark应用场景,适用场景,Spark是基于内存的迭代计算框架,适用于需要多次操作特定数据集的应用场合。 需要反复操作的次数越多,所需读取的数据量越大,受益越大,数据量小但是计算密集度较大的场合,受益就相对较小,由于RDD的特性,Spark不适用那种异步细粒度更新状态的应用。 对于增量修改的应用模型不适合。,总的来说Spark的适用面比较广泛且比较通用。,不适用场景,目前大数据在互联网公司主要把Spark应用在广告、报表、推荐系统等业务上。 在广告业务方面需要大数据做应用分析、效果分析、定向优化等 在推荐系统方面则需要大数据优化相关排名、个性化推荐以及热点点击分析等。 这些应用场景的普遍特点是计算量大、效率要求高。Spark恰恰满足了这些要求。,Spark在互联网界的使用,Spark在移动网优测试结果,统一采集平台耗时最长时间的汇总任务tpa_mr_qoe_celladj_hour.sh,前端耗时最长时间的任务C/S模式下,按模板查询,导出24小时LTE性能数据(小区级指标数据),hive性能比informix性能提升了58%;spark性能比informix性能提升了140%,hive比informix性能提升2倍。spark比informix性能提升6倍。,Spark在移动网优测试结果分析,根据spark适合批量处理整个或大部分数据集的特点,重新设计数据模型 问题: 当前业务是从一张大表中筛选出满足指定时间条件的记录进行处理(从上亿条数据集中筛选出几十万条记录后进行处理),spark会将整个大表读出来,然后筛选出满足要求的记录,按照目前的实现方式,比较浪费IO损失性能,没有充分利用Spark的优势。 措施: 后续应该重新设计数据分布,按照汇总处理粒度存储文件,并周期性合并文件。如此设计可以充分利用Spark的机制,提升性能。比如汇总小时级别的数据,就可以考虑1个小时一个文件,一天或者一周整合一下文件。,优化spark本身的配置参数 问题: 由于测试时间紧张,在默认配置下进行的测试,没有对Spark参数进行优化 措施: 根据集群的配置情况以及系统的负载情况对Spark参数进行优化,进一步提升系统性能,根据Spark适用于迭代场景的特点,重新设计业务处理流程和sql编写 问题: 原有的业务处理逻辑是根据数据库的特点,建立多张临时表,分级分步多次汇总完成最终的任务,spark对中间过程的每步操作都看作一个job,没有使用到迭代的特性。 措施: 根据spark适用场景重新设计处理流程和sql编写,使得中间处理数据被迭代使用,提升效率,本次spark测试结果是在没有修改原有处理逻辑的基础上进行了spark的测试,提升了部分性能,后续如果网管系统使用Spark需要根据其本身特
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 隧道工程施工质量验收与控制方案
- 结构工程施工技术与优化方案
- 铁矿分选建设项目施工方案
- 现代商贸城提升改造项目节能评估报告
- 2025至2030中国汽车运动行业项目调研及市场前景预测评估报告
- 电池FPC组件生产项目建设工程方案
- 生产领班岗位职责说明书
- 印刷车间物料领用流程初级工规范
- 客户投诉处理工作总结及改进措施
- 分布式光伏发电项目技术方案
- 保险市场调研报告
- 财务管理中的成本与效益
- 金融信息安全培训
- 老年人营养与健康知识讲座
- 国网公司2021年电网资产统一身份编码物联网标签制作安装指导手册增量分册
- NB-T 47013.8-2012(JB-T 4730.8) 4730.8 承压设备无损检测 第8部分:泄漏检测
- 文言文阅读训练:黄宗羲《续师说》(附答案解析与译文)
- 儿童音乐剧《雪孩子》剧本
- 施工现场环境因素识别、评价及环境因素清单、控制措施
- DB23∕T 2583-2020 固体矿产勘查放射性检查技术要求
- ZZ023 艺术设计赛题-2023年全国职业院校技能大赛拟设赛项赛题完整版(10套)
评论
0/150
提交评论