XY个人记
Apache Spark是专为大规模数据处理而设计的快速通用的计算引擎 。现在形成一个高速发展应用广泛的生态系统。
Spark,拥有Hadoop MapReduce所具有的优点;但不同于MapReduce的是——Job中间输出结果可以保存在内存中,从而不再需要读写HDFS,因此Spark能更好地适用于数据挖掘与机器学习等需要迭代的MapReduce的算法。
Spark 是在 Scala 语言中实现的,它将 Scala 用作其应用程序框架。与 Hadoop 不同,Spark 和 Scala 能够紧密集成,其中的 Scala 可以像操作本地集合对象一样轻松地操作分布式数据集。
尽管创建 Spark 是为了支持分布式数据集上的迭代作业,但是实际上它是对 Hadoop 的补充,可以在 Hadoop 文件系统中并行运行。通过名为 Mesos 的第三方集群框架可以支持此行为。Spark 由加州大学伯克利分校 AMP 实验室 (Algorithms, Machines, and People Lab) 开发,可用来构建大型的、低延迟的数据分析应用程序。
性能特点
1.Speed(快速)
内存计算下,Spark 比 Hadoop 快100倍。
2.Ease of Use(易用性)
可用多种语言:Java, Scala, Python, R, and SQL
Java开发
好处:对于大数据大型项目来说,涉及到HBase、Hive、Flume等等,有利于整合
坏处:代码量比较大,代码不优雅
scala开发:Spark本身源码就是scala,兼容性好,代码更简洁
3.Generality(通用)
整合:spark sql、spark streaming、MLlib、GraphX
4.Runs Everywhere(在任何平台运行)
Spark runs on Hadoop, Apache Mesos, Kubernetes, standalone, or in the cloud
国内:一般选择在yarn上运行
国外:一般选择Mesos运行
Spark 和 MapReduce 比较
| MapReduce | Spark |
| 数据存储结构:磁盘hdfs文件系统的split | 使用内存构建弹性分布式数据集RDD,对数据进行 运算和cache |
| 编程范式:Map + Reduce | DAG(有向无环图):Transformation + action |
| 计算中间数据落磁盘,io及序列化、反序列化代 价大 | 计算中间数据在内存中维护,存取速度是磁盘的 多个数量级 |
| Task以进程的方式维护,任务启动就有数秒 | Task以线程的方式维护,对小数据集的读取能达到 亚秒级的延迟 |
Spark的版本差别
Spark1.6
出现Dataset的概念,与DataFrame两个概念
程序的主入口SparkContext(sc)
Spark2.0+
统一了Dataset和DataFrame: type DataFrame = Dataset[Row]
程序的主入口变成SparkSession(spark),用于替换统一HiveContext、SQLContext
累加器API更简单更高性能
spark基本工作原理:分布式 基于内存 迭代式
RDD:spark基本抽象
Resilient(弹性) Distributed(分布式) Dataset(数据集)弹性分布式数据集, 是分布式内存的一个抽象概念,RDD提供了一种高度受限的共享内存模型,即RDD是只读的记录分区的集合,只能通过在其他RDD执行确定的转换操作(如map、join和group by)而创建,然而这些限制使得实现容错的开销很低。
RDD可以抽象的代表一个HDFS文件,RDD是以分区的形式存在,每个分区存在不同的节点上。分区的数据默认放在内存上,如果某个文件的大小超过了它所在节点存储的大小,它会把存放不下的数据存储在当前节点的内存中,会自动进行内存和磁盘的切换。
数据集:内部是一个数据集合
分布式:数据分区存在,并且存放在spark集群的不同的节点上
弹性:
-1. 自动进行内存和磁盘存储的切换(用户只需要关注RDD的计算处理、操作) RDD的分区的数据默认是放在内存上
-2. 基于血统(依赖)的高效容错性 RDD1 经过转换生成 RDD2
-3. DRR的最小单位Task失败,自动重试机制
RDD特点:
RDD里面的数据是不可变的并且分区存在,每次调用RDD的API,会生成新的RDD,对旧的RDD的数据不会发生变化
RDD的五大特性:
* - A list of partitions(分区列表)
* - A function for computing each split(每个分区都有一个计算函数)
* - A list of dependencies on other RDDs (依赖于其他RDD的一个列表)
* - Optionally, a Partitioner for key-value RDDs (e.g. to say that the RDD is hash-partitioned)
(对于key-value形式的RDD有一个分区器) key-value形式你可以理解为二元组形式的RDD[(String,Int)]
* - Optionally, a list of preferred locations to compute each split on (e.g. block locations for an HDFS file)
(每个分区都有一个分区位置列表)
Spark运行环境 local:本地运行 standalone:spark 自带的资源管理框架 yarn mesos
Spark on standalone
类似于yarn的一个集群资源管理框架,spark自带的集群
standalone
Master:(进程)
管理集群资源,主要包括:申请、调度、监控
Worker:(进程)
当前进程允许分配的资源进行管理,包括资源的管理以及executor的启动
资源:
CPU和内存(CPU决定快慢,内存决定生死)注意:一台机器允许有多个Worker进程
Spark应用的结构
Driver + Executors
Driver:相当于MapReduce中ApplicationMaster,运行SparkContext上下文、SparkContext进行初始化的地方(JVM)、进行RDD的初始化、Task运行的资源申请、调度的地方。 一般认为就是main运行的地方
Executors:具体的Task运行的地方,一个executor可以运行多个Task任务,一个spark应用可以有多个Executor
进程:
local模式
Driver和Executor运行在同一个进程(SparkSubmit),以线程的方式进行区分的
集群模式(standalone、yarn、mesos)
Driver:
SparkSubmit
Executor:(有几个Executor就会有几个CoarseGrainedExecutorBackend进程)
CoarseGrainedExecutorBackend
spark-shell底层运行的就是spark-submit命令,spark-submit底层运行spark-class
Application(每个应用都有Driver+Executors)一个应用包含多个job
如下图所示:RDD的action类型的API一旦触发就会产生一个job 一个Job里面包含多个Stage
stage0 有shuffle操作就会划分stage
一个Stage里面可以包含多个Task,Task就是最小的运行单位,是在executor处理对应分区数据的线程
最近为了赶进度…… 没有太多时间去深入了解,所以就先记到这里,后期再来完善……
未完待续……