- Spark的逻辑处理流程主要分为四个部分:
- 数据源:可以是hdfs、分布式kv数据(Hbase)、本地文件等等
- 数据模型:RDD(分布式弹性数据集)是Spark的核心概念,即输入、输出、中间数据抽象表示为统一的数据模型
- 数据操作:主要分为transformation和action两种操作
- 处理数据的计算结果:以文件形式存储到hdfs文件系统或者计算结果汇集到driver端
- RDD是如何生成的?
Spark对程序中的每一个数据进行操作,比如transformation操作(map)就会生成新的rdd,对于复杂的操作(join)则会生成多个rdd
- 新的RDD分区数量是如何得到的?
用户和parent RDD两者共同决定新的RDD分区数量,比如用户可以通过repartion()和coalesce()决定新的RDD分区的个数;如果用户没有决定RDD的个数,那么新的RDD的个数由parent RDD分区个数的最大值决定
- 新的RDD和parent RDD之间的依赖关系有哪些?
根据新的RDD是否完全依赖parent RDD的一个或者多个分区可以定义新的RDD和parent RDD之间是宽依赖还是窄依赖。宽依赖关心仅仅依赖parent RDD分区中的某个部分而非全部,而窄依赖则依赖parent RDD分区中的整个部分。
- 为什么要划分RDD之间的依赖关系?
Spark会根据依赖关系把一个作业job划分为多个阶段stage,对于宽依赖和窄依赖而言,窄依赖对于作业的优化很有利,如果连续的变换操作序列都是窄依赖,就可以把很多个 fork/join 合并为一个,通过这种合并,不但减少了大量的全局路障(Barrier),而且无需保存很多中间结果RDD,这样可以极大地提升性能。
- Spark的三种分区方法
- 水平划分:一般针对输入数据采用这种分区办法,比如hdfs会对数据进行水平划分,按照128M的大小将数据划分为不同的分区
- Hash划分:使用record的hash值来对数据进行划分
- Range划分:根据元素的大小按照一定的区间进行分区
- 常用的数据操作
transformation和action