迭代计算
mapreduce中间结果处理太慢
大量磁盘IO开销/序列化和反序列化开销
不等数据落地
管道化处理
rdd本质是一个只读的分区记录集合
高度受限共享内存模型
生成新rdd来修改
算子只能一次针对rdd全集进行转换
不适合细粒度修改(单条修改),不适合网页爬虫
惰性调用机制(只记录转换轨迹)
遇到动作算子的时候才会触发计算,执行转换操作
rdd间的血缘关系实现高容错性
通过寻亲恢复数据
checkpoint不保留血缘关系(新建一个job)
保留血缘关系有一定的性能开销
lineage血缘容错
宽依赖子rdd丢失要重算所有的父rdd,冗余计算开销,建议加checkpoint
缓存由于内存不足可能被删除,只在调用action算子的时候进行缓存(checkpoint同理)
分区并行
rdd通过SparkContext生成DAG图
DAG提交给DAGScheduler把任务分阶段
分配给TaskScheduler,分发给workernode,excutor进程
集群模式 standalone/yarn/mesos
SparkContext指挥官
rdd创建:从文件系统中加载数据/通过并行集合创建数据
rdd编程SparkCore
flatMap两步操作,map/拍扁
groupByKey可迭代类型
键值对k:v
分区:增加并行度/减少通信开销
HashPartitioner/RangePartitioner/自定义分区
reduceByKey等价于groupByKey+sum
因为并行度所以有分区
并行度一般设置为cpu核心数的2-10倍
sql语句-抽象语法树-查询块-逻辑查询计划=重写-物理计划-选最优查询策略
HQL-抽象语法树(AST)-Spark SQL-Catalyst(函数式关系查询优化框架)
支持结构化数据/半结构化数据/非结构化数据管理能力能+机器学习算法的数据处理能力
Dataframe使Spark具备了处理大规模结构化数据的能力
SparkSession对象是Spark SQL的指挥官
Spark SQL查询结果被封装在Dataframe中
Spark SQL优化 断言下推: 先执行filter操作,减少shuffle的数据量
列值裁剪: 裁剪掉其他用不到的列
AST生成元数据
为什么要使用数仓?
1. 分析不同数据源的数据
2. 将分析数据和事务数据分离(OLTP/OLAP)
3. 原始数据源不适合用来查询(NoSQL)
4. 提高数据分析的查询性能(创建汇总表)
分类/回归/聚类/协同过滤



