这是我参与「第四届青训营 」笔记创作活动的第4天
大数据处理链路
数据源 -> 采集 -> 存储 -> 处理 -> 分析 -> 应用
Spark
Spark 是一种与 Hadoop 相似的开源集群计算环境,Spark 启用了内存分布数据集,除了能够提供交互式查询外,它还可以优化迭代工作负载。
- Spark Core:Spark核心组件,提供了Spark最基础与最核心的功能,包含任务调度、内存管理、错误恢复、与存储系统交互等模块。
- Spark SQL:用来操作结构化数据的核心组件,通过Spark SQL可以直接查询Hive、HBase等多种外部数据源中的数据。
- Spark Structured Streaming:Spark提供的流式计算框架,支持高吞吐量、可容错处理的实时流式数据处理。
- MLlib:Spark提供的关于机器学习功能的算法程序库,包括分类、回归、聚类、协同过滤算法等,还提供了模型评估、数据导入等额外的功能。
- GraphX:Spark提供的分布式图处理框架,拥有对图计算和图挖掘算法的API接口以及丰富的功能和运算符。
Spark特点
- 基于内存,所以速度快,但同时也是缺点,因为Spark没有对内存进行管理,容易OOM(out of memory内存溢出),可以用Java Heap Dump对内存溢出问题进行分析
- 可以使用Scala、Java、Python、R等语言进行开发
- 兼容Hadoop
Spark支持的部署模式:
- Local模式:在本地部署单个Spark服务。
- Standalone模式:Spark自带的任务调度模式。(国内常用)
- YARN模式:Spark使用Hadoop的YARN组件进行资源与任务调度。(国内最常用)
- Mesos模式:Spark使用Mesos平台进行资源与任务的调度。(国内很少用)
RDD依赖
RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据抽象,代表一个不可变、可分区、里面的元素可并行计算的集合。
RDD特点
- 分区
- 只读
- 依赖
- 持久化(缓存)
RDD依赖就是描述父子RDD之间的依赖关系(Lineage) - 窄依赖:父RDD的每一个partition只对应一个子RDD分区。
- 宽依赖:父RDD的每一个partition可以对应多个子RDD分区。
业界挑战与实践
- Shuffle稳定性问题
解决:远端存储数据;map和reduce端在partition的数据尽可能在shuffle时就聚合,减少排序操作 - SQL执行性能问题:压榨CPU资源
解决:向量法/Codegen/两者结合 - 参数推荐/作业诊断
解决:自动参数推荐/作业诊断