Spark 分析导论

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()来手动删除缓存。