笔记:分布式大数据技术原理(三)Spark

Apache Spark 是一个围绕速度、易用性和复杂分析构建的大数据处理框架,最初在2009年由加州大学伯克利分校的 AMPLab 开发,并于2010年成为 Apache 的开源项目之一,与 Hadoop 和 Storm 等其他大数据和 MapReduce 技术相比,Spark 有如下优势:

  • 运行速度快:Spark 拥有 DAG 执行引擎,支持在内存中对数据进行迭代计算;官方提供的数据表明,如果数据由磁盘读取,速度是 Hadoop MapReduce 的10倍以上,如果数据从内存中读取,速度可以高达100多倍。
  • 适用场景广泛:大数据分析统计、实时数据处理、图计算及机器学习
  • 易用性:编写简单,支持80种以上的高级算子,支持多种语言,数据源丰富,可部署在多种集群中
  • 容错性高:Spark 引进了弹性分布式数据集 RDD (Resilient Distributed Dataset) 的抽象,它是分布在一组节点中的只读对象集合,这些集合是弹性的,如果数据集一部分丢失,则可以根据“血统”(即充许基于数据衍生过程)对它们进行重建。另外在 RDD 计算时可以通过 CheckPoint 来实现容错,而 CheckPoint 有两种方式:CheckPoint Data,和Logging The Updates,用户可以控制采用哪种方式来实现容错

适用场景

  • 复杂的批量处理(Batch Data Processing),偏重点在于处理海量数据的能力,至于处理速度可忍受,通常的时间可能是在数十分钟到数小时;
  • 基于历史数据的交互式查询(Interactive Query),通常的时间在数十秒到数十分钟之间
  • 基于实时数据流的数据处理(Streaming Data Processing),通常在数百毫秒到数秒之间
     

架构

Hadoop 存在缺陷:基于磁盘,无论是 MapReduce 还是 YARN 都是将数据从磁盘中加载出来,经过 DAG,然后重新写回到磁盘中,计算过程的中间数据又需要写入到 HDFS 的临时文件,这些都使得 Hadoop 在大数据运算上表现太“慢”,因此 Spark 应运而生。通常当需要处理的数据量超过了单机尺度(比如我们的计算机有4GB的内存,而我们需要处理100GB以上的数据),这时我们可以选择Spark 集群进行计算;有时我们可能需要处理的数据量并不大,但是计算很复杂,需要大量的时间,这时我们也可以选择利用 Spark 集群强大的计算资源,并行化地计算,其架构示意图如下:

笔记:分布式大数据技术原理(三)Spark_第1张图片

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

Spark SQL:提供通过 Apache Hive 的 SQL 变体 Hive 查询语言(HiveQL)与 Spark 进行交互的API,每个数据库表被当做一个 RDD,Spark SQL 查询被转换为 Spark 操作;Spark 提供的 SQL 形式的对接 Hive、JDBC、HBase 等各种数据渠道的 API,用 Java 开发人员的思想来讲就是面向接口、解耦合,ORMapping、Spring Cloud Stream 等类似的思想 

Spark Streaming:基于 SparkCore 实现的可扩展、高吞吐、高可靠性的实时数据流处理,支持从 Kafka、Flume 等数据源处理后存储到 HDFS、DataBase、Dashboard 中,对实时数据流进行处理和控制;Spark Streaming 允许程序能够像普通 RDD 一样处理实时数据

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

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

工作原理

笔记:分布式大数据技术原理(三)Spark_第2张图片

Cluster Manager 在 Standalone 模式中即为 Master 主节点,控制整个集群,监控 Worker;在 YARN 模式中为资源管理器负责分配资源,有点像 YARN 中 ResourceManager 那个角色,大管家握有所有的干活的资源,属于乙方的总包
WorkerNode 是可以干活的节点,听大管家 ClusterManager 差遣,是真正有资源干活的主,负责控制计算节点,启动 Executor 或者 Driver
Executor 是在 WorkerNode 上起的一个进程,相当于一个包工头,负责准备 Task 环境和执行 
Task 负责内存和磁盘的使用,是施工项目里的每一个具体的任务
Driver 是统管 Task 的产生与发送给 Executor 的,运行 Application 的 main() 函数,是甲方的司令员
SparkContext 是与 ClusterManager 打交道的,负责给钱申请资源的,是甲方的接口人

整个互动流程是这样的:

  1. 甲方来了个项目,创建了 SparkContext,SparkContext 去找 ClusterManager(可以是Standalone,Mesos,Yarn)申请 Executor 资源同时给出报价,需要多少 CPU 和内存等资源,并启动 StandaloneExecutorbackend
  2. ClusterManager 去找 WorkerNode 并启动 Excutor,并介绍 Excutor 给 Driver 认识
  3. Driver 根据施工图拆分一批批的 Task,将 Task 送给 Executor 去执行(SparkContext 构建成 DAG 图,将 DAG 图分解成 Stage、将 Taskset 发送给 Task Scheduler,最后由 Task Scheduler 将 Task 发送给 Executor 运行)
  4. Executor 接收到 Task 后准备 Task 运行时依赖并执行,并将执行结果返回给 Driver
  5. Driver 会根据返回回来的 Task 状态不断的指挥下一步工作,直到所有 Task 执行结束,运行完释放所有资源

特点:多线程运行、运行过程与资源管理器无关、Task 采用了数据本地性和推测执行来优化

附:RDD 的依赖关系--窄依赖和宽依赖

窄依赖(narrow dependency):是指每个父 RDD 的一个 Partition 最多被子 RDD 的一个 Partition 所使用,例如 map、filter、union 等操作都会产生窄依赖;(独生子女)即 rdd 中的每个 partition 仅仅对应父 rdd 中的一个 partition;父 rdd 里面的 partition 只去向子 rdd 里的某一个 partition,这叫窄依赖;如果父 rdd 里面的某个 partition 会去子 rdd 里面的多个 partition,那它就一定是宽依赖 
宽依赖(shuffle dependency):是指一个父 RDD 的 Partition 会被多个子 RDD 的 Partition 所使用,例如 groupByKey、reduceByKey、sortByKey 等操作都会产生宽依赖;(超生)每一个父 rdd 的 partition 数据都有可能传输一部分数据到子 rdd 的每一个 partition 中,即子 rdd 的多个 partition 依赖于父 rdd;宽依赖划分成一个 Stage

荐读材料

大数据分析技术与应用一站式学习(值得收藏)

你可能感兴趣的:(Big,Data,big,data,spark)