Spark比hadoop快的原因
1中间结果基于内存
2dag
3以线程为单位,开销更小(不确定)
Spark core:
弹性分布式数据集(Resilient Distributed Dataset,RDD )。RDD就是带有分区的集合类型
rdd的五大特性:
1由一系列partition组成
2算子作用在partition上
3rdd之间有依赖关系
4分区器作用在k,v格式的rdd上(分区:主要通过compute函数)
5partition提供计算位置,利于数据本地化
spark读取hdfs的数据的方法:
textfile,底层调用的是mr读取hdfs的方法(split的block对应rdd的partition)
弹性分布式数据集(RDD),他是一个弹性的,可分区的,分布式计算的集合。RDD允许用户在执行多个查询时显式地将工作集缓存在内存中,后续的查询能够重用工作集,这极大地提升了查询速度。
弹性的体现:
存储弹性:内存和硬盘可以互相切换
容错弹性:通过依赖关系,计算丢失自动恢复
计算弹性:partition可多可少
分布式的体现:
rdd的partition分布在多个节点
代码流程:
1、配置sparkconf
val conf = new sparkconf
conf.xxx
2、创建sparkcontext对象
val sc = new sparkcontext(conf)
val lines = sc.textfile(path="./xx/xx")
3、创建rdd,对rdd进行处理
4、action触发transformation执行
val rdd = lines.flatmap(one=>{one.split(" ")}).foreach(println)
5、关闭sparkcontext
sc.stop()
DAG:
原始RDD的通过一系列转换和执行来生成RDD之间的依赖关系,这个计算链就是逻辑上的DAG(有向无环图),lineage就是一条依赖关系,多条lineage可以组成DAG
针对RDD的算子操作,分三种:
一种是Transformation(变换),用来构建RDD血缘关系,属于懒操作,不会真正触发RDD的处理计算,比如map(一对一),flatmap(一对多),filter,groupbykey。
另一种是Actions(执行),它才会真正触发计算,一个action一个job。比如count,reduce,first,take(n),返回的不是rdd就可能是actions
持久化算子:将计算结果持久化到内存,不需要重复计算
cache:默认存在内存中
persist:手动指定级别
checkpoint: 持久化到指定目录,血缘关系非常复杂可以使用,可以切断依赖关系
宽依赖:子rdd分区与父rdd分区多对多,
窄依赖:子rdd与父rdd分区一对一
缓存作用:保存血缘关系
检查点:血缘关系太长而设置,类似于快照
任务分为app,job,stage,task