Spark及其生态圈

说明:本文选自郭景瞻的《图解Spark:核心技术与案例实战》

一、Spark简介

Spark是加州大学伯克利分校AMP实验室开发的通用大数据处理框架。其生态系统也称为BDAS,力图在算法(Algorithms)、机器(Machines)和人(People)三者之间通过大规模集成来展现大数据应用的一个开源平台。

Spark使用Scala语言进行实现,它是一种面向对象、函数式编程语言,能够像操作本地集合对象一样轻松地操作分布式数据集。Spark具有运行速度快、易用性好、通用性强和随处运行等特点。

  • 运行速度快:Spark基于内存计算,相对于Hadoop性能提高了几十倍,而其主要原因正是因为Spark基于内存计算和引入DAG执行引擎。
  • 易用性好:Spark不仅支持Scala编写应用程序,而且支持Java和Python等语言进行编写。(Scala是一种高效、可扩展的语言,能够用简介的代码处理较为复杂的工作。)
  • 通用性强:Spark生态圈中的组件:Spark Core提供内存计算框架,Spark SQL的即席查询,Spark Streaming的实时处理,MLlib的机器学习和GraphX的图处理。它们都是有AMP实验室提供,能够无缝地集成,并提供一站式解决平台。
  • 随处运行:Spark具有很强的适应性,能够读取HDFS,HBase,S3和Tachyon为持久层读写原生数据;能够以Mesos,YARN和自身携带的Standalone作为资源管理器调度作业来完成Spark应用程序的计算。

二、Spark生态系统

Spark 生态系统以Spark Core 为核心,能够读取传统文件(如文本文件)、HDFS、Amazon S3、Alluxio 和NoSQL 等数据源,利用Standalone、YARN 和Mesos 等资源调度管理,完成应用程序分析与处理。这些应用程序来自Spark 的不同组件,如Spark Shell 或Spark Submit 交互式批处理方式、Spark Streaming 的实时流处理应用、Spark SQL 的即席查询、采样近似查询引擎BlinkDB 的权衡查询、MLbase/MLlib 的机器学习、GraphX 的图处理和SparkR 的数学计算等,如下图所示,正是这个生态系统实现了“One Stack to Rule Them All”目标。 (在这里只介绍Spark Core、Spark SQL以及Spark Streaming)

Spark及其生态圈_第1张图片

1、Spark Core

Spark Core 是整个Spark生态系统的核心组件,是一个分布式大数据处理框架。Spark Core提供了多种资源调度管理,通过内存计算、有向无环图(DAG)等机制保证分布式计算的快速,并引入了RDD 的抽象保证数据的高容错性,其重要特性描述如下:

  • Spark Core提供了多种运行模式,不仅可以使用自身运行模式处理任务,如本地模式、Standalone,而且可以使用第三方资源调度框架来处理任务,如YARN、MESOS等。相比较而言,第三方资源调度框架能够更细粒度管理资源。
  • Spark Core提供了有向无环图(DAG)的分布式并行计算框架,并提供内存机制来支持多次迭代计算或者数据共享,大大减少迭代计算之间读取数据的开销,这对于需要进行多次迭代的数据挖掘和分析性能有极大提升。另外在任务处理过程中移动计算而非移动数据(数据本地性),RDDPartition 可以就近读取分布式文件系统中的数据块到各个节点内存中进行计算。
  • 在Spark 中引入了RDD的抽象,它是分布在一组节点中的只读对象集合,这些集合是弹性的,如果数据集一部分丢失,则可以根据“血统”对它们进行重建,保证了数据的高容错性。

2、Spark SQL

Spark SQL 的前身是Shark,它发布时Hive 可以说是SQL on Hadoop 的唯一选择(Hive 负责将SQL 编译成可扩展的MapReduce 作业),鉴于Hive 的性能以及与Spark 的兼容,Shark 由此而生。 
  Shark 即Hive on Spark,本质上是通过Hive 的HQL 进行解析,把HQL 翻译成Spark 上对应的RDD 操作,然后通过Hive 的Metadata 获取数据库里的表信息,实际为HDFS 上的数据和文件,最后由Shark 获取并放到Spark 上运算。Shark 的最大特性就是速度快,能与Hive 的完全兼容,并且可以在Shell 模式下使用rdd2sql 这样的API,把HQL 得到的结果集继续在Scala环境下运算,支持用户编写简单的机器学习或简单分析处理函数,对HQL 结果进一步分析计算。 
  在2014 年7 月1 日的Spark Summit 上,Databricks 宣布终止对Shark 的开发,将重点放到Spark SQL 上。在此次会议上,Databricks 表示,Shark 更多是对Hive 的改造,替换了Hive 的物理执行引擎,使之有一个较快的处理速度。然而,不容忽视的是,Shark 继承了大量的Hive代码,因此给优化和维护带来大量的麻烦。随着性能优化和先进分析整合的进一步加深,基于MapReduce 设计的部分无疑成为了整个项目的瓶颈。因此,为了更好的发展,给用户提供一个更好的体验,Databricks 宣布终止Shark 项目,从而将更多的精力放到Spark SQL 上。 
  Spark SQL 允许开发人员直接处理RDD,同时也可查询在 Hive 上存在的外部数据。SparkSQL 的一个重要特点是能够统一处理关系表和RDD,使得开发人员可以轻松地使用SQL 命令进行外部查询,同时进行更复杂的数据分析。其特点如下:

  • 引入了新的RDD 类型SchemaRDD,可以像传统数据库定义表一样来定义SchemaRDD。 SchemaRDD由定义了列数据类型的行对象构成。SchemaRDD 既可以从RDD 转换过 来,也可以从Parquet 文件读入,还可以使用HiveQL从Hive 中获取。
  • 内嵌了Catalyst 查询优化框架,在把SQL 解析成逻辑执行计划之后,利用Catalyst 包里的一些类和接口,执行了一些简单的执行计划优化,最后变成RDD 的计算。

为什么Spark SQL 的性能会得到这么大的提升呢?主要是Spark SQL 在以下几点做了优化。 

  • 字节码生成技术(Bytecode Generation):Spark 1.1.0 在Catalyst 模块的Expressions 
    增加了Codegen 模块,使用动态字节码生成技术,对匹配的表达式采用特定的代码动态编译。另外对SQL 表达式都做了CG 优化。CG优化的实现主要还是依靠Scala 2.10运行时的反射机制(Runtime Reflection)。
  • Scala 代码优化:Spark SQL 在使用Scala编写代码的时候,尽量避免低效的、容易GC的代码;尽管增加了编写代码的难度,但对于用户来说接口统一。
  • 内存列存储(In-Memory Columnar Storage):Spark SQL 的表数据在内存中存储不是采用原生态的JVM对象存储方式,而是采用内存列存储。

3、Spark Streaming

Spark Streaming 是一个对实时数据流进行高吞吐、高容错的流式处理系统,可以对多种数据源(如Kafka、Flume、Twitter 和ZeroMQ 等)进行类似Map、Reduce 和Join 等复杂操作,并将结果保存到外部文件系统、数据库或应用到实时仪表盘,如下图:

Spark及其生态圈_第2张图片

相比其他的处理引擎要么只专注于流处理,要么只负责批处理(仅提供需要外部实现的流处理API 接口),而Spark Streaming 最大的优势是提供的处理引擎和RDD 编程模型可以同时进行批处理与流处理。 
  对于传统流处理中一次处理一条记录的方式而言,Spark Streaming 使用的是将流数据离散化处理(Discretized Streams),通过该处理方式能够进行秒级以下的数据批处理。在SparkStreaming 处理过程中,Receiver 并行接收数据,并将数据缓存至Spark 工作节点的内存中。经过延迟优化后,Spark 引擎对短任务(几十毫秒)能够进行批处理,并且可将结果输出至其他系统中。与传统连续算子模型不同,其模型是静态分配给一个节点进行计算,而Spark 可基于数据的来源以及可用资源情况动态分配给工作节点。 

你可能感兴趣的:(大数据/Spark/Spark,Core)