Spark学习知识点总结

本文详细介绍了Spark的基础知识,包括YARN资源调度、HDFS、MapReduce、Hive的区别、Spark与MR的不同、任务提交流程、算子应用、RDD编程进阶、SparkSQL和SparkStream。重点讲解了面试常问问题,如算子区别、数据倾斜处理方法等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

文章目录

一、基础知识:

在这里插入图片描述

1、yarn:资源调度框架

2、hdfs(Hadoop Distribute File System),基于“磁盘”的

3、Hadoop MR:map ->shuffle -> reducer

注意:有shuffle就会有磁盘IO,就会有不同节点传输

4、Hive:是一个数据仓库

在这里插入图片描述

5、spark与MR区别?

1)MR基于磁盘,spark基于内存(指某些步骤基于内存,而不是全部基于内存)

2)spark有DAG(有向无环图),eg:一个蛋糕分10块,用10人去吃,或者1个job划分很多小块儿,每一个用小块儿一组task去处理

在这里插入图片描述

6、java中SparkConf设置参数介绍

在这里插入图片描述

7、RAM = 内存

8、Spark任务提交**

在这里插入图片描述

Yarn是hadoop圈里的资源调度框架,它的主节点是resourManager,从节点是nodeManager,standalone是spark自带的资源调度框架,worker就是它的从节点,主节点是master,主节点管理worker从节点。

注意:无论是master还是work都是一个jvm进程

1个application会去创建一个driver的jvm进程 -> 然后driver会向集群中worker发送task并回收results,结果保存在driver的JVM内存中,如果results过大,不建议存回收到driver中,会出现OOM问题(Out Of Memory:内存溢出问题)。

9、spark任务流程及算子

在这里插入图片描述

总结上图:Transformation算子 RDD -> RDD

Action算子 RDD -> 非RDD

流程:

sparkConf -> sparkContext(是通往集群的唯一通道) -> 加载RDD -> 对RDD使用Transformation算子对数据进行转换 -> Action触发执行Transformation算子 -> 最后关闭

注意:Transformation算子属于“懒加载”,其中“懒加载”算子指的是它不会去执行,必须由Action触发执行。

(Action算子:foreach()、count()、first(0、take(int)),take(x)用于取前x行

一个application包含多个job,其中job数量决定于Action算子多少。

11、算子

在这里插入图片描述

在这里插入图片描述

Persist():可以设置持久化级别

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

注意:cache()、persist()、checkPoint()都是懒加载算子,需要Action算子触发执行

12、standalone

12.1 standalone-clent模式提交任务流程

在这里插入图片描述

12.2 standalone-cluster 模式提交任务流程

在这里插入图片描述

13、yarn

13.1 yarn-client模式提交任务流程

在这里插入图片描述

13.2 yarn-cluster模式提交任务流程

在这里插入图片描述

在这里插入图片描述

15、spark pipeline计算模式

在这里插入图片描述

16、spark资源调度和任务调度

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

17、ETL?= 抽取+转换+加载

ETL = extract + transform + load

用来描述将数据从来源端经过抽取(extract)、转换(transform)、加载(load)至目的端的过程。

20、kafka

在这里插入图片描述

20.1 kafka概述

20.2 定义

在这里插入图片描述

20.3 消息队列

在这里插入图片描述

在这里插入图片描述

20.4 kafka架构

在这里插入图片描述

20.5 kafka生产者

在这里插入图片描述

20.6 ack和isr

Ack:决定数据丢不丢,分0/1/-1 3个级别

Isr:存储和消费一致性 hw 和leo

ISR全称是“In-Sync Replicas”,也就是保持同步的副本,他的含义就是,跟Leader始终保持同步的Follower有哪些。

spring.kafka.producer.acks=1

https://blog.csdn.net/zhongqi2513/article/details/90476219

21、spark历史

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

22、spark内置模块

在这里插入图片描述

23、Spark WordCount

在这里插入图片描述

24、Spark RDD

24.1 介绍流

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

24.2什么是RDD

在这里插入图片描述

在这里插入图片描述

注意:RDD中partition的数量由父类的bolck数量决定,而RDD2的partition数量由父类RDD1的partition数量决定

在这里插入图片描述

24.3 RDD属性

在这里插入图片描述

在这里插入图片描述

24.4 RDD创建

在这里插入图片描述

在这里插入图片描述

24.5 RDD的转换

第一种: Value类型交互
map算子

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

mapPartitions算子

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

mapPartitionsWithIndex(分区索引)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

flatMap

在这里插入图片描述

在这里插入图片描述

glom算子

在这里插入图片描述

在这里插入图片描述

groupBy算子

在这里插入图片描述

在这里插入图片描述

filter算子

在这里插入图片描述

在这里插入图片描述

sample算子

注意:seed可理解给数随机打分,fraction代表标准,大于标准留下小于标准舍弃。

在这里插入图片描述

在这里插入图片描述

distinct算子

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

coalesce算子

在这里插入图片描述

在这里插入图片描述

区别partition & task

在这里插入图片描述

repartition算子

在这里插入图片描述

coalesce 和repartition区别

在这里插入图片描述

第二种:双Value类型交互
union算子

在这里插入图片描述

subtract算子

在这里插入图片描述

intersection算子

在这里插入图片描述

zip算子

在这里插入图片描述

partitionBy算子

在这里插入图片描述

在这里插入图片描述

groupByKey算子

在这里插入图片描述

reduceByKey算子

在这里插入图片描述

区别reduceByKey和groupByKey

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

aggregateByKey算子

在这里插入图片描述

在这里插入图片描述

foldByKey算子

在这里插入图片描述

combinByKey算子

在这里插入图片描述

sortByKey算子

在这里插入图片描述

mapValues算子

在这里插入图片描述

cogroup算子

在这里插入图片描述

第三种:action算子
reduce算子

在这里插入图片描述

collect算子

在这里插入图片描述

count算子

在这里插入图片描述

first算子

在这里插入图片描述

take算子

在这里插入图片描述

takeOrdered算子

在这里插入图片描述

aggregate算子

在这里插入图片描述

fold算子

在这里插入图片描述

saveAsTextFile算子

在这里插入图片描述

SaveAsSequenceFile算子

在这里插入图片描述

saveAsObjectFile算子

在这里插入图片描述

countByKey算子

在这里插入图片描述

foreach算子

在这里插入图片描述

24.6 RDD编程进阶

1.累加器

在这里插入图片描述

在这里插入图片描述

举例求和,思考为什么?

在这里插入图片描述

在这里插入图片描述

答案:因为没有回传,所以sum一直为0

另一种实现方式 -> 创建累加器

在这里插入图片描述

2.广播变量

在这里插入图片描述

在这里插入图片描述

24.7 RDD的宽窄依赖

在这里插入图片描述

25、 sparkSQL

25.1 什么是sparkSQL

在这里插入图片描述

25.2 谓词下推

在这里插入图片描述

25.3 创建DataFrame

在这里插入图片描述

在这里插入图片描述

25.4 scala中RDD、DataFrame、DataSet转换

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

25.5 java中RDD、DataFrame、DataSet转换

rdd -createDataFrame()-》df -as(personEncoder)-》ds -toDf()-》df -rdd()-rdd

public static void main(String[] args) throws AnalysisException {
    SparkSession spark = SparkSession
            .builder()
            .master("local")
            .appName("SparkSQL")
            .getOrCreate();
    JavaSparkContext sc = JavaSparkContext.fromSparkContext(spark.sparkContext());

    User user1 = new User("damao", 20);
    User user2 = new User("cat", 18);
    List<User> list = Arrays.asList(user1, user2);
    //创建RDD
    JavaRDD<User> userRDD = sc.parallelize(list);

    //1.rdd<User> -> dataset<Row>
    /*
     createDataFrame 必须RDD泛型为对象而不是row
     */
    Dataset<Row> datasetRow = spark.createDataFrame(userRDD, User.class);
    datasetRow.show();
    //2.Dataset<Row> -》 RDD<Row>
    RDD<Row> rdd = datasetRow.rdd();

    /*
     使用createDataset 必须RDD泛型为对象而不是row
     */
    Encoder<User> personEncoder = Encoders.bean(User.class);
    Dataset<User> dataset = spark.createDataset(userRDD.rdd(), personEncoder);
    dataset.show();
    //Dataset<Row> -> Dataset<User>
    Dataset<User> datasetUser = datasetRow.as(personEncoder);
    //3.Dataset<User> -》  RDD<User>
    RDD<User> rddUser = datasetUser.rdd();
    //4.Dataset<User>  -》 Dataset<Row>
    Dataset<Row> datasetRow2 = datasetUser.toDF();

    spark.stop();
}

25.6 sparkSQL数据源

1.通用加载/保存方法

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2. JSON 文件

在这里插入图片描述

3.Parquet文件

在这里插入图片描述

4.JDBC

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

5.Hive数据库

在这里插入图片描述

在这里插入图片描述

26、SparkStream

26.1 SparkStream是什么

在这里插入图片描述

在这里插入图片描述

26.2架构

在这里插入图片描述

在这里插入图片描述

26.3 sparkStream 初始化

在这里插入图片描述

26.4 Dstream创建

1.文件数据源

在这里插入图片描述

2.RDD队列

在这里插入图片描述

3.自定义数据源

在这里插入图片描述

26.4 Dstream转换

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

二、面试题

1.概述一下spark中常用算子区别(map,mapPartitions, foreach, foreachPartition)

在这里插入图片描述

2.map与flatMap的区别

在这里插入图片描述

在这里插入图片描述

3.RDD有哪些缺陷?

在这里插入图片描述

4.spark有哪些组件?

在这里插入图片描述

5.什么是粗粒度,什么是细粒度,各自的优缺点是什么?

在这里插入图片描述

6.driver的功能是什么?

在这里插入图片描述

7.spark中worker的主要工作是什么?

在这里插入图片描述

8.Spark shuffle时,是否会在磁盘上存储

答:会

9.spark中的数据倾斜的现象,原因,后果

在这里插入图片描述

10.spark数据倾斜的处理

在这里插入图片描述

11.spark有哪些聚合类的算子,我们应该避免什么类型的算子?

在这里插入图片描述

在这里插入图片描述

12.spark中数据的位置是被谁管理的?

在这里插入图片描述

13.RDD有几种操作类型?

在这里插入图片描述

14.spark作业执行流程

在这里插入图片描述

15.spark 的standalone模式和yarn模式的区别?

在这里插入图片描述

16.spark如何避免数据倾斜?

原因3点:1.null或者无效数据 2.无意义值,大量重复数据 3.有效数据

https://www.cnblogs.com/weijiqian/p/14013292.html

如果是前两种处理数据或者过滤即可,如果是第三种,则详细讨论,

方案一:提高suffle并行度

在这里插入图片描述

方案二:自定义Partitioner

在这里插入图片描述
在这里插入图片描述

方案三:将Reduce side Join转变为Map side Join

在这里插入图片描述

### Spark核心技术知识点总结 #### 1. **Spark概述** Spark 是一种高性能的分布式计算框架,主要用于大规模数据集上的快速计算。与 Hadoop 不同的是,Spark 提供了一个统一的计算引擎,支持批处理、流处理以及交互式查询等多种场景[^1]。 #### 2. **Spark架构组成** - **核心模块**: Spark Core 是整个 Spark 生态的基础组件,提供了任务调度、内存管理和错误恢复等功能。 - **计算模块**: - **Spark SQL**: 支持结构化数据的处理和分析,允许通过 SQL 或 DataFrame API 进行操作[^4]。 - **Spark Streaming**: 实现低延迟的流式数据处理功能,能够对接多种消息队列系统(如 Kafka 和 Flume)[^3]。 - **MLlib**: 提供机器学习算法库,适用于大规模数据分析和建模。 - **GraphX**: 面向图计算的应用程序设计,适合社交网络分析等领域。 - **存储层**: Spark 自身并不提供分布式文件系统的实现,通常依赖于外部存储系统(如 HDFS),但在运行过程中可以通过缓存机制将中间结果保存在内存中以提升性能[^2]。 #### 3. **RDD (Resilient Distributed Dataset)** 这是 Spark 中最基本的数据抽象形式,表示不可变的分区记录集合。主要特点如下: - 容错性:自动重新计算丢失的部分。 - 缓存能力:可以显式调用 `persist()` 方法来决定如何缓存 RDD 数据(磁盘/内存等)。如果希望强制写入硬盘作为检查点,则需单独设置逻辑并配合 checkpoint 功能完成[^5]。 #### 4. **DAG Scheduler** 有别于传统 MapReduce 的两阶段作业划分方式,Spark 使用 DAG(Directed Acyclic Graph)调度器动态规划复杂的多步转换流程,在减少不必要的 I/O 开销方面表现优异。 #### 5. **部署模式** 支持本地单机测试环境(`local`)外加集群环境下多种管理模式的选择,例如独立版 Standalone Cluster Manager 或者集成现有资源管理系统像 Apache Mesos/YARN 来分配节点资源给各个应用实例使用[^2]。 ```scala // 示例代码展示如何创建一个简单的 Spark 应用程序连接 MySQL 数据源 import java.util.Properties object MysqlConnector { def main(args: Array[String]): Unit = { val spark = SparkSession.builder() .appName("Mysql Connector Example") .config("spark.master", "local[*]") .getOrCreate() val jdbcUrl = "jdbc:mysql://localhost:3306/testdb" val connectionProperties = new Properties() connectionProperties.put("user", "root") connectionProperties.put("password", "") // Read data from a MySQL table named 'employees' val df = spark.read.jdbc(jdbcUrl, "employees", connectionProperties) df.show() spark.stop() } } ``` --- 问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘大猫.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值