虽然MapReduce提供了对数据访问和计算的抽象,但是对于数据的复用就是简单的将中间数据写到一个稳定的文件系统中(例如HDFS),所以会产生数据的复制备份,磁盘的I/O以及数据的序列化,所以在遇到需要在多个计算之间复用中间结果的操作时效率就会非常的低...在许多迭代式算法(比如机器学习、图算法等)和交互式数据挖掘中,不同计算阶段之间会重用中间结果,即一个阶段的输出结果会作为下一个阶段的输入。...RDD提供了一个抽象的数据模型,让我们不必担心底层数据的分布式特性,只需将具体的应用逻辑表达为一系列转换操作(函数),不同RDD之间的转换操作之间还可以形成依赖关系,进而实现管道化,从而避免了中间结果的存储...在部分分区数据丢失时,Spark可以通过这个依赖关系重新计算丢失的分区数据,而不是对RDD的所有分区进行重新计算。...可以看到这个DAG中只reduceByKey操作是一个宽依赖,Spark内核会以此为边界将其前后划分成不同的Stage。
在实际应用中,存在许多迭代式算法和交互式数据挖掘工具,这些应用场景的共同之处在于不同计算阶段之间会重用中间结果,即一个阶段的输出结果会作为下一个阶段的输入。...而 RDD 提供了一个抽象的数据架构,从而让开发者不必担心底层数据的分布式特性,只需将具体的应用逻辑表达为一系列转换处理,不同 RDD 之间的转换操作形成依赖关系,可以实现管道化,从而避免了中间结果的存储...RDD 采用了惰性调用,即在 RDD 的执行过程中,所有的转换操作都不会执行真正的操作,只会记录依赖关系,而只有遇到了行动操作,才会触发真正的计算,并根据之前的依赖关系得到最终的结果。 ?...因此,在进行数据恢复时,窄依赖只需要根据父 RDD 分区重新计算丢失的分区即可,而且可以并行地在不同节点进行重新计算。...而对于宽依赖而言,单个节点失效通常意味着重新计算过程会涉及多个父 RDD 分区,开销较大。
TaskSet:划分的Stage会转换成一组相关联的任务集。...union (otherDataset):将两个RDD进行合并,返回结果为RDD中元素(不去重) intersection (otherDataset):对两个RDD进行取交集运算,返回结果为RDD无重复元素...在较大的数据集中使用filer等过滤操作后可能会产生多个大小不等的中间结果数据文件,重新分区并减小分区可以提高作业的执行效率,是Spark中常用的一种优化手段 repartition (numPartitions...Spark提供对RDD的多种缓存级别,可以满足不同场景对RDD的使用需求。RDD的缓存具有容错性,如果有分区丢失,可以通过系统自动重新计算。...,如图2-3所示,如果子RDD只有部分分区数据损坏或者丢失,只需要从对应的父RDD重新计算恢复。
Spark 的主要特点还包括: (1)提供 Cache 机制来支持需要反复迭代计算或者多次数据共享,减少数据读取的 IO 开销; (2)提供了一套支持 DAG 图的分布式并行计算的编程框架,减少多次计算之间中间结果写到...当我们在代码中执行了cache/persist等持久化操作时,根据我们选择的持久化级别的不同,每个Task计算出来的数据也会保存到Executor进程的内存或者所在节点的磁盘文件中。 ...窄依赖是子 RDD的各个分片(partition)不依赖于其他分片,能够独立计算得到结果,宽依赖指子 RDD 的各个分片会依赖于父RDD 的多个分片,所以会造成父 RDD 的各个分片在集群中重新分片,...缓存的中间结果进行 ShuffleReduceTask 计算,这个过程容易造成OutOfMemory. ?...性能优化 缓存 Spark中对于一个RDD执行多次算子(函数操作)的默认原理是这样的:每次你对一个RDD执行一个算子操作时,都会重新从源头处计算一遍,计算出那个RDD来,然后再对这个RDD执行你的算子操作
如果一次性加载到内存,那么就会因为单台计算机的内存空间有限而导致内存溢出。如果将中间结果全部缓存到HashMap中,那么也会因为单台计算机的内存空间有限而导致内存溢出。...MapReduce是一种计算模型,用以进行大数据量的计算。其中Map对数据集上的独立元素进行指定的操作,生成键-值对形式中间结果。...Reduce则对中间结果中相同“键”的所有“值”进行规约,以得到最终结果。MapReduce这样的功能划分,非常适合在大量计算机组成的分布式并行环境里进行数据处理。...RDD持久化 默认情况下,每一个转换过的RDD都会在它之上执行一个动作时被重新计算。如果RDD只被使用一次或者很少次,不需要持久化。如果RDD被重复使用或者计算其代价很高,才考虑持久化。...Storage模块存取的最小单位是数据块(Block),Block与RDD中的Partition一一对应,所以所有的转换或动作操作最终都是对Block进行操作。
理解算子的含义: hadoop只有map、Reduce这两个算子 Spark提供了很多算子: 如上图,一个Job被拆分成若干个stage,每个stage执行一些计算,产生一些中间结果,他们的目的是最终生成这个...parititons的个数 5,RDD.persist():持久化 默认每次在RDDs上进行action操作,spark都重新计算RDDs,如果想重复利用一个RDDs,可以使用RDD.persisit...对数据转换,但是如果到最后我们并没有使用转换后的数据区计算结果呢?...这在大数据中是十分显著的,那么怎么知道在使用时,再去执行呢?Spark内部有metadata表会记录转换的操作记录。...Shuffle write将shuffle MapTask任务产生的中间结果缓存到内存中,shuffle fetch获取shuffleMapTask缓存的中间结果进行shuffleReduceTask计算
Spark 针对 Hadoop-MR 做的改进 减少了磁盘的 I/O Spark 将 map 端的中间输出和结果存储在内存中,避免了 reduce 端在拉取 map 端数据的时候造成大量的磁盘 I/O;...增加了并行度 由于将中间结果写到磁盘与从磁盘读取中间结果属于不同的环节,Hadoop 将它们简单地通过串行执行衔接起来。...避免重新计算 当某个 Stage 中的一个 Task 失败之后,Spark 会重新对这个 Stage 进行调度,并且会过滤掉已经执行成功的 Task,避免造成重复的计算和资源的浪费。...依赖具体分为两种,一种是窄依赖,RDD 之间分区是一一对应的;另一种是宽依赖,下游 RDD 的每个分区与上游 RDD(也称之为父 RDD)的每个分区都有关,是多对多的关系。...在 Spark 中,RDD 可以创建为对象,通过对象上的各种方法调用来对 RDD 进行转换。经过一系列的 transformation 逻辑之后,就可以调用 action 来触发 RDD 的最终计算。
不可变性: 代表每一个RDD都是只读的,所包含的分区信息不可以被修改,所以如果想要修改,就只能通过转换(Transformation),得到新的RDD作为中间计算结果。...Transformation就是用来把一个RDD转换成另一个RDD,而Action则是通过计算返回一个结果。...",使用了新产生的RDD来记录计算逻辑,这样就把作用在RDD上的所有计算逻辑串联起来,形成一个链条,当遇上RDD的动作操作时,Spark就会从计算链条的最后一个RDD开始,依次从上一个RDD获取数据并执行计算逻辑...RDD的持久化(缓存) 每当我们对RDD调用一个新的action操作时,整个RDD都会从头开始计算,因此如果某一个RDD被反复利用的话,这样子的方式是低效的,我们需要对其进行持久化操作。...Spark Streaming的优缺点 优点: 数据容错性:如果RDD的某些分区丢失了,可以通过依赖关系重新计算恢复。 运行速度: 将数据流存在在内存中,速度优势明显。
我们只可以对现有的RDD进行转换转换(Transformation)操作,得到新的RDD作为中间计算的结果。...并行操作 Spark不需要将每个中间计算结果进行数据复制以防数据丢失,因为每一步产生的RDD里都会存储它的依赖关系。 所以并行操作的前提是不同的RDD之间有着怎样的依赖关系。...sc.parallelize([2, 3, 4]).count() // 3 Spark在每次转换操作的时候,使用了新产生的 RDD 来记录计算逻辑,这样就把作用在 RDD 上的所有计算 逻辑串起来,形成了一个链条...当对 RDD 进行动作时,Spark 会从计算链的最后一个RDD开始,依次从上 一个RDD获取数据并执行计算逻辑,最后输出结果。...所以持久化的RDD有自动的容错机制。如果RDD 的任一分区丢失了,通过使用原先创建它的转换操作,它将会被自动重算。 持久化可以选择不同的存储级别。
MapReduce分成了两个部分: 映射(Mapping)对集合里的每个目标应用同一个操作。即,如果你想把表单里每个单元格乘以二,那么把这个函数单独地应用在每个单元格上的操作就属于mapping。...被分配了Map作业的worker,开始读取对应分片的输入数据,Map作业数量是由M决定的,和split一一对应;Map作业从输入数据中抽取出键值对,每一个键值对都作为参数传递给map函数,map函数产生的中间键值对被缓存在内存中...master通知分配了Reduce作业的worker它负责的分区在什么位置(肯定不止一个地方,每个Map作业产生的中间键值对都可能映射到所有R个不同分区),当Reduce worker把所有它负责的中间键值对都读过来后...可以将 RDD 视作数据库中的一张表。其中可以保存任何类型的数据。Spark 将数据存储在不同分区上的 RDD 之中。 RDD 可以帮助重新安排计算并优化数据处理过程。...此外,它还具有容错性,因为RDD知道如何重新创建和重新计算数据集。 RDD 是不可变的。
换句话说,Spark用了十分之一的资源在三分之一的时间里完成了Hadoop做的事情。...不过,上面表格显示的31倍速率的差异,是否完全是Spark框架本身的贡献? 如果仔细看Hadoop和Spark团队的两次排序实践,会发现除了运算框架的选取,其他还有很多不同。...Spark中每个transform的返回值都是RDD,也就是transform是那些真正转换了RDD的操作,而Action操作会返回结果或把RDD数据写到存储系统中。...2.3 中间结果存储 Hadoop MapReduce的所有中间结果(包括map/reduce task内部的中间结果)都会存储在硬盘上,期间虽然会使用缓存,但当中间数据输出超出一定阈值(比如100M)...2.4 进程 vs 线程 Hadoop MapReduce和Spark都会将计算过程拆解成若干task,这些task分布在不同的DataNode(Hadoop)或Worker(Spark)上执行。
每个 RDD 可以分成多个分区,每个分区就是一个数据集片段,并且一个 RDD 的不同分区可以保存到集群中不同的节点上,从而可以在集群中的不同节点上进行并行计算 正是 RDD 的这种惰性调用机制,使得转换操作得到的中间结果不需要保存...,而是直接管道式的流入到下一个操作进行处理 6.1 设计与运行原理 在实际应用中,存在许多迭代式算法和交互式数据挖掘工具,这些应用场景的共同之处在于不同计算阶段之间会重用中间结果,即一个阶段的输出结果会作为下一个阶段的输入...而 RDD 提供了一个抽象的数据架构,从而让开发者不必担心底层数据的分布式特性,只需将具体的应用逻辑表达为一系列转换处理,不同 RDD 之间的转换操作形成依赖关系,可以实现管道化,从而避免了中间结果的存储...对与Wide Dependencies,这种计算的输入和输出在不同的节点上,lineage方法对与输入节点完好,而输出节点宕机时,通过重新计算,这种情况下,这种方法容错是有效的,否则无效,因为无法重试,...对于宽依赖, Stage 计算的输入和输出在不同的节点上,对于输入节点完好,而输出节点死机的情况,通过重新计算恢复数据这种情况下,这种方法容错是有效的,否则无效,因为无法重试,需要向上追溯其祖先看是否可以重试
Spark则允许将map端的中间输出和结果缓存在内存中,从而使得reduce端在拉取中间结果时避免了大量的磁盘I/O。...2)增加任务并行度:由于将中间结果写到磁盘与从磁盘读取中间结果属于不同的环节,Hadoop将它们简单地通过串行执行衔接起来。...3)避免重新计算:当Stage中某个分区的Task执行失败后,会重新对此Stage调度,但在重新调度的时候会过滤已经执行成功的分区任务,所以不会造成重复计算和资源浪费。...如果应用启用了检查点,那么在Stage中的Task都执行成功后,SparkContext将把RDD计算的结果保存到检查点,这样当某个RDD执行失败后,再由父RDD重建时就不需要重新计算,而直接从检查点恢复数据...ExternalSorter用于在map端或reduce端对ShuffleMapTask计算得到的中间结果进行排序、聚合等操作。
RDD抽象出一个被分区、不可变、且能并行操作的数据集;从HDFS读取的需要计算的数据,在经过处理后的中间结果会作为RDD单元缓存到内存当中,并可以作为下一次计算的输入信息。...当数据丢失时,对于窄依赖只需要重新计算丢失的那一块数据来恢复;对于宽依赖则要将祖先RDD中的所有数据块全部重新计算来恢复。所以在长“血统”链特别是有宽依赖的时候,需要在适当的时机设置数据检查点。...也是这两个特性要求对于不同依赖关系要采取不同的任务调度机制和容错恢复机制。...如果只需要访问Int字段,RDD的指针可以只访问Int数组,避免了对整个数据结构的扫描。 RDD将操作分为两类:transformation与action。...即Spark不会立刻计算结果,而只是简单的记住所有对数据集的转换操作。这些转换只有遇到action操作的时候才会开始计算。 ?
在默认情况下,Spark所有的转换操作都是惰性(Lazy)的,每个被转换得到的RDD不会立即计算出结果,只是记下该转换操作应用的一些基础数据集,可以有多个转换结果。...Spark将计算打散成多个任务以便在不同的机器上分别运行,每台机器并行运行Map,并将结果进行Reduce操作,返回结果值Driver程序。...4.3.1 转换操作 转换操作是RDD的核心之一,通过转换操作实现不同的RDD结果,作为下一次RDD计算的数据输入,转换操作不会触发Job的提交,仅仅是标记对RDD的操作,形成DAG图,以供Action...表4-4 常用的执行操作 [插图] 通过常用执行操作,Spark可以实现大部分MapReduce流式计算的任务,提升了计算效率,对Transformation操作进行结果值输出。...为了规避这一点,Spark会保持Map阶段中间数据输出的持久,在机器发生故障的情况下,再执行只需要回溯Mapper持续输出的相应分区,来获取中间数据。
相比于Hadoop的MapReduce,可以看到Spark提供多种计算结果处理方式,对shuffle过程进行了优化。 那么我们从RDD的iterator方法开始: ? ...如果某个partition任务执行失败,可以利用DAG重新调度,失败的partition任务将从检查点恢复状态,而那些已经成功执行的partition任务由于其执行结果已经缓存到存储体系,所以调用CacheManager.getOrCompue...在computeOrReadCheckpoint中,如果存在检查点时,则进行中间数据的拉取,否则将会重新执行compute,我们知道RDD具有linkage机制,所以可以直接找到其父RDD。 ? ...那么spark的优化在于: 1、map任务逐条输出计算结果,而不是一次性输出到内存,并使用AppendOnlyMap缓存及其聚合算法对中间结果进行聚合,大大减少了中间结果所占内存的大小。 ...那么 哪些Block从本地获取、哪些需要远程拉取,是获取中间计算结果的关键。那么reduce端如何处理多个map任务的中间结果?
在序列化的时候,Spark 会将 Job 运行所依赖的变量、方法全部打包在一起序列化,相当于它们的副本,所以 counter 会一起被序列化,然后传输到计算节点,是计算节点上的 counter 会自增,...9 说说 Spark 的特点,相对于 MapReduce 来说 减少磁盘 I/O,MR 会把 map 端将中间输出和结果存储在磁盘中,reduce 端又需要从磁盘读写中间结果,势必造成磁盘 I/O 称为瓶颈...Spark 允许将 map 端的中间结果输出和结果存储在内存中,reduce 端在拉取中间结果的时候避免了大量的磁盘 I/O。...增加并行度,由于把中间结果写到磁盘与从磁盘读取中间结果属于不同的缓解,Hadoop 将他们简单地通过串行执行衔接起来,Spark 则把不同的环节抽象成为 Stage,允许多个 Stage 既可以串行又可以并行执行...避免重新计算,当 Stage 中某个分区的 Task 执行失败后,会重新对此 Stage 调度,但在重新调度的时候会过滤已经执行成功的分区任务,所以不会造成重复计算和资源浪费。
将计算的中间结果存储由磁盘转为内存,消除磁盘I/O加载中间结果所带来的开销 Apache Spark --> RDD 诞生 为什么需要RDD?...,记录数据转换过程,从而实现对出错数据的恢复,提高分布式并行计算下共享数据的容错性 基于以上原则,从而有了RDD,即弹性分布式数据集的概念。...另外,出现问题时只有RDD的丢失分区需要重新计算,并且它们可以在不同的节点上并行执行,不需要回滚整个程序。...在部分分区数据丢失时,Spark可以通过这个依赖关系重新计算丢失的分区数据,而不是对RDD的所有分区进行重新计算。 元数据,描述分区模式和数据存放的位置。...Spark 基本架构及运行过程 ---- RDD是Spark的核心,也是整个Spark的架构基础 与许多专有的大数据处理平台不同,Spark建立在统一抽象的RDD之上,使得它可以以基本一致的方式应对不同的大数据处理场景
统计过程中,机器之间如何协调,是否需要专门的一台机器指挥调度其他机器?如果这台机器挂了呢? (可选)如果销售记录在源源不断地增加,统计还没执行完新记录又来了,如何保证统计结果的准确性?...上述问题中,除了第1个外,其余的都与具体任务无关,在其他分布式计算的场合也会遇到,而且解决起来都相当棘手。即使第1个问题中的分组、统计,在很多数据处理场合也会涉及,只是具体方式不同。...如前面统计商品销售额的例子,在Spark中只需要调用map和reduceByKey两个转换操作就可以实现,整个程序包括加载销售记录和保存统计结果在内也只需要寥寥几行代码,并且支持Java、Scala、Python...MapReduce中,只有map和reduce两个阶段,复杂的计算需要大量的组合,并且由开发者自己定义组合方式;Spark中,RDD可以连续执行多个转换操作,如果这些操作对应的RDD分区不变的话,还可以放在同一个任务中执行...MapReduce中间结果放在HDFS中;Spark中间结果放在内存中,内存放不下时才写入本地磁盘而不是HDFS,这显著提高了性能,特别是在迭代式数据处理的场合。
领取专属 10元无门槛券
手把手带您无忧上云