Spark 分析导论
Spark 软件栈
Spark Core
实现基本功能:
– 任务调度
– 内存管理
– 错误恢复
– 存储交互
– 对 弹性分布式数据集(RDD) 的API定义
Spark SQL
用来操作结构化数据的程序包。可以使用Sql或者Hql(Hive SQL)来查询数据,支持多种数据表。支持在各个语言中混合使用SQL和复杂数据分析操作。
前身为修改自Hive的Shark,已被取代。
Spark Streaming
提供处理实时数据的流式计算组件,对应Spark Core中RDD API。即可以通过基本相同的操作处理实时or非实时数据。底层支持与Core 同级的容错,吞吐和可伸缩性
MLlib
包含常见的机器学习功能库。
GraphX
操作图的程序库。与Core和Streaming类似,可以提供并行图计算,并支持图操作以及包含一些常用图算法
集群管理器
支持运行在Hadoop YARN、Apache Mesos 以及自带的独立调度器。
用途
- 数据科学任务
- 数据处理应用
简史、版本
略
存储
支持HDFS以及任何支持Hadoop接口的文件系统,如亚马逊S3,Cassandra,Hive,HBase等。
Spark 核心概念简介
每个Spark都由驱动器程序
发起所有在集群上的并行操作,驱动器包含应用的main
函数,并定义了集群上的分布式数据集以及对其的相关操作。驱动器通过一个SparkContent
来访问Spark,通过这个来创建RDD。Spark将会自动将函数发送到各个执行节点上执行。
RDD
基础
RDD是一个不可变的分布式对象集合。每个RDD被分为不同分区,并在执行时发送到不同节点上。RDD支持两类操作:
– 转化操作:会由一个RDD生成一个新的RDD,如filter
– 行动操作:会对RDD计算得出结果并返回驱动程序,如first
通常的操作步骤如下:
1. 创建RDD:可通过外部数据及内存中集合创建
2. 转化操作:可以操作任意数量的RDD,最终返回一个RDD,不会改变传入参数RDD中的数据
3. 行动操作:会强制上层依赖树种的RDD进行运算,并将结果返回。
惰性计算 :只有第一次在一个行动操作中用到时,才会真正计算RDD。默认情况下,RDD会在每次进行行动操作时被重新运算,除非使用RDD.persist()
进行缓存。persist()
本身不触发强制求值
传递函数
传入类或方法,但是必须可以被序列化。建议传递局部可序列化变量,或者顶级对象中的函数。
持久化
persist()
默认把数据以序列化方式缓存在JVM堆中。
级别 | 内存空间 | CPU | 内存中 | 磁盘中 | 备注 |
---|---|---|---|---|---|
MEMORY_ONLY | 高 | 低 | 是 | 否 | |
MEMORY_ONLY_SER | 低 | 高 | 是 | 否 | 进行序列化操作 |
MEMORY_AND_DISK | 高 | 中 | 部分 | 部分 | 如果内存放不下,写到磁盘 |
MEMORY_AND_DISK_SER | 低 | 高 | 部分 | 部分 | 内存存放序列化数据 |
DISK_ONLY | 低 | 高 | 否 | 是 |
如果内存容量已满,则Spark使用LRU(最近最少使用)
方法将最老的分区移除。同时可以手动调用unpersist()
来手动删除缓存。