Spark
Spark简介
MapReduce有较大的局限性
- 仅支持Map、Reduce两种语义操作
- 执行效率低,时间开销大
- 主要用于大规模离线批处理
- 不适合迭代计算、交互式计算、实时流处理等场景
计算框架种类多,选型难,学习成本高
- 批处理:MapReduce
- 流处理:Strom、Flink
- 交互式计算:Impala、Prestc
- 机器学习:Mahout
统一计算框架,简化技术选型
- 在一个统一的框架下,实现批处理、流处理、交互式学习、机器学习
- 由加州大学伯克利分校的AMP实验室开源
- 大规模分布式通用计算引擎
- Spark Core
- Spark SQL
- Spark Streaming
- Spark MLib
- Spark GraphX
- 具有高吞吐、低延时、通用易扩展、高容错等特点
- 采用Scala语言开发
- 提供多种运行模式
Spark RDD与编程模型
-
RDD
-
弹性分布式数据集(Resilient Distributed Dataset)
- 分布在集群中的只读对象集合
- 由多个Partition组成
- 通过转换操作构造
- 失效后自动重构(弹性)
- 存储在内存或磁盘中
-
Spark基于RDD进行计算
wordcount
-
-
RDD操作(Operator)
- Transformation(转换)
- 将Scala集合或Hadoop输入数据构造成一个新的RDD
- 通过已有的RDD产生新RDD
- 惰性执行:只记录转换关系,不触发计算
- 例如:map、filter、flatmap、union、distinct、sortbykey
- Action(动作)
- 通过RDD计算得到一个值或一组值
- 真正触发计算
- 例如:first、count、collect、foreach、saveAsTextFile
- 示例:RDD的两种操作
- rdd.map(_+1).saveAsTextFile(“hdfs://node01:9000”);
- Transformation(转换)
-
RDD依赖(Dependency)
- 窄依赖(Narrow Dependency)
- 父RDD中的分区最多只能被一个子RDD的一个分区使用
- 子RDD如果有部分分区数据丢失或损坏,只需从对应的父RDD重新计算恢复
- 例如:map、filter、union
- 宽依赖(Shuffle/Wide Dependency)
- 子RDD分区依赖父RDD的所有分区
- 子RDD如果部分或全部分区数据丢失或损坏,必须从所有父RDD分区重新计算
- 相对于窄依赖,宽依赖付出的代价要高很多,尽量避免使用
- 例如:groupByKey、reduceByKey、sortByKey
- 窄依赖(Narrow Dependency)
Spark程序运行架构
在Yarn中分配的Container中运行一个task
在Spark中分配的Executor中可以运行多个task
Spark作业提交模式
-
Local模式
- 单机运行,通常用于测试
- Spark程序以多线程方式直接运行在本地
-
Standalone模式
- Spark集群独立运行,不依赖于第三方资源管理系统,如:YARN、Mesos
- 采用Master/Slave架构
- Driver在Worker中运行,Master只负责集群管理
- ZooKeeper负责Master HA,避免单点故障
- 适用于集群规模不大,数据量不大的情况
-
YARN模式
-
YARN-Client模式:适用于交互和调试
-
YARN-Cluster模式:适用于生产环境
-
Spark作业解析与监控
-
生成逻辑查询计划(仅关注RDD的状态)
1 2 3 4 5
sc.textFile(inputArg) .flatMap(_.split("\t")) .map((_, 1)) .reduceByKey(_+_) .saveAsTextFile(outArg)
-
生成物理查询计划(关注底层,以宽窄依赖划分stage)
-
任务调度与执行
-
示例:DAG