Spark的构成
Spark Core(spark核心)
Spark Sql(操作结构化数据的组件)支持多数据源
Spark Streaming 实时流计算
MLlib机器学习
GraphC 面向图计算的框架和算法库
spark的三种模式
standalone apacheMersos hadoopYarn
sparkSession 包括 SparkContext sql_ hive_ Streaming_
task job stage
¥¥¥¥¥¥¥¥划重点
RDD 弹性分布式数据集 数据结构,可做数据变换
把一些rdd存起来,为了在后面rdd被挤掉后,避免spark的充分计算(优化)
不可变 可分区 可并行计算 可恢复(前后依赖,可根据依赖关系恢复)
rdd:一组分片,一个计算每个分区的函数、也就是算子,rdd的依赖关系(宽依赖窄依赖)
00,分区器,优先位置(移动数据不如移动计算)
创建rdd的两种方式:
并行化已存在的一个scala集合 makeRDD 例:val users=sc.parallelize(Array(“1”,“2”,“3”,“4”,“5”))
引用一个外部存储系统的数据集 textfile
¥¥¥¥¥¥¥¥
依赖关系分类:
窄依赖:一个父分区对应一个窄分区(独生)Narrow Dependency 没有shuffle(没有节点间的) 当前环境
宽依赖:一个父分区有多个子分区(父分区被拆分)有shuffle
wide Dependency 宽变换 排序都是 分区间的操作
distinct(去重复)toSet 尽量放在操作最前面
reduceByKey(+) combineByKey 先局部在全局
groupByKey(全局) sortByKey(False)降序 intersection(交集)
rdd的join(都是基于key的,key,value)
如果是宽变换,考虑较少shuffle的量
users.mapPartitionsWithIndex((idx,iter)=>if(idx==0)
iter else Iterator()).collect 查看分区里的元素
rdd分类
Transformation 数据变换 lazy operations
distinct System.gc() filter(过滤) sample(抽样) union(并集)
map flatMap(扁平集合) 接受一个参数,返回一个集合或迭代器
actions(行为) 是non-lazy operations 非延迟执行
count collect foreach saveAsTextFile first
take(提取几个元素放太多,会导致太多数据进入driver node,导致内存溢出)
map和flatMap的区别
map一对一
flatMap一对多 (合并数组) 窄变换
在使用时map会将一个长度为N的RDD转换为另一个长度为N的RDD;
而flatMap会将一个长度为N的RDD转换成一个N个元素的集合,
然后再把这N个元素合成到一个单个RDD的结果集。
spark和MapReduce的对比优势:
1、减少磁盘IO
mr :基于磁盘
Spark:基于内存(临时内存数据缓存在内存中)
2、增加并行度
mr:MapTask ReduceTask JVM Task 一个进程一个Task
Spark:ShuffleMapTask TesultTask 使用一个线程执行
一个操作系统可以并发运行多个线程,一个线程可以并发运行多个进程
3、避免重复计算
spark:可以把比较复杂或重复使用的计算强制持久化到内存中,以供其他task使用
4、可选的shuffle和排序
可选的shuffle
mr:提供的是一种通用的shuffle
Combiner Partitioner Sorter shuffle的策略是一个固定的套路
如果设置了Combiner会执行Combiner
如果设置Reduce Task的个数超过1,那么Partitioner就一定会执行
如果有Reduce阶段,那么Sorter的数据排序就一定会执行
使用一个统一的编程模型解决了个计算的通用性问题
spark的shuffle:
四种shuffle策略
5、灵活的内存管理策略
mr:MapTask JVM在启动的时候就指定了最多能使用的多少内存,超过,OOM
Spark:堆内内存可以借用堆外内存
SparkContext(在Driver里面)
DAGScheduler(创建job,划分Stage) DAG:有向无环图
TaskScheduler 负责进行任务的派发
storm—>一条数据处理一次(细粒度)
sparkStreaming —>一小段时间内的所有数据处理一次(粗粒度)
Driver node(sparkContext) Cluster manager(资源管理器)
sparkContext(一个jvm只能有一个)作用主要是连接上述两个work node
DAG 不可迂回 数据的一系列计算 (rdd的变换生成图)
stage逻辑执行计划 --takeset–tasks(任务) 执行完执行下一个
Shuffle(打乱重新分配) 分配不均 尽可能避免,或减少
Pull-based(内存满了,写在本地硬盘里)
默认情况下,shuffle不会改变分区
spark优化
先去重,过滤 少用groupby reduceByKey
rdd优化
Cache/Persist rdd缓存到内存或disk硬盘里, lazy,persist
缓存后可以不再依赖最原始的数据 后面用到缓存(shuffle后缓存)
persist(参数) .unpersist()释放缓存
Memory_only Memory_and_disk(default)==cache
Memory_only_ser(序列化) Memory_Only_2备份
partiton size(128)
Broadcast广播 变量(小数据集)广播到work node,本地计算更快
map-set-join 把小表广播到大表里,本地计算,速度快
checkpointing
setCheckpointDir防止程序意外中止,disk再次开启后可以继续读取
正常退出spark自动删掉
(rdd lineage 生成步骤)
checkpoint 和 persist的区别 不正常退出
persist建立的文件程序会自动回收,包含rdd lineage
checkpoint生成的文件需要手动删除 不包含rdd lineage只存数据
hdfs里的
inputSplits() 解决物理分块输入拆分的问题 是逻辑分块
查看hdfs里的分块 hdfs fsck /input/sss.tgz -files -blocks
文件不是很大的情况,物理分块和逻辑分块都是一致的
spark可以决定分块数 sc.textFile(路径,[分块数])
events.partitions.size
分块数不能给太少,会出现数据溢出
解决数据倾斜
.repartition(20)重新定义分区(会生成一个新的rdd)/加索引
分块 - 分区–shuffle(交换)–分块
spark具体实例:
spark词频统计
val wc=sc.textFile("/input/little_prince.txt").flatMap(line=>line.split(" “)).map(w=>(w,1)).reduceByKey(+)
.map(x=>x.swap).sortByKey(false).map(x=>x.swap).take(10)
filter(x=>x.2>100)控制出现次数 !=""
次数出现 paralize方法将一个集合转换成rdd
sc.parallelize(Array(“we are we”)).flatMap(x=>x.split(" ")).
map(x=>(x,1)).reduceByKey(+).filter(x=>x.2>1).collect
集合里最大值
s1.reduceByKey(scala.math.max(,)).collect
scala读文件时,如何去除头部
t.mapPartitionsWithIndex((idx,iter)=>if (idx==0)
iter.drop(1) else iter
spark-submit提交spark任务
spark读csv,json
val df=spark.read.format(“csv”).option(“delimter”,”,").
option(“header”,“true”).load(“file:///home/test.csv”).
select(“1”,“2”,“3”,“4”,“5”).show
spark.read.format(“com.databricks.spark.avro”).load()