Spark系列文章:
大数据 - Spark系列《一》- 从Hadoop到Spark:大数据计算引擎的演进-CSDN博客
大数据 - Spark系列《二》- 关于Spark在Idea中的一些常用配置-CSDN博客
大数据 - Spark系列《三》- 加载各种数据源创建RDD-CSDN博客
目录
Spark分布式运行原理
1)编程抽象类 RDD
2)分区数据处理
3)统一的数据处理逻辑
4) 统一的结果类型
延申:关于Spark默认并行度spark.default.parallelism的理解
1. 设置方式: 可以通过Spark配置项进行设置
2. 影响因素
Spark面试题总结:
1. Spark是什么,用于什么场景?
2. Spark的优点
3. Spark为什么比MR效率高?
4. Spark编程核心步骤
5. Spark运行模式有哪些?(.setMaster方法)
6. RDD是什么?
7. 创建RDD的方式有哪些?
Spark作为一种分布式计算引擎,能够高效地处理大规模数据,其分布式运行的原理主要基于以下几个方面:
Spark中的核心概念之一是弹性分布式数据集(RDD),它是一种抽象的数据结构,代表分布在集群中的数据集。RDD具备分区的特性,每个分区可以看作是并行处理的单元,Spark会以分区为单位创建任务实例,从而实现分布式运行计算。目前可以理解RDD为带有分区信息和算子计算逻辑的迭代器
创建一个RDD 到底有几个分区(并行)?
1. 加载文件源头RDD
当通过加载文件等方式创建RDD时,RDD的初始分区数由Spark根据输入数据的大小和集群配置自动确定。通常情况下,如果没有特别指定,Spark会尽可能地将数据分成多个分区,以提高并行度和性能。对于文件加载的源头RDD,默认情况下至少会有2个分区。
2. 调用算子返回的RDD
当对一个RDD调用转换算子(transformation)时,返回的新RDD的分区数通常与父RDD的分区数保持一致。
在Spark分布式运行中,各个分区处理属于自己的数据任务。每个任务会被分配到不同的节点上执行,并且各个分区的计算逻辑是一致的,这样就可以保证在不同节点上的并行计算结果是一致的。
在处理数据的过程中,Spark提供了丰富的方法和算子来对RDD进行各种操作,例如map、flatMap、reduce等。这些操作符能够灵活地应用于各个分区的数据上,并且具有统一的数据处理逻辑,从而保证了整个作业的一致性。
最终,在分布式运行完成后,各个分区处理的结果会被合并成一个统一的RDD。这样就保证了返回的结果类型是一致的,可以进一步进行后续的操作和分析。
spark.default.parallelism
是指RDD任务的默认并行度,即RDD中的分区数。它对Spark作业的并行执行有着重要影响。
val conf = new SparkConf()
.set("spark.default.parallelism", "500")
父RDD分区数: 当初始RDD没有设置分区数(numPartition
或numSlice
)时,默认并行度取决于spark.default.parallelism
的值。
分布式shuffle操作: 在使用reduceByKey
、join
等分布式shuffle算子操作时,reduce端的stage默认取spark.default.parallelism
配置项的值作为分区数。
没有shuffle的算子: 对于没有shuffle的算子,在创建RDD又没有设置分区数时,默认并行度依赖Spark运行的模式:
本地模式: 默认并行度取决于本地机器的核数。
--local: 没有指定CPU核数,则所有计算都运行在一个线程当中,没有任何并行计算--local[K]:指定使用K个Core来运行计算,比如local[2]就是运行2个Core来执行
--local[*]: 自动帮你按照CPU的核数来设置线程数。比如CPU有32个逻辑处理器,Spark帮你自动设置32个线程计算。
集群模式: 默认并行度为8。
目前Spark系列文章已经更新到第四篇,Spark第一阶段学习也已经完成。对此,特对知识点做了一个汇总如下
Spark是一站式分布式计算引擎,主要用于离线处理
1)比MR效率高
2)API丰富,可以实现复杂度处理逻辑
3)功能组件丰富,满足各种处理需求场景
4)支持多语言编程
1)减少了与HDFS的交互的次数
2)减少了作业初始化的流程
3)开发高效
1)编程环境
2)加载各种数据源
3)使用算子处理数据
4)保存结果
1)本地测试
2)yarn集群
3)自带的集群模式
RDD是弹性分布式数据集,它是一种抽象的数据结构,可以理解为带有分区信息和算子计算逻辑的迭代器。
1)读文件
2)本地集合用makerdd方法转换成rdd
3) 读数据库