Featured image of post Spark详解

Spark详解

本文简要介绍了Spark的基础概念、RDD、运行架构、作业模式、执行解析等方面的内容。

Spark

Spark简介

MapReduce有较大的局限性

  • 仅支持Map、Reduce两种语义操作
  • 执行效率低,时间开销大
  • 主要用于大规模离线批处理
  • 不适合迭代计算、交互式计算、实时流处理等场景

计算框架种类多,选型难,学习成本高

  • 批处理:MapReduce
  • 流处理:Strom、Flink
  • 交互式计算:Impala、Prestc
  • 机器学习:Mahout

统一计算框架,简化技术选型

  • 在一个统一的框架下,实现批处理、流处理、交互式学习、机器学习
  • 由加州大学伯克利分校的AMP实验室开源
  • 大规模分布式通用计算引擎
    • Spark Core
    • Spark SQL
    • Spark Streaming
    • Spark MLib
    • Spark GraphX
  • 具有高吞吐、低延时、通用易扩展、高容错等特点
  • 采用Scala语言开发
  • 提供多种运行模式

Spark RDD与编程模型

  • RDD

    • 弹性分布式数据集(Resilient Distributed Dataset)

      • 分布在集群中的只读对象集合
      • 由多个Partition组成
      • 通过转换操作构造
      • 失效后自动重构(弹性)
      • 存储在内存或磁盘中
    • Spark基于RDD进行计算

      wordcount

      Spark_Word_Count

  • RDD操作(Operator)

    • Transformation(转换)
      • 将Scala集合或Hadoop输入数据构造成一个新的RDD
      • 通过已有的RDD产生新RDD
      • 惰性执行:只记录转换关系,不触发计算
      • 例如:map、filter、flatmap、union、distinct、sortbykey
    • Action(动作)
      • 通过RDD计算得到一个值或一组值
      • 真正触发计算
      • 例如:first、count、collect、foreach、saveAsTextFile
    • 示例:RDD的两种操作
      • rdd.map(_+1).saveAsTextFile(“hdfs://node01:9000”);
  • RDD依赖(Dependency)

    • 窄依赖(Narrow Dependency)
      • 父RDD中的分区最多只能被一个子RDD的一个分区使用
      • 子RDD如果有部分分区数据丢失或损坏,只需从对应的父RDD重新计算恢复
      • 例如:map、filter、union
    • 宽依赖(Shuffle/Wide Dependency)
      • 子RDD分区依赖父RDD的所有分区
      • 子RDD如果部分或全部分区数据丢失或损坏,必须从所有父RDD分区重新计算
      • 相对于窄依赖,宽依赖付出的代价要高很多,尽量避免使用
      • 例如:groupByKey、reduceByKey、sortByKey

Spark程序运行架构

Spark_Operate_Structure

在Yarn中分配的Container中运行一个task

在Spark中分配的Executor中可以运行多个task

Spark作业提交模式

  • Local模式

    • 单机运行,通常用于测试
    • Spark程序以多线程方式直接运行在本地
  • Standalone模式

    • Spark集群独立运行,不依赖于第三方资源管理系统,如:YARN、Mesos
    • 采用Master/Slave架构
    • Driver在Worker中运行,Master只负责集群管理
    • ZooKeeper负责Master HA,避免单点故障
    • 适用于集群规模不大,数据量不大的情况

    Spark_Standlone

  • YARN模式

    • YARN-Client模式:适用于交互和调试

      Spark_Yarn_Client

    • YARN-Cluster模式:适用于生产环境

      Spark_Yarn_Cluster

Spark作业解析与监控

Spark_Task

  • 生成逻辑查询计划(仅关注RDD的状态)

    1
    2
    3
    4
    5
    
    sc.textFile(inputArg)
    	.flatMap(_.split("\t"))
    	.map((_, 1))
    	.reduceByKey(_+_)
    	.saveAsTextFile(outArg)
    

    Spark_Logic

  • 生成物理查询计划(关注底层,以宽窄依赖划分stage)

    Spark_Physics

  • 任务调度与执行

    Spark_Task_Execute

  • 示例:DAG

    Spark_DAG

✨ 本站由 Hugo + Stack 主题搭建 | 不忘初心,慢慢成长 ✨
使用 Hugo 构建
主题 StackJimmy 设计