0


初学者,谈谈Spark。

1. Spark 为何物?(官网地址:https://spark.apache.org/)
Spark 是当今大数据领域最活跃、最热门、最高效的大数据通用计算平台之一。

Hadoop 之父 Doug Cutting 指出:Use of MapReduce engine for Big Data projects will decline, replaced by Apache Spark (大数据项目的 MapReduce 引擎的使用将下降,由 Apache Spark 取代)。

2. Spark 和 Hadoop的对比

尽管 Spark 相对于 Hadoop 而言具有较大优势,但 Spark 并不能完全替代 Hadoop,Spark 主要用于替代Hadoop中的 MapReduce 计算模型。存储依然可以使用 HDFS,但是中间结果可以存放在内存中;调度可以使用 Spark 内置的,也可以使用更成熟的调度系统 YARN 等。

实际上,Spark 已经很好地融入了 Hadoop 生态圈,并成为其中的重要一员,它可以借助于YARN 实现资源调度管理,借助于 HDFS 实现分布式存储。

此外,Hadoop 可以使用廉价的、异构的机器来做分布式存储与计算,但是,Spark对硬件的要求稍高一些,对内存与 CPU 有一定的要求。

3. Spark的特点

✿ 快:与 Hadoop 的 MapReduce 相比,Spark 基于内存的运算要快 100 倍以上,基于硬盘的运算也要快 10 倍以上。Spark 实现了高效的 DAG 执行引擎,可以通过基于内存来高效处理数流。

✿ 易用:Spark 支持 Java、Python、R 和 Scala 的 API,还支持超过 80 种高级算法,使用户可以快速构建不同的应用。而且 Spark 支持交互式的 Python 和 Scala 的 shell,可以非常方便地在这些 shell 中使用 Spark 集群来验证解决问题的方法。

✿ 通用:Spark 提供了统一的解决方案。Spark 可以用于批处理、交互式查询(Spark SQL)、实时流处理(Spark Streaming)、机器学习(Spark MLlib)和图计算(GraphX),这些不同类型的处理都可以在同一个应用中无缝使用。

✿ 兼容性:Spark 可以非常方便地与其他的开源产品进行融合。比如,Spark 可以使用 Hadoop 的 YARN 和 Apache Mesos 作为它的资源管理和调度器,并且可以处理所有 Hadoop 支持的数据,包括 HDFS、HBase 和 Cassandra 等。这对于已经部署 Hadoop 集群的用户特别重要,因为不需要做任何数据迁移就可以使用 Spark 的强大处理能力。

4.Spark集群的三种部署模式

❁Spark独立服务器模式
独立服务器模式使用内置的调度器,因而不需要任何外部调度器,如YARN或Mesos。要以独立服务器模式安装Spark,需要将Spark的二进制安装文件复制到集群的所有机器上。
独立服务器模式下,客户端可通过spark-submit或Spark shell与集群通信。无论那种情况,driver都会与Spark主节点进行通信,以便获取worker节点的信息,此后executor将在worker节点上启动来执行应用。多个客户端可同时与集群通信,然后再worker节点上创建各自的executor,每个客户端都有自己的driver组件。

❁基于YARN的Spark
在YARN模式下,客户段与YARN的资源管理器进行通信,从而获得容器来运行Spark应用。可将其视为一个小型Spark集群。在使用YARN运行Spark应用时,可使用YARN客户端模式或YARN集群模式。

❁❁YARN客户端模式
在YARN客户端模式下,driver在集群之外的节点(一般都是客户端节点)上运行。driver首先需要与资源管理器通信,从而请求资源并运行Spark作业。资源管理器会分配容器(0号容器)并响应driver。driver在0号容器中启动Spark应用主节点。Spark应用主节点在资源管理器分配的容器中创建executor。
YARN容器可位于集群中由节点管理器控制的任一节点,因此所有的资源分配都由资源管理器负责。
Spark应用主节点与资源管理器进行沟通,以获取其他容器来启动executor。

❁❁❁YARN集群模式
在集群模式下,driver在集群中的某个节点(一般是应用程序的主节点)上运行。客户端首先与资源管理器通信,请求资源并运行Spark作业。资源管理器会分配容器(0号容器)并响应客户端。然后客户端向集群提交代码,并在0号容器内启动driver和Spark应用主节点。driver与Spark应用主节点协同工作,然后在由资源管理器分配的容器上创建executor。
YARN容器可位于由节管理器控制的任何容器上。因此所有的资源分配都由资源管理器负责。
Spark应用主节点与资源管理器进行沟通,以获取其他容器来启动executor。
在YARN集群模式下,没有shell,因为driver本身在YARN内部。

❁基于Mesos的Spark
基于Mesos的部署模式与Spark的独立服务器模式蕾丝。driver与Mesos的主节点通信,然后该主节点分配用于运行executor的资源。然后driver会与executor通信。
Mesos中的driver会先与主节点通信,然后从Mesos所有的从节点上处理请求。
将容器分配给Spark作业后,driver会让executor启动,然后再executor中运行代码。如果Spark作业运行完成,而driver还存在,就会通知Mesos主节点,然后Mesos从属节点中所有以容器形式存在的资源都会被释放。
多个客户端与集群交互,从而在从属节点上创建格子的executor。每个客户端由自己的driver组件

5. Spark的运行模式

① local 本地模式(单机)

❉ 学习测试使用 ❉ 分为 local 单线程和 local-cluster 多线程。

② standalone 独立集群模式

❉学习测试使用 ❉典型的 Mater/slave 模式。

③ standalone-HA 高可用模式

❉生产环境使用
❉基于 standalone 模式,使用 zk 搭建高可用,避免 Master 是有单点故障的。

④ on yarn 集群模式

❉生产环境使用
❉运行在 yarn 集群之上,由 yarn 负责资源管理,Spark 负责任务调度和计算。
❉好处:计算资源按需伸缩,集群利用率高,共享底层存储,避免数据跨集群迁移。

⑤ on mesos 集群模式

❉国内使用较少
❉运行在 mesos 资源管理器框架之上,由 mesos 负责资源管理,Spark 负责任务调度和计算。

⑥ on cloud 集群模式

❉中小公司未来会更多的使用云服务
❉比如 AWS 的 EC2,使用这个模式能很方便的访问 Amazon 的 S3。

6.Spark的适用场景

☸复杂的批量处理(Batch Data Processing),偏重点在于处理海量数据的能力,至于处理速度可忍受,通常的时间可能是在数十分钟到数小时。

☸基于历史数据的交互式查询(Interactive Query),通常的时间在数十秒到数十分钟之间。

☸基于实时数据流的数据处理(Streaming Data Processing),通常在数百毫秒到数秒之间。

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

❈Spark Core提供了多种运行模式,不仅可以使用自身运行模式处理任务,如本地模式、Standalone,而且可以使用第三方资源调度框架来处理任务,如YARN、MESOS等。相比较而言,第三方资源调度框架能够更细粒度管理资源。

❈Spark Core提供了有向无环图(DAG)的分布式并行计算框架,并提供内存机制来支持多次迭代计算或者数据共享,大大减少迭代计算之间读取数据的开销,这对于需要进行多次迭代的数据挖掘和分析性能有极大提升。另外在任务处理过程中移动计算而非移动数据(数据本地性),RDDPartition 可以就近读取分布式文件系统中的数据块到各个节点内存中进行计算。

❈在Spark 中引入了RDD的抽象,它是分布在一组节点中的只读对象集合,这些集合是弹性的,如果数据集一部分丢失,则可以根据“血统”对它们进行重建,保证了数据的高容错性。

**▣ **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对象存储方式,而是采用内存列存储。

**▣ **Spark Streaming

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

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

8.Spark的应用场景

    在经济发展的高质量阶段,大数据已应用于各行各业,大数据应用场景的普遍要求是计算量大,效率高;而 Spark 恰恰满足这些要求,一经推出便受到开源社区的广泛关注和好评。目前 Spark 已经发展成为大数据处理领域非常受欢迎的开源项目。国内外大多数大型企业对 Spark的应用也十分广泛。

    ஐ **腾讯**

    腾讯广点通是最早使用 Spark 的应用之一。腾讯公司的大数据精准推荐借助 Spark 迭代快速的优势,围绕 “数据+算法+系统” 这套技术方案,实现了“数据实时采集,算法实时训练,系统实时预测” 的全流程实时并行高维算法,最终成功应用于广点通pCTR投放系统上,支持每天上百亿的请求量。

    ஐ **雅虎**

    雅虎(Yahoo)公司将Spark 用在Audience Expansion中,Audience Expansion是广告者寻找目标用户的一种方法。首先广告者提供一些观看了广告并且购买了产品的样本客户,再使用Spark对样本数据进行学习,寻找更多可能会购买产品的用户,并对这些用户投放广告。雅虎公司采用的算法是逻辑回归。同时由于某些SQL负载需要更高的服务质量,又加入专门运行Shark(AMPLab开源的一款数据仓库产品,底层的计算框架采用的是Spark)的大内存集群,用于取代商业的大数据分析工具,承担报表/仪表盘和交互式/即席查询,同时与桌面商务智能(Business Intelligence,BI)工具对接。

    ஐ **阿里巴巴**

    阿里巴巴淘宝技术团队将Spark应用于需要进行多次迭代的机器学习算法、高计算复杂度的算法等。例如,将Spark运用于淘宝的推荐相关算法上。同时该团队还利用Graphx解决了许多计算场景的生产问题:基于度分布的中枢节点发现、基于最大连通图的社区发现、基于三角形计数的关系衡量、基于随机游走的用户属性传播等。
    阿里巴巴全资子公司优酷土豆在视频推荐、广告业务等方面也使用了Spark。Spank的交互查询响应快,性能比Hadoop的提高了若干倍。一方面,使用Spark模拟广告投放的计算效率高、延迟小(与Hadoop 相比,Spark的延迟至少降低一个数量级)。另一方面,优酷土豆的视频推荐往往涉及机器学习及图计算,而使用Spark进行机器学习、图计算等迭代计算能够减少网络传输的次数,极大地提高计算性能。

总而言之Spark的横空出世,极大促进了大数据技术的发展,Spark在大数据开发中有着重要的作用,比如和Hive在一起实现Hive on Spark,此外,Spark在数据处理上一枝独秀,能很好地利用内存,以及提高处理速度,也提供了很多借口,来让大数据处理更加便利!

标签: spark

本文转载自: https://blog.csdn.net/2303_81761016/article/details/136451551
版权归原作者 沈欢祎 所有, 如有侵权,请联系我们删除。

“初学者,谈谈Spark。”的评论:

还没有评论