赞
踩
spark是一个开源免费的,通用的,可靠性的分布式计算框架,可用于处理海量的数据
Apache Spark™是用于大规模数据处理的统一分析引擎。
当发生shuffle时底层会产生大量的磁盘I/O,会降低整体的性能。此外还会产生大量的排序操作,耗费cpu,并且不能做到对中间结果集的服用,导致大量的重新计算,也会降低整体性能
所以spark在设计时,吸取了MapReduce的经验教训,做出相应的改进和优化,比如尽量减少shuffle的产生,减少不必要的排序,以及支持对结果集的复用
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DapSy1b7-1625794419087)(http://spark.apache.org/images/spark-stack.png)]
从上面可以看出,spark团队的目标是能够一栈式处理大数据所有场景:
常见的有三种
弹性分布式数据集。初学时,把RDD看做是一种集合,用于存储数据,类比于Array或List。RDD的特点在于:
RDD是Spark最核心的概念,需要把数据封装到RDD中,然后通过spark计算引擎进行处理
创建RDD的两种途径:
val r2 =sc.makeRDD(List(1,2,3,4),2)
2. 读取外部存储系统文件(Linux,windows,hdfs等等)将整个文件的数据变为RDD以性为单位进行处理,即一行是一条数据
3. 读取本地文件 val r4 = sc.textFile(“file:///home/1.txt”,2)
4. 读取hdfs文件:val r5 = sc.textFile(“hdfs://hadoop01:9000/1.txt”,2)
RDD的操作总分有三种
//单词统计
data.flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_)
DAG中记录了RDD之间的依赖关系,借助RDD之间的依赖关系可以实现数据容错,即某一个子分区
数据丢失时,找他对应的父分区结合依赖关系进行恢复
1)Spark在执行Transformation类型操作时都不会立即执行,而是懒执行(计算)
2)执行若干步的Transformation类型的操作后,一旦遇到Action类型操作时,才会真正触发执行(计算)
3)执行时,从当前Action方法向前回溯,如果遇到的是窄依赖则应用流水线优化,继续向前找,直到碰到某一个宽依赖
4)因为宽依赖必须要进行shuffle,无法实现优化,所以将这一次段执行过程组装为一个stage
5)再从当前宽依赖开始继续向前找。重复刚才的步骤,从而将整个DAG还分为若干的stage
stage(阶段),本质上一组task的集合,一个分区对应一个task,连续窄依赖会出现流水线优化
一个分区对应一个task,一个action执行对应一个job
一个app(Application)应用程序,一个Ap至少有一个job
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。