引入
一般来说,分布式数据集的容错性有两种方式:数据检查点和记录数据的更新。
面向大规模数据分析,数据检查点操作成本很高,需要通过数据中心的网络连接在机器之间复制庞大的数据集,而网络带宽往往比内存带宽低得多,同时还需要消耗更多的存储资源。
因此,Spark选择记录更新的方式。但是,如果更新粒度太细太多,那么记录更新成本也不低。因此,RDD只支持粗粒度转换,即只记录单个块上执行的单个操作,然后将创建RDD的一系列变换序列(每个RDD都包含了他是如何由其他RDD变换过来的以及如何重建某一块数据的信息。因此RDD的容错机制又称“血统(Lineage)”容错)记录下来,以便恢复丢失的分区。
Lineage本质上很类似于数据库中的重做日志(Redo Log),只不过这个重做日志粒度很大,是对全局数据做同样的重做进而恢复数据。
Lineage机制
Lineage简介
相比其他系统的细颗粒度的内存数据更新级别的备份或者LOG机制,RDD的Lineage记录的是粗颗粒度的特定数据Transformation操作(如filter、map、join等)行为。当这个RDD的部分分区数据丢失时,它可以通过Lineage获取足够的信息来重新运算和恢复丢失的数据分区。因为这种粗颗粒的数据模型,限制了Spark的运用场合,所以Spark并不适用于所有高性能要求的场景,但同时相比细颗粒度的数据模型,也带来了性能的提升。
两种依赖关系
RDD在Lineage依赖方面分为两种:窄依赖(Narrow Dependencies)与宽依赖(Wide Dependencies,源码中称为Shuffle
Dependencies),用来解决数据容错的高效性。
- 窄依赖是指父RDD的每一个分区最多被一个子RDD的分区所用,表现为一个父RDD的分区对应于一个子RDD的分区
或多个父RDD的分区对应于一个子RDD的分区,也就是说一个父RDD的一个分区不可能对应一个子RDD的多个分区。
1个父RDD分区对应1个子RDD分区,这其中又分两种情况:1个子RDD分区对应1个父RDD分区(如map、filter等算子),1个子RDD分区对应N个父RDD分区(如co-paritioned(协同划分)过的Join)。- 宽依赖是指子RDD的分区依赖于父RDD的多个分区或所有分区,即存在一个父RDD的一个分区对应一个子RDD的多个分区。
1个父RDD分区对应多个子RDD分区,这其中又分两种情况:1个父RDD对应所有子RDD分区(未经协同划分的Join)或者1个父RDD对应非全部的多个RDD分区(如groupByKey)。
本质理解:根据父RDD分区是对应1个还是多个子RDD分区来区分窄依赖(父分区对应一个子分区)和宽依赖(父分区对应多个子分
区)。如果对应多个,则当容错重算分区时,因为父分区数据只有一部分是需要重算子分区的,其余数据重算就造成了冗余计算。
对于宽依赖,Stage计算的输入和输出在不同的节点上,对于输入节点完好,而输出节点死机的情况,通过重新计算恢复数据这种情况下,这种方法容错是有效的,否则无效,因为无法重试,需要向上追溯其祖先看是否可以重试(这就是lineage,血统的意思),窄依赖对于数据的重算开销要远小于宽依赖的数据重算开销。
窄依赖和宽依赖的概念主要用在两个地方:一个是容错中相当于Redo日志的功能;另一个是在调度中构建DAG作为不同Stage的划分点。
依赖关系的特性
第一,窄依赖可以在某个计算节点上直接通过计算父RDD的某块数据计算得到子RDD对应的某块数据;宽依赖则要等到父RDD所有数据都计算完成之后,并且父RDD的计算结果进行hash并传到对应节点上之后才能计算子RDD。
第二,数据丢失时,对于窄依赖只需要重新计算丢失的那一块数据来恢复;对于宽依赖则要将祖先RDD中的所有数据块全部重新计算来恢复。所以在长“血统”链特别是有宽依赖的时候,需要在适当的时机设置数据检查点。也是这两个特性要求对于不同依赖关系要采取不同的任务调度机制和容错恢复机制。
容错原理
在容错机制中,如果一个节点死机了,而且运算窄依赖,则只要把丢失的父RDD分区重算即可,不依赖于其他节点。而宽依赖需要父RDD的所有分区都存在,重算就很昂贵了。可以这样理解开销的经济与否:在窄依赖中,在子RDD的分区丢失、重算父RDD分区时,父RDD相应分区的所有数据都是子RDD分区的数据,并不存在冗余计算。在宽依赖情况下,丢失一个子RDD分区重算的每个父RDD的每个分区的所有数据并不是都给丢失的子RDD分区用的,会有一部分数据相当于对应的是未丢失的子RDD分区中需要的数据,这样就会产生冗余计算开销,这也是宽依赖开销更大的原因。因此如果使用Checkpoint算子来做检查点,不仅要考虑Lineage是否足够长,也要考虑是否有宽依赖,对宽依赖加Checkpoint是最物有所值的。
Checkpoint机制
通过上述分析可以看出在以下两种情况下,RDD需要加检查点。
- DAG中的Lineage过长,如果重算,则开销太大(如在PageRank中)。
- 在宽依赖上做Checkpoint获得的收益更大。
由于RDD是只读的,所以Spark的RDD计算中一致性不是主要关心的内容,内存相对容易管理,这也是设计者很有远见的地方,这样减少了框架的复杂性,提升了性能和可扩展性,为以后上层框架的丰富奠定了强有力的基础。
在RDD计算中,通过检查点机制进行容错,传统做检查点有两种方式:通过冗余数据和日志记录更新操作。在RDD中的doCheckPoint方法相当于通过冗余数据来缓存数据,而之前介绍的血统就是通过相当粗粒度的记录更新操作来实现容错的。
检查点(本质是通过将RDD写入Disk做检查点)是为了通过lineage做容错的辅助,lineage过长会造成容错成本过高,这样就不如在中间阶段做检查点容错,如果之后有节点出现问题而丢失分区,从做检查点的RDD开始重做Lineage,就会减少开销。
http://www.jianshu.com/p/99ebcc7c92d3
相关推荐
9. **Spark容错机制**:Spark通过检查点和RDD lineage实现容错。如果某个任务失败,可以根据其依赖关系重新计算丢失的RDD。 10. **Spark部署模式**:Spark可以运行在多种模式下,包括本地模式、独立模式、YARN、...
7. **Spark容错机制** - **Spark如何保证容错?** 基于RDD的血统(Lineage)实现,如果某部分数据丢失,可以通过已有的RDD操作重新计算。 8. **Spark与Hadoop的比较** - **Spark对比MapReduce的优势?** Spark...
- Spark容错机制:如RDD的不变性和分区概念,使得在节点失败时可以通过重新计算恢复数据。 此外,还可能涉及到Spark的生态系统中的其他工具和技术,例如: - 数据源接入:如何高效地将数据从不同数据源(如HDFS、...
5. **Spark容错机制**: 血统关系记录了RDD的演变过程,当数据丢失时,可以通过这个历史信息恢复。此外,Spark采用粗粒度的数据模型,以提高性能。 6. **Spark任务调度**: Spark的任务调度分为RDD对象、...
8. **Spark容错机制**:了解Spark的错误检测和恢复机制,如检查点和容错管理,对于保证任务的稳定运行和数据一致性至关重要。 9. **Spark图形处理**:GraphX提供了一种处理图形数据的API,适用于社交网络分析、推荐...
3. Spark容错机制:通过RDD的Lineage图记录计算过程,实现容错。 4. Spark与Hadoop的比较:Spark在计算速度、易用性上比Hadoop更优,但Hadoop在存储成本上更具优势。 5. RDD持久化原理:通过缓存RDD到内存,实现重复...
RDD提供了容错机制,通过血统(Lineage)记录数据创建过程,当部分数据丢失时,可以从源数据或父RDD重新计算。 5. DataFrame与Dataset: DataFrame是Spark SQL引入的数据抽象,它是基于表的抽象,允许用户以SQL方式...
9. **Spark容错机制**:学习Spark的容错特性,如检查点和宽依赖的概念,以及如何利用这些特性来保证数据处理的可靠性。 10. **Spark性能调优**:掌握如何监控和调优Spark作业,包括配置executor的数量、内存大小、...
Spark Core提供了基础的分布式任务调度和内存管理机制;Spark SQL用于结构化数据处理,支持SQL查询;Spark Streaming处理实时流数据,采用微批处理方式;MLlib提供了丰富的机器学习算法;GraphX则用于处理图形数据。...
为了深入理解Apache Spark Streaming中DStream处理的容错机制,本文将从一个简单的Spark Streaming示例出发,逐步分析Spark如何确保数据处理的准确性与可靠性。在开始之前,需要确保已经正确安装了必要的工具,例如...
- Spark的Lineage容错机制:如果RDD出错,可以通过其父RDD的Lineage重新计算。 - Checkpoint机制:Spark还可以通过设置检查点将RDD结果持久化到磁盘,以减少故障恢复时的计算量。 这些习题覆盖了Spark的基础知识...
5. **容错机制**:检查点、宽依赖与窄依赖,以及如何在故障发生时恢复计算。 6. **Spark SQL与DataFrame**:DataFrame的概念,SQL支持,以及如何与Hive集成。 7. **Spark Streaming**:DStream的构建,窗口操作,...
2. Spark运行时核心:深入解析Spark的执行模型,如何在集群上分配计算资源、任务的调度策略、内存管理和容错机制等。这个部分还会涉及Spark中的DAG(有向无环图)调度器是如何将用户程序转换成任务的执行计划的。 3...
2. 容错机制:在2.1.0版本中,Spark的检查点和容错机制更加成熟,提高了任务恢复效率。 3. 性能提升:优化了shuffle过程,减少了网络传输和磁盘I/O,提升了整体性能。 五、API使用技巧 1. 广播变量:广播大对象到每...
此外,源码还揭示了Spark的容错机制、内存管理和调度策略等关键部分,这对于优化Spark应用和解决性能问题非常有帮助。 总结,Spark-2.3.2源码提供了深入了解大数据处理框架内部运作的机会,对于开发者和研究者来说...
对于大规模生产环境,通常会选择YARN或Kubernetes,因为它们提供了更好的资源管理和容错机制。 总的来说,Spark 3.2.1是大数据处理领域的重要工具,它的强大功能和高效的性能使其在数据科学、机器学习和实时分析等...
1. Spark Core:基础执行引擎,负责任务调度、内存管理以及容错机制。 2. Spark SQL:支持结构化和半结构化数据处理,可以与SQL查询语言交互。 3. Spark Streaming:用于实时流数据处理,通过微批处理实现高吞吐量和...
10. 容错与故障恢复:Spark的容错机制主要依赖于数据分区和血统信息,当Executor失败时,可以从源RDD重新计算丢失的部分。 以上知识点是"Spark笔记"中可能涵盖的内容,Hive.docx可能详细介绍了如何使用Hive进行数据...
1. **RDD(Resilient Distributed Datasets)**:Spark的核心数据结构,是弹性分布式数据集,提供了容错机制,可以在多台机器上并行操作。 2. **DataFrame**:在Spark SQL中引入的数据结构,基于RDD但提供了更高...