本文介绍: 在本篇博客中,我们将深入探讨 Spark 分布式运行原理、面试题总结以及延伸知识点:关于Spark默认并行度spark.default.parallelism的理解

Spark系列文章:

大数据 – Spark系列《一》- 从Hadoop到Spark:大数据计算引擎的演进-CSDN博客

大数据 – Spark系列《二》- 关于Spark在Idea中的一些常用配置-CSDN博客

大数据 – Spark系列《三》- 加载各种数据源创建RDD-CSDN博客 

目录


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没有设置分区数(numPartitionnumSlice)时,默认并行度取决于spark.default.parallelism的值。

  • 分布式shuffle操作: 在使用reduceByKeyjoin等分布式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) 读数据库

 

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注