深入学习Spark

逐渐意识到光会用Spark是远远不够的,得了解基本原理和内部实现。遂学习《大规模数据处理实战》,本文为学习笔记。

MapReduce的缺点

  • 维护成本高
  • 时间达不到用户期望
  • 抽象层次低,大部分逻辑都需要用户手动开发
  • 很多场景不适合用Map&Reduce来描述
  • 每一个Job的计算结果都会存储在HDFS,每一步计算都需要的读取和写入
  • 欠缺对流数据处理的支持

Spark

  • MapReduce是多进程模型,多进程模型便于细粒度的控制每个任务占用的资源,但是会消耗较多的启动时间。Spark的并行机制是多线程模型,同一节点的任务以多线程的方式运行在一个JVM进程中,启动速度更快,CPU利用率更高,内存共享更好。

RDD

  • Resilient Distributed Dataset,可以被分区、只读,Spark最基本的数据结构。
  • 中间数据缓存在内存中,减少硬盘读写,加快处理速度。
  • 每个分区指向一个存放在内存中或硬盘中的数据块,每个数据块是独立的,可以被存放在不同的节点,故天然支持并行操作。


    RDD 的分区逻辑结构
  • 已有的RDD不可被改变,可以对现有的RDD进行转换,得到新的RDD
    • 记录RDD的依赖关系,不需要立刻去存储计算出来的数据
    • 提高Spark的计算效率,并且是错误恢复更加容易,因为当第N步输出RDD节点发生故障时,只需要从第N-1步的RDD出发,再次计算即可。
  • RDD结构:


    RDD结构
    1. SparkContext是与Spark节点的连接,一个线程只有一个SparkContext
    2. SparkConf是参数配置信息
    3. Partitions是RDD中数据的逻辑结构,每个Partition映射到某个节点内存或硬盘的一个数据块
    4. Partitioner决定分区方式,主流Hash和Range
    5. Dependencies存储依赖关系,通过哪个RDD经过哪个转换得到的
      • 窄依赖:每个分区可以并行处理产生,map、filter等。可以支持同一个节点上链式执行多条命令;失败恢复更有效,只需要重新计算丢失的父分区即可。
      • 宽依赖:必须等父RDD所有分区都计算好后才可以开始处理,join、groupBy等。需要等父分区都是可用的;失败恢复牵涉到多个父分区。

数据倾斜

你可能感兴趣的:(深入学习Spark)