本篇文档搭配了
Spark在线环境,可以直接在线体验。Apache Spark是为大规模数据处理而设计的快速通用的运算框架,最初由AMPLab所开发,使用了内存运算技术。相对于Hadoop的MapReduce会在运行完工作后将中介数据存放到磁盘中,Spark能在数据尚未写入硬盘时即在存储器内分析运算。Spark在存储器内运行程序的运算速度能做到比Hadoop MapReduce的运算速度快上100倍。
在线练习地址:Spark在线实验室
1. Spark 是什么
Apache Spark 是个通用的集群计算框架,通过将大量数据集计算任务分配到多台计算机上,提供高效内存计算。Spark 正如其名,最大的特点就是快(Lightning-fast),可比 Hadoop MapReduce 的处理速度快 100 倍。如果你熟悉 Hadoop,那么你知道分布式计算框架要解决两个问题:如何分发数据和如何分发计算。Hadoop 使用 HDFS 来解决分布式数据问题,MapReduce 计算范式提供有效的分布式计算。类似的,Spark 拥有多种语言的函数式编程 API,提供了除 map 和 reduce 之外更多的运算符,这些操作是通过一个称作弹性分布式数据集(resilient distributed datasets, RDDs)的分布式数据框架进行的。
2. Spark 核心组件
Spark 库本身包含很多应用元素,这些元素可以用到大部分大数据应用中,其中包括对大数据进行类似 SQL 查询的支持,机器学习和图算法,对实时流数据的支持。具体核心组件如下:
Spark Core:包含 Spark 的基本功能;尤其是定义 RDD 的 API、操作以及这两者上的动作。其他 Spark 的库都是构建在 RDD 和 Spark Core 之上的。
Spark SQL:提供通过 Apache Hive 的 SQL 变体 Hive 查询语言(HiveQL)与 Spark 进行交互的 API。每个数据库表被当做一个 RDD,Spark SQL 查询被转换为 Spark 操作。对熟悉 Hive 和 HiveQL 的人,Spar k可以拿来就用。
Spark Streaming:允许对实时数据流进行处理和控制。很多实时数据库(如Apache Store)可以处理实时数据。Spark Streaming 允许程序能够像普通 RDD 一样处理实时数据。
MLlib:一个常用机器学习算法库,算法被实现为对 RDD 的 Spark 操作。这个库包含可扩展的学习算法,比如分类、回归等需要对大量数据集进行迭代的操作。之前可选的大数据机器学习库 Mahout,将会转到 Spark,并在未来实现。
GraphX:控制图、并行图操作和计算的一组算法和工具的集合。GraphX 扩展了 RDD API,包含控制图、创建子图、访问路径上所有顶点的操作。
由于这些组件满足了很多大数据需求,也满足了很多数据科学任务的算法和计算上的需要,Spark 快速流行起来。不仅如此,Spark 也提供了使用 Scala、Java 和Python 编写的 API;满足了不同团体的需求,允许更多数据科学家简便地采用 Spark 作为他们的大数据解决方案。
3. Spark 体系架构
Spark体系架构包括如下三个主要组件:
- 数据存储
- API
- 管理框架
数据存储:Spark 用 HDFS 文件系统存储数据。它可用于存储任何兼容于 Hadoop 的数据源,包括HDFS,Hbase,Cassandra等。
API:利用 API,应用开发者可以用标准的 API 接口创建基于 Spark 的应用。Spark 提供 Scala,Java 和 Python 三种程序设计语言的 API。
下面是三种语言 Spark API 的网站链接。
- Scala APIhttp://spark.apache.org/docs/latest/api/scala/index.html#org.apache.spark.package
- Javahttp://spark.apache.org/docs/latest/api/java/index.html
- Pythonhttp://spark.apache.org/docs/latest/api/python/index.html
Spark基本概念:
- Application: 用户自己写的 Spark 应用程序,批处理作业的集合。Application 的 main 方法为应用程序的入口,用户通过 Spark 的 API,定义了 RDD 和对 RDD 的操作。
- SparkContext: Spark 最重要的 API,用户逻辑与 Spark 集群主要的交互接口,它会和 Cluster Master 交互,包括向它申请计算资源等。
- Driver 和 Executor:Spark 在执行每个 Application 的过程中会启动 Driver 和 Executor 两种 JVM 进程。Driver 进程为主控进程,负责执行用户 Application 中的 main 方法,提交 Job,并将 Job 转化为 Task,在各个 Executor 进程间协调 Task 的调度。运行在Worker上 的 Executor 进程负责执行 Task,并将结果返回给 Driver,同时为需要缓存的 RDD 提供存储功能。
资源管理:
一组计算机的集合,每个计算机节点作为独立的计算资源,又可以虚拟出多个具备计算能力的虚拟机,这些虚拟机是集群中的计算单元。Spark 的核心模块专注于调度和管理虚拟机之上分布式计算任务的执行,集群中的计算资源则交给 Cluster Manager 这个角色来管理,Cluster Manager 可以为自带的Standalone、或第三方的 Yarn和 Mesos。
Cluster Manager 一般采用 Master-Slave 结构。以 Yarn 为例,部署 ResourceManager 服务的节点为 Master,负责集群中所有计算资源的统一管理和分配;部署 NodeManager 服务的节点为Slave,负责在当前节点创建一个或多个具备独立计算能力的 JVM 实例,在 Spark 中,这些节点也叫做 Worker。
另外还有一个 Client 节点的概念,是指用户提交Spark Application 时所在的节点。
弹性分布式数据集(RDD):
弹性分布式数据集(RDD)是 Spark 框架中的核心概念。可以将 RDD 视作数据库中的一张表。其中可以保存任何类型的数据。Spark 将数据存储在不同分区上的 RDD 之中。
RDD 可以帮助重新安排计算并优化数据处理过程。
此外,它还具有容错性,因为RDD知道如何重新创建和重新计算数据集。
RDD 是不可变的。你可以用变换(Transformation)修改 RDD,但是这个变换所返回的是一个全新的RDD,而原有的 RDD 仍然保持不变。
RDD 支持两种类型的操作:
- 变换(Transformation)变换的返回值是一个新的 RDD 集合,而不是单个值。调用一个变换方法,不会有任何求值计算,它只获取一个 RDD 作为参数,然后返回一个新的 RDD。 变换函数包括:map,filter,flatMap,groupByKey,reduceByKey,aggregateByKey,pipe和coalesce。
- 行动(Action)行动操作计算并返回一个新的值。当在一个 RDD 对象上调用行动函数时,会在这一时刻计算全部的数据处理查询并返回结果值。 行动操作包括:reduce,collect,count,first,take,countByKey 以及 foreach。
了解完spark的基本概念后,可以到Spark在线实验室练习spark的安装部署,里面有完整教程。
Spark从入门到进阶的系统课程:Spark 大数据动手实验
更多spark实验项目:Spark_精选项目课程
在线体验其他开源软件:实验楼软件库
如果你对任何开源软件感兴趣,欢迎在下面留言,也欢迎提交你熟悉的开源软件。提交方法:软件库使用方法。