当前位置: 首页 > news >正文

Spark+Hive中间件

Spark

Spark入门教程(非常详细)从零基础入门到精通,看完这一篇就够了-CSDN博客

基础

Spark是用来代替Hadoop中的MapReduce,其存储依然用的是Hadoop,但中间结果可以存放在内存中。MapReduce仅支持Map+Reduce且不适合迭代计算、交互计算、实时流处理。

提出了RDD模型:容错并行的数据结构,运行用户将中间结果数据集保存在 内存 中,并且通过控制数据集的分区来达到数据存放处理最优化

类型HadoopSpark
定位分布式基础平台,包含计算、存储、调度分布式计算工具
适用场景大规模数据集上的批处理迭代计算、交互式计算、流计算
成本对机器要求低,便宜对内存有要求,相对较贵
编程范式Map+Reduce, API 较为底层,算法适应性差RDD 组成 DAG 有向无环图,API 较为顶层,方便使用
数据存储结构中间计算结果存在 HDFS 磁盘上,延迟大中间运算结果存在内存中,延迟小
任务运行方式Task 以进程方式维护,任务启动慢Task 以线程方式维护,任务启动快

结构:Spark Core 核心计算框架、Spark SQL:结构化数据查询、Spark Streaming:实时流处理、Spark MLib机械学习、Spark GraphX:图计算

Sprak Core:RDD

(Resilient Distributed Dataset)叫做弹性分布式数据集,是 Spark 中最基本的数据抽象,代表一个不可变、可分区、里面的元素可并行计算的集合

创建方式:

  • 外部存储系统的数据集创建
  • 已有的RDD经过算子转化
  • Scala集合创建

算子:

  • Transformation 转化操作:返回一个新的RDD
  • Action 动作操作:返回值并不是RDD

持久化:

persist方法或cache方法将计算结果缓存,这两种方法并不是调用会被立即缓存,而是会出触发action才会缓存。注意:通过查看 RDD 的源码发现 cache 最终也是调用了 persist 无参方法(默认存储只存在内存中):

存储级别:

  • 默认:将RDD以非序列化的java对象存储在JVM中,如果没有足够内存,则某些分区不会被缓存
  • MORY_AND_DISK:在默认条件下,将溢出的数据写入磁盘
  • 将RDD以序列化的java对象存储

容错机制:重点

持久化局限性:将缓存放在内存,虽然快但数据容易丢失;放在磁盘也有可能损坏

容错机制就是未了解决上述问题,直接将数据放在HDFS里面。这样程序运行结束后,其处理的数据依然存在。持久化方法会删除。

依赖关系:

  • 宽依赖:父 RDD 的一个分区只会被子 RDD 的一个分区依赖;必须等到上个阶段计算完成才能计算下一个阶段。
  • 窄依赖:父 RDD 的一个分区会被子 RDD 的多个分区依赖(涉及到 shuffle);多个分区可以并行计算;分区数据丢失只需要重新计算就行。

DAG:有向无环图

数据转换执行的过程,有方向,无闭环(其实就是 RDD 执行的流程)

DAG 的边界:

  • 开始:通过 SparkContext 创建的 RDD;
  • 结束:触发 Action,一旦触发 Action 就形成了一个完整的 DAG

一个 Spark 程序可以有多个 DAG,一个 DAG 可以有多个 Stag,同一个 Stage 可以有多个 Task 并行执行,只 reduceByKey 操作是一个宽依赖,从 textFile 到 flatMap 到 map 都是窄依赖。

Spark SQL

Hive 是将 SQL 转为 MapReduce。

SparkSQL 可以理解成是将 SQL 解析成:“RDD + 优化” 再执行

数据分类:

  • 结构化数据:有固定的schema、 如:表格
  • 半结构化数据:无固定的schema,但有结构 如:文件格式JSON
  • 非结构化数据:无固定的schema,无结构、如:图片音频

RDD 主要用于处理非结构化数据 、半结构化数据、结构化;

SparkSQL 主要用于处理结构化数据(较为规范的半结构化数据也可以处理)。

抽象数据:

特性Spark RDDSpark DataFrameSpark Dataset
本质弹性分布式数据集基于 RDD 的分布式数据集合,按命名的列组织DataFrame API 的扩展,强类型
数据表示JVM 对象的集合Row 对象的集合(可理解为无类型的 JVM 对象)强类型 JVM 对象的集合(如 Dataset[Person]
序列化效率较低(Java 序列化或 Kryo)高(Tungsten 二进制格式 + off-heap)高(同 DataFrame)
优化方式,开发者需自行优化,Catalyst 查询优化器(逻辑/物理优化)(同 DataFrame)
执行效率较低高(Tungsten 优化执行引擎)高(同 DataFrame)
API函数式转换(mapfilterreduce类似 SQL 的结构化操作(selectfiltergroupBy强类型 API + 类 DataFrame 的无类型 API

Spark Streaming

基于 Spark Core 之上的实时计算框架,可以从很多数据源消费数据并对数据进行实时的处理,具有高吞吐量和容错能力强等

数据抽象:

 DStream(Discretized Stream,离散化数据流,连续不断的数据流),代表持续性的数据流和经过各种 Spark 算子操作后的结果数据流。

① DStream 本质上就是一系列时间上连续的 RDD

② 对 DStream 的数据的进行操作也是按照 RDD 为单位来进行的

③ 容错性,底层 RDD 之间存在依赖关系,DStream 直接也有依赖关系,RDD 具有容错性,那么 DStream 也具有容错性。

总结: 简单来说 DStream 就是对 RDD 的封装,你对 DStream 进行操作,就是对 RDD 进行操作。对于 DataFrame/DataSet/DStream 来说本质上都可以理解成 RD

Structured Streaming

基于 Spark SQL 引擎的可扩展、容错的流处理引擎。统一了流、批的编程模型,你可以使用静态数据批处理一样的方式来编写流式计算操作。并且支持基于 event_time 的时间窗口的处理逻辑。

Spark 两种核心 Shuffle

在 MapReduce 框架中,Shuffle 阶段是连接 Map 与 Reduce 之间的桥梁, Map 阶段通过 Shuffle 过程将数据输出到 Reduce 阶段中。由于 Shuffle 涉及磁盘的读写和网络 I/O,因此 Shuffle 性能的高低直接影响整个程序的性能。Spark 也有 Map 阶段和 Reduce 阶段,因此也会出现Shuffle。

Hash Shuffle

Sort Shuffle

Spark 底层执行原理

申请资源

  1. SparkContext 向资源管理器注册并向资源管理器申请运行 Executor线程
  2. 资源管理器分配 Executor,然后资源管理器启动 Executor
  3. Executor 发送心跳至资源管理器

任务调度和执行

  1. SparkContext 构建 DAG 有向无环图
  2. 将 DAG 分解成 Stage(TaskSet)
  3. 把 Stage 发送给 TaskScheduler任务调度器
  4. Executor 向 SparkContext 申请 Task
  5. TaskScheduler 将 Task 发送给 Executor 运行
  6. 同时 SparkContext 将应用程序代码发放给 Executor
  7. Task 在 Executor 上运行,运行完毕释放所有资源

提问

1. 讲讲spark的数据倾斜

主要是在shuffle阶段,某个或某几个分区的数据量远远超过其他分区,导致“少数几个Task干活特别慢,拖慢了整个Stage甚至整个作业”的现象。其本质是数据分布不均。

产生原因典型场景解决方案
Key 分布不均reduceByKey / groupByKey 某些 key 特别大- Key 加盐(Salting) 打散大 key- 抽取热点 key 单独处理- 自定义分区器
数据热点(业务本身不均)日志类数据:某个用户/商品访问量特别高- map 端局部聚合combineByKey)减少 shuffle- 广播小表(broadcast join)替代 reduce-side join
算子使用不当使用 groupByKey 导致所有数据拉到 reduce 端- 改为 reduceByKey(map 端预聚合)- 使用 aggregateByKeycombineByKey
分区器设计不合理默认 HashPartitioner 导致分布不均- 自定义分区器,按业务字段规则分区- 增加 spark.sql.shuffle.partitions 并行度
单点热点数据过大某些 key 的数据量占比极大(如超过 50%)- 单独抽取该 key 走独立逻辑- 其他数据正常走 shuffle

常见原因:

1、key分布不均匀:某些 key 的数据量远大于其他 key,导致部分 task 处理数据过多,运行时间远超其他 task。

2、数据热点:数据本身分布不均匀,大部分落在同一个分区,造成执行缓慢

3、业务逻辑导致单点放大:groupByKey 会把相同 key 的数据收集到同一个 reducer,导致内存溢出或 OOM

4、分区器设计不合理

解决方案

1、数据预处理:剔除异常key,并在map端进行combineByKey或reduceByKey聚合,减少shuffle数据量

2、调优算子选择:将groupByKey改为reduceByKey,因为groupByKey会将所有数据拉到内存,而 reduceByKey 在 map 端可预聚合,减少网络 IO 和数据倾斜风险。

3、Key 加盐:给热点 key 人为拼接随机前缀,把大 key 拆散成多个小 key,打散后在 reduce 阶段再聚合。

4、自定义分区器:根据 key 的实际分布规律,设计自定义 Partitioner,避免数据集中到某一个分区。

5、任务参数调优:增加并行度:提高 spark.sql.shuffle.partitions(默认 200),让 shuffle 后的 task 更多,数据更均匀。调大资源配置:提高 executor 内存、core 数,缓解单 task 负载。

6、拆分热点任务:对于某些极端热点 key,可以单独抽取出来单独处理,其余数据正常 shuffle

2. 讲讲spark的宽窄依赖

窄依赖(Narrow Dependency)

定义

  • 子 RDD 的每个分区只依赖于父 RDD 的一个或少量分区
  • 不涉及全量数据的重新分布,数据依赖关系是局部的。

特点

  • 数据本地性好:数据只需要在父分区和子分区之间传递,不会发生大量的网络 IO。
  • 可以流水式计算:父 RDD 分区算完直接传递给子 RDD,task 可以 pipeline 化执行。
  • 执行效率高

宽依赖

定义

  • 子 RDD 的一个分区依赖于父 RDD 的多个分区
  • 涉及数据的 shuffle,需要跨节点数据传输和重新分区。

特点

  • 会触发 shuffle:需要将父 RDD 的数据按照 key 或分区规则重新分布。
  • 存在网络 IO 和磁盘 IO,性能开销大。
  • 会产生 stage 划分:DAG 会在宽依赖处切分 stage。

Hive

4. 讲讲hive的内部表外部表

udf udaf udtf核心区别总结

特性UDF UDAF UDTF 
全称用户自定义函数用户自定义聚合函数用户自定义表生成函数
输入输出关系一行进,一行出多行进,一行出一行进,多行出
功能类比类似于 SQL 中的普通函数类似于 SQL 中的聚合函数类似于 SQL 中的 EXPLODE() 函数
常见场景数据格式化、字段拼接、大小写转换、计算等求和、求平均、求最大值、计数、Top N 等解析JSON数组、Map键值对展开、一行拆多行
继承类org.apache.hadoop.hive.ql.exec.UDForg.apache.hadoop.hive.ql.exec.UDAForg.apache.hadoop.hive.ql.udf.generic.GenericUDTF
开发难度简单复杂中等

数仓

模型

层级


文章转载自:

http://75dRuh26.qmnhw.cn
http://oIF4tdkQ.qmnhw.cn
http://J1b09ooj.qmnhw.cn
http://n7ixIXCe.qmnhw.cn
http://eXdzA7wA.qmnhw.cn
http://8KnAEzbw.qmnhw.cn
http://cIq1463p.qmnhw.cn
http://Lk9S78Sp.qmnhw.cn
http://ZW0ztJPC.qmnhw.cn
http://ZljUpzAe.qmnhw.cn
http://cdNq4rLC.qmnhw.cn
http://67o0avJk.qmnhw.cn
http://toDCmDJr.qmnhw.cn
http://10Q8LXuq.qmnhw.cn
http://1jQftGc2.qmnhw.cn
http://A70VvIQV.qmnhw.cn
http://rr0Ou0Sv.qmnhw.cn
http://0Ahtmdht.qmnhw.cn
http://6fMElikK.qmnhw.cn
http://c0JsDQTN.qmnhw.cn
http://O9RbozQS.qmnhw.cn
http://eh5iUaIq.qmnhw.cn
http://tDI7u8Ym.qmnhw.cn
http://UnUr9ykx.qmnhw.cn
http://bTxcBygg.qmnhw.cn
http://Q4K9ZOv4.qmnhw.cn
http://KmO39P8f.qmnhw.cn
http://G1ZAkpQN.qmnhw.cn
http://jJTfMlYB.qmnhw.cn
http://ppC2TsOe.qmnhw.cn
http://www.dtcms.com/a/378278.html

相关文章:

  • 【案例分享】TeeChart 助力 Softdrill 提升油气钻井数据可视化能力
  • 在图形 / 游戏开发中,为何 Pixels Per Unit(PPU)数值越小,物体在屏幕上显示的尺寸越大?
  • new和mallo的区别
  • mysql中%前置模糊查询怎么优化
  • 单串口服务器-工业级串口联网解决方案
  • 使用 Tkinter + Requests 实现地理信息安全系统学习时长助手
  • 多语言共享贩卖机投资理财共享售卖机投资理财系统
  • 京东JDS 测评图形规律题答题技巧
  • 打工人日报#20250911
  • 一、WPF入门介绍+Grid和StackPanel布局介绍+实战模拟Notepad++页面布局
  • 电商平台用户流失预测与干预机制
  • 华为网路设备学习-33(BGP协议 八)BGP路由 选路规则
  • 【科研绘图系列】R语言绘制海洋微生物群落动态分析
  • 基于微服务架构的电商返利APP技术架构设计与性能优化策略
  • Java开发入门指南:IDE选择与数据库连接详解
  • 【算法】栈专题
  • hadoop的api操作对象存储
  • 硬件开发_基于物联网的沼气池环境监测系统
  • 水质在线监测系统御控物联网解决方案
  • A股大盘数据-20250911分析
  • 【星海出品】rabbitMQ - 叁 应用篇
  • 【npm】npm 包更新工具 npm-check-updates (ncu)
  • pnpm相对于npm,yarn的优势
  • vue3源码学习(四)watch 源码学习
  • 利用JSONCrack与cpolar提升数据可视化及跨团队协作效率
  • 短剧小程序系统开发:打造个性化娱乐新平台
  • 从MySQL到StarRocks:全量与增量同步的最佳实践
  • 第七篇:识破“共因失效”——如何阻止汽车系统的“团灭”危机
  • SSL部署完成,https显示连接不安全如何处理?
  • Java 与 AI 生态:深度学习框架的支持现状