zoukankan      html  css  js  c++  java
  • 分布式计算框架——Spark

    产生的背景

    1)MapReduce有较大的局限性
    仅支持Map、Reduce两种语义操作
    执行效率低,时间开销大
    主要用于大规模离线批处理
    不适合迭代计算、交互式计算、实时流处理等场景
    2)计算框架种类多,选型难,学习成本高
    批处理:MapReduce
    流处理:Storm、Flink
    交互式计算:Impala、Presto
    机器学习:Mahout
    3)统一计算框架,简化技术选型
    在一个统一框架下,实现批处理、流处理、交互式计算、机器学习

    1 Spark概念

    Spark 提供了一个全面、统一的框架用于管理各种有着不同性质(文本数据、图表数据等)的数据集和数据源(批量数据或实时的流数据)的大数据处理的需求。
    具有高吞吐、低延时、通用易扩展、高容错等特点
    采用Scala语言开发
    提供多种运行模式

    特点

    1)计算高效
    利用内存计算、Cache缓存机制,支持迭代计算和数据共享,减少数据读取的IO开销
    利用DAG引擎,减少中间计算结果写入HDFS的开销
    利用多线程池模型,减少任务启动开销,避免Shuffle中不必要的排序和磁盘IO操作
    2)通用易用
    适用于批处理、流处理、交互式计算、机器学习算法等场景
    提供了丰富的开发API,支持Scala、Java、Python、R等

    2 Spark核心架构

    Spark Core

    包含 Spark 的基本功能;尤其是定义 RDD 的 API、操作以及这两者上的动作。其他 Spark 的库都是构建在 RDD 和 Spark Core 之上的

    Spark SQL

    提供通过 Apache Hive 的 SQL 变体 Hive 查询语言(HiveQL)与 Spark 进行交互的 API。每个数据库表被当做一个 RDD,Spark SQL 查询被转换为 Spark 操作。

    Spark Streaming

    对实时数据流进行处理和控制。Spark Streaming 允许程序能够像普通 RDD 一样处理实时数据

    Mllib

    一个常用机器学习算法库,算法被实现为对 RDD 的 Spark 操作。这个库包含可扩展的学习算法,比如分类、回归等需要对大量数据集进行迭代的操作。

    GraphX

    控制图、并行图操作和计算的一组算法和工具的集合。GraphX 扩展了 RDD API,包含控制图、创建子图、访问路径上所有顶点的操作

    3 Spark核心组件

    Cluster Manager-制整个集群,监控 worker

    在 standalone 模式中即为 Master 主节点,控制整个集群,监控 worker。在 YARN 模式中为资源管理器

    Worker 节点-负责控制计算节点

    从节点,负责控制计算节点,启动 Executor 或者 Driver。

    Driver: 运行 Application 的 main()函数

    一个Spark程序有一个Driver,一个Driver创建一个SparkContext,程序的main函数运行在Driver中
    负责解析Spark程序、划分Stage、调度任务到Executor上执行

    SparkContext

    负责加载配置信息,初始化运行环境,创建DAGScheduler和TaskScheduler

    Executor:执行器,是为某个 Application 运行在 worker node 上的一个进程

    负责执行Driver分发的任务,一个节点可以启动多个Executor,每个Executor通过多线程运行多个任务

    Task

    Spark运行的基本单位,一个Task负责处理若干RDD分区的计算逻辑

    4 SPARK编程模型


    Spark 应用程序从编写到提交、执行、输出的整个过程如图所示,图中描述的步骤如下:
    1). 用户使用 SparkContext 提供的 API(常用的有 textFile、sequenceFile、runJob、stop 等)编写 Driver application 程序。此外 SQLContext、HiveContext 及 StreamingContext 对
    SparkContext 进行封装,并提供了 SQL、Hive 及流式计算相关的 API。
    2). 使用SparkContext提交的用户应用程序,首先会使用BlockManager和BroadcastManager将任务的 Hadoop 配置进行广播。然后由 DAGScheduler 将任务转换为 RDD 并组织成 DAG,DAG 还将被划分为不同的 Stage。最后由 TaskScheduler 借助 ActorSystem 将任务提交给集群管理器(Cluster Manager)。
    3). 集群管理器(ClusterManager)给任务分配资源,即将具体任务分配到Worker上,Worker创建 Executor 来处理任务的运行。Standalone、YARN、Mesos、EC2 等都可以作为 Spark的集群管理器。

    RDD

    弹性分布式数据集(Resilient Distributed Datesets)
    分布在集群中的只读对象集合
    由多个Partition组成
    通过转换操作构造
    失效后自动重构(弹性)
    存储在内存或磁盘中

    Spark基于RDD进行计算


    RDD操作(Operator)
    1)Transformation(转换)
    将Scala集合或Hadoop输入数据构造成一个新RDD
    通过已有的RDD产生新RDD
    惰性执行:只记录转换关系,不触发计算
    例如:map、filter、flatmap、union、distinct、sortbykey
    2)Action(动作)
    通过RDD计算得到一个值或一组值
    真正触发计算
    例如:first、count、collect、foreach、saveAsTextFile

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

    5)示例:WordCount
    val rdd1 = sc.textFile(“hdfs://node01:9000/data/wc/in”)
    val rdd2 = rdd1.flatMap(
    .split(“ ”))
    val rdd3 = rdd2.map((,1))
    val rdd4 = rdd3.reduceByKey((
    +_))
    rdd4.saveAsTextFile(“hdfs://node01:9000/data/wc/out”)

    5 SPARK 计算模型

    RDD 可以看做是对各种数据计算模型的统一抽象,Spark 的计算过程主要是 RDD 的迭代计算过程。RDD 的迭代计算过程非常类似于管道。分区数量取决于 partition 数量的设定,每个分区的数
    据只会在一个 Task 中计算。所有分区可以在多个机器节点的 Executor 上并行执行。

    6 Spark运行流程


    1). 构建 Spark Application 的运行环境,启动 SparkContext
    2). SparkContext 向资源管理器(可以是 Standalone,Mesos,Yarn)申请运行 Executor 资源,
    并启动 StandaloneExecutorbackend,
    3). Executor 向 SparkContext 申请 Task
    4). SparkContext 将应用程序分发给 Executor
    5). SparkContext 构建成 DAG 图,将 DAG 图分解成 Stage、将 Taskset 发送给 Task Scheduler,
    最后由 Task Scheduler 将 Task 发送给 Executor 运行
    6). Task 在 Executor 上运行,运行完释放所有资源

    7 SPARK RDD 流程


    1). 创建 RDD 对象
    2). DAGScheduler 模块介入运算,计算 RDD 之间的依赖关系,RDD 之间的依赖关系就形成了
    DAG
    3). 每一个 Job 被分为多个 Stage。划分 Stage 的一个主要依据是当前计算因子的输入是否是确
    定的,如果是则将其分在同一个 Stage,避免多个 Stage 之间的消息传递开销

    8 SPARK RDD

    RDD 的创建方式

    1)从 Hadoop 文件系统(或与Hadoop兼容的其他持久化存储系统,如Hive、Cassandra、HBase)输入(例如 HDFS)创建。
    2)从父 RDD 转换得到新 RDD。
    3)通过 parallelize 或 makeRDD 将单机数据创建为分布式 RDD。

    RDD 的两种操作算子(转换(Transformation)与行动(Action))

    1)转换(Transformation):Transformation操作是延迟计算的,也就是说从一个RDD转换生成另一个 RDD 的转换操作不是马上执行,需要等到有 Action 操作的时候才会真正触发运算。

    2)行动(Action):Action 算子会触发 Spark 提交作业(Job),并将数据输出 Spark 系统。

  • 相关阅读:
    每周总结15
    第二阶段Day02
    第二阶段Day01
    假期学习记录03(高德地图错误码为7:key鉴权错误)
    假期学习记录02(高德地图关于开发版和调试版sha值)
    假期学习记录01(地图显示和基本的配置)
    android获取当前步数
    android实现轮播图(从互联网上寻找图片)
    android中gps的应用
    互联网营销精准决策项目总结
  • 原文地址:https://www.cnblogs.com/eugene0/p/12839109.html
Copyright © 2011-2022 走看看