对于前面已经学习过的MapReduce我们应该已经有了一个大致的了解。然而回顾MapReduce,会发现这是一个简单但是功能很单一的框架,因为它仅有Map和Reduce两个语义操作。为了进行更多更复杂的操作,出现了Spark.
Spark是什么?
与Hadoop相比,它多了更多的语义操作,而且不需要安装额外的组件(像Hive)就可以进行更多场景的处理。同时它也可以直接与内存进行交互,也就是说处理速度比与磁盘进行交互的Hadoop更快的。Spark是一个由UCB的AMP实验室提出的在一个统一框架下,实现批处理、流处理、交互式计算、机器学习为一体的计算框架。
Spark能做什么?(组成)
All in One框架,Spark提供多种计算场景。其底层是Spark Core(核心计算框架)做批处理运算.
- Spark SQL: 将SQL转换成Spark Core
- Spark Streaming: 将流处理转换成批处理,微批处理——批处理间隔时间短
- Spark MLib: 机器学习
- Spark GraphX: 图计算
Spark可以通过on Yarn模式提交到Hadoop当中运算。还有更多的运行模式,所以就显得扩展很强大。
Spark编程
Spark基于RDD进行计算。
RDD
弹性分布式数据集(Resilient Distributed Datesets).
- 分布在集群中的只读对象集合,处理完需要新开一个RDD来保存结果。
- 由多个Parition组成
- 通过转换操作构建
- 失效后自动重构,每一个RDD都存在内存当中,因此失效后不需要重头进行运算,只需要找到上一个RDD的内存重新执行处理
- 存储在内存或磁盘中
例:词频统计
// sc对象 - SparkContext() - Spark上下文对象
val rdd1 = sc.textFile("hdfs://in") // textFile()读取文件
val rdd2 = rdd1.flatMap(_split("\t")) // 将每一行数据按照\t进行拆分,新的集合保存在rdd2当中
val rdd3 = rdd2.map((_, 1)) // 给每个单词标注1 存在rdd3当中
val rdd4 = rdd3.reduceByKey((_+_)) //按照key值进行reduce _+_为scala语法,表示进行累加求和
rdd4.saveAsTextFile("hdfs://out") //保存到hdfs当中
RDD过程可以构成一个有向无环图(DAG)
RDD操作
Transformation 转换
- 将Scala集合或Hadoop输入数据构造成一个新RDD
- 通过已有的RDD产生新的RDD
- 惰性执行:只记录转换关系,不触发计算
- e.g. map, filter, flatmap, union, distinct, sortbykey
Action 动作
- 通过RDD计算得到一个或一组值
- 触发计算
- e.g. first, count, collect, foreach, saveAsTextFile
RDD依赖
partition一对一进行转换,被称为窄依赖;多对一进行转换,被称为宽依赖。
宽依赖中间一定走shuffle,恢复比较慢。因此需要尽量避免使用宽依赖。e.g. 按照key值进行排序的操作
Spark程序运行框架
在Driver当中执行代码解析,在Executor中进行任务执行。
Dirver包含:生成逻辑查询计划、生成物理查询计划、任务调度。
具体流程:
- 客户端向Master提交请求
- Master分配Worker运行资源,运行作业管理进程
- worker运行Driver,driver向master提交资源申请,master以executor形式分配资源
- 执行运算过程中,task(worker当中)向driver实时进行汇报
- task汇报作业完成,driver向master汇报,master释放所有资源。
Spark作业提交模式
- Local模式
单机运行,用于测试。Spark程序已多线程方式直接运行在本地。 - Standalone模式
Spark集群独立运行,不依赖与第三方资源。Driver在Worker中运行,Master只复杂集群管理。 - OnYarn模式