Spark 是专为大规模数据处理而设计的快速通用的计算引擎
生态系统圈
Spark组件
Core; 核心,实现RDD,API等相关操作,是其他组件的基础
SQL: 基于HiveQL与Spark交互的API,其中一个数据库表看作一个RDD
Streaming: 对实时数据流进行处理和控制,以RDD的方式
MLib: 常用的机器学习算法库, 将算法的实现转为对RDD的操作
GraphX: 实现控制图、创建子图、访问路径上所有顶点等操作
Spark基本运行架构
包含Spark上下文的驱动
集群资源管理器
工作节点
任务控制节点
具体任务执行进程
安装指令:
启动单机本地 sh spark-shell --master=local
Spark 最核心的概念
RDD --弹性分布式数据集 就是一种的集合类型,类似Array,list
RDD 是一种特殊的集合类型,有分区机制,可以分布式的处理机制,加快处理机制
RDD 是一种特殊的集合,具有数据容错机制,数据恢复
因为Spark框架处理任何数据,都要先数据封装到RDD里,在针对RDD计算
创建RDD的两种方式
1 将一个普通集合(Array和list)转化RDD
2 读取文件数据,将文件数据变RDD
RDD特点
- 只读不可改
- 元素可以为键值对或其他数据
- 函数包括转换Transformations和动作Actions 两类
- 可基于HDFS文件,本地文件,并行集合,JSON文件等多种方式创建
- 延迟计算(懒加载): 转换不执行计算,动作才执行计算;运行时优化提高性能
map和flatMap有何不同?
map: 对RDD每个元素转换
flatMap: 对RDD每个元素转换, 然后再扁平化(即去除集合)
所以,一般我们在读取数据源后,第一步执行的操作是flatMap
RDD操作 --总分两大类
1 变换操作 Tranesformation 都会懒操作,即并不是马上真正的触发计算 ,每执行一次懒操作,都会生成新的RDD
2 执行操作 Action 有 collect .glom.collect
RDD基本命令
groupByKey对于数据格式是有要求的,即操作的元素必须是一个二元tuple,
reduceByKey操作的数据格式必须是一个二元tuple
WordCount
sc上下文调用textFile方法打开HDFS上的文件
flatMap按空格全部切割后返回字符串集合
map将每个字符串加入元组(单词,1)
reduceByKey完成按key分组后的值累加操作
sortBy按值降序排序,完成wordcount
collect将RDD转为集合的动作函数,此时执行计算,最终foreach打印所有元素
sc.textFile("hdfs://ghym:9000/word.txt").flatMap(_.split("\\s+")).map((_,1)).reduceByKey(_+_).sortBy(_._2,false).collect.foreach(println)
.flatMap(_.split(" ")).map{(_,1)}.reduceByKey(_+_)
## 案例:通过rdd实现统计文件中的单词数量
sc.textFile("/root/work/words.txt").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).saveAsTextFile("/root/work/wcresult")
DAG记录RDD之间的依赖关系,RDD可以实现数据的容错(数据可以恢复),即当于RDD某个分区数据丢失,通过关系恢复
RDD的依赖关系:
窄依赖:父分区和子分区是一对一 生成方法:map flatMap fiter union
宽依赖:父分区和子分区是一对多 生成方法: groupByKey reduceByKey
宽依赖指的是多个子RDD的Partition会依赖同一个parent RDD的Partition,会产生shuffle
Stage本质上一组Task的集合
Task对应分区,一个分区对应一个Task,即Spark处理任务是处理分区数据
Task有两大类: MapTask () ResultTask
Spark有两种Shuffle Manager: Hash Based Shuffle Manager Sort based Shuffle Manager
RDD有两种缓冲机制:cache 只有一种 persist 有多种
针对RDD的缓存级别:
1 memory_only (cache persist)
2, memory_and_disk
3 memory_only_ser 等等
内存的分配建议:
比如服务器内存64G 建议分配一半,32G以上
注意,还要为操作系统留10GB以内