Spark
概念
- Scala为可扩展性语言
- Spark支持Java/python等,scala
Spark 对比 Hadoop
- Hadoop
- Spark
相比于 Hadoop MapReduce:
- Spark的计算模式属于MapReduce,并且不局限于Map和Reduce操作,提供了多种数据集操作类型,编程模型更加灵活。操作类型有很多种,大致分为转换操作和动作操作
- Action:collet,reduce,lookUp,save,…
- Transform:map,filter,flatmap,sample,groupByKey,reduceByKey,union,join,cogroup,mapvalues,sort,partionby,…
- 提供了内存计算并且可以将内存结果放在内存,对于迭代运算效率更高
- Spark基于DAG任务调度执行机制,优于Hadoop MapReduce迭代执行机制
- Spark容错性高,引进了RDD,数据集部分丢失可以重建,并且在RDD计算可以通过checkpoint实现容错
- Spark的各个物理节点之间的通信模型不再像Hadoop只有shuffle一种模式,用户可以命名,物化,控制中间结果存储,分区等。
生态系统
- 复杂的批量数据处理
- 基于历史数据的交互式查询
- 基于实时数据流的数据处理
- 三种场景,三种软件
- 复杂批量数据处理
- 历史数据交互式查询
- 实时数据流的数据处理
- 生态系统
- Spark Stream 流计算
- Spark SQL 提供交互式查询分析
- Spark Core 提供内存计算
- GraphX 图计算
运行架构
- RDD分布式内存,高度受限的共享内存模型
- DAG依赖关系
- Exeutor运行在工作节点的一个进程,负责Task
- Application用户编写的Spark应用程序
- Task运行在Executor上的工作单元
- Job包含多个RDD以及作用于相应的RDD的各种操作
- Stage是Job的基本调度单位,Job分为多组Task,每组Task成为Task或者TaskSet
运行流程
- 运行架构特点
- Application都有专属Executor进程,并且进程在Application运行期间一直驻留,Executor进程以多线程的方式运行Task
- 运行过程与资源管理器无关,只要能够获取Executor进程并保持通信即可
- Task采用了数据本地性和推测执行等优化机制
RDD
概念
- 为了满足这种需求出现的,提供了抽象的数据结构
- 不必担心底层数据的分布式特性,只需要将具体的应用逻辑表达为一系列的转换过程
- 不同RDD之间的转换操作形成了依赖关系,可以实现管道化,避免中间数据存储
依赖
- 窄依赖与宽依赖
- 窄依赖
- 父RDD的分区对应于一个子RDD的分区
- 多个父RDD的分区对应于一个子RDD分区
- 宽依赖
- 存在一个父RDD的一个分区对应于一个子RDD多个分区
- 图示
RDD特性
- 高效的容错性
- 具有天生的容错性
- 执行过程
- 创建RDD
- 生成DAG图
- 分解Stage,包含多个Task或被分配
Spark SQL
- shark
- Schema RDD 允许封装多种数据源
Spark 部署方式
Spark RDD基本操作
textFile.count()
统计文本文件的函数- 只包含某词语的行
scala> val linesWithSpark = textFile.filter(line=>line.contains("Spark"))
scala> linesWithSpark.count()
scala> val linesWithSpark
= textFile.filter(line => line.contains("spark")).count()
scala> val wordCounts = textFile.flatMap(line => line.split("")).map(word => (word, 1)).reduceByKey((a,b) => a+b)
scala> wordCounts.collect() # 单词统计结果
实际操作
实验室传送门