spark是一个快速的通用的集群计算平台。
特点:
- 快速:比hadoop快出100倍,hadoop框架mapreduce计算需要落地。map任务结束后将结果输出到磁盘或者hdfs,reduce从hdfs读取数据,计算结果又放到 hdfs上,涉及到i/o。同时shuffle机制也需要i/o,伴随数据迁移。耗费时间。
- spark相对而言,将mapreduce的计算过程需要的数据尽量的放到内存,当达到一定阈值才往磁盘里写;
- 另外spark计算引擎会根据RDD的依赖关系,生成DAG,由于对RDD的计算是惰性的,在Spark实际执行任务的时候,才会去加载数据,就能做到数据在被需要时加载。
应用场景: 各种实时处理,离线处理, 各种推荐系统
能将各种类型的数据源转换成统一的RDD格式,通过RDD的格式进行各种数据操作。
Spark原理:
master:负责资源的调度和分配
worker:负责资源分配和Executor的启动执行任务及对executor的监控
Executor:负责创建线程启动任务,执行。
Driver;就是一个驱动类,这个驱动类是启动main进程(main是整个程序的入口)
Spark生态圈:
RDD:
RDD是一个分布式的,弹性的数据集,是spark应用中最基本的统一的数据格式单位
RDD分区就是一段连续的数据片
不同的数据源,要统一格式,而这个统一的格式就是RDD。
由RDD1转换为RDD2,再到RDD3,计算过程中并不直接计算具体的数据,只是计算这个代表而已。而这种转换关系就叫依赖关系。
依赖关系:包括宽依赖和窄依赖
宽依赖:父RDD是和子RDD一对一的关系
窄依赖:父RDD是和子RDD多对多的关系
RDD是可以读取的,RDD是不可以修改的,只能对RDD进行转换,转换成新的RDD。
DAG有向无环图
每一个这样的图就是一个DGA有向无环图
遇到宽依赖及断开,这样就形成一个stage
每个DGA转换我spark当中的Job
每个作业Job划分出多个stage
每个stage对应一个task的集合TaskSet
每个task会在每个分区执行一个实例
spark开发编程就是创建rdd,转rdd,计算生成结果的过程。
创建我们的上下文内容
通过上下文内容进行创建RDD
RDD的创建方式:
通过parallelize并行化创建(parallelize一般用于自己开发测试使用)
通过textFile()读取外部数据创建RDD
map():就是将每个数据进行函数操作
foreach:就是对每个对结果数据进行操作,它是行动算子,触发操作
collect:行动算子,触发操作
saveAsTextFile:行动算子,触发操作
RDD算子:两类
转换操作-->懒操作只是将RDD转换成新的RDD
行动操作-->Action操作或触发操作,生成结果。
转换算子:
map filter mapValues keys values persist
reduceByKey groupByKey sorteByKey 经常发生shuffer
行动算子:
collect count take first saveAsTextFile foreach
共享变量:
广播变量:定义后不用原理的变量,使用广播变量
广播变量可以在多个任务之间使用,可以在不同的服务器之间使用。
避免多个服务器数据重复
取值使用value
累加器: 使用上下文变量sparkContext对象sc调用accumulator方法创建累加器。
使用累加器对象调用add方法,对数据进行累加。
累加器可以在不同的任务之间使用,可以在不同的服务器之间使用。
取值方式使用value