IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 关于spark落盘到hdfs的文件分发规则及处理总结 -> 正文阅读

[大数据]关于spark落盘到hdfs的文件分发规则及处理总结

近期又遇到了不少有关spark/hive表落盘到hdfs的问题,借此机会系统性的记录下学习过程。

此次记录的核心语句就是之前老生常谈的distribute by命令,其后跟的规则不同 会产生截然不同的效果

首先回顾下落盘的过程,每一个reducer都会往某一指定路径下写一个文件,有时候一个reducer只写一个路径,有时候会写多个路径,但核心点在于 每一个reducer只会在某一路径下写一个文件。

我们经常会遇到的小文件过多的问题,以及脚本运行很慢甚至卡死的情况(数据倾斜),其实大多数情况下都和落盘的过程有关。

来看下最基本的两种情况,先假设有50个reducer,数据分为pdate= 01,02,03三个分区

1. distribute by rand

2.distribute by 某一固定值,如distribute by 1

这是非常经典的两个场景:

对于1,结果集的每一条记录都会打上一个随机数的标签,相同的随机数会被分到同一个reducer进行计算以及落盘,显而易见,比如pdate01的数据会近乎被均分为50份,分发到50个reducer上,同时每个reducer都会往pdate01对应的hdfs路径下写一个文件,这样01分区下总共会有50个文件,同理02,03也为50个文件

对于2,所有分区的所有数据,均会被打上同一个标签,这意味着所有的数据都会分发到同一个reducer上,然后这个reducer分别往01,02,03三个分区下的路径下各自写一个文件,这样01,02,03分区路径下,分别都有1个文件。

从过程中可以得出结论,1的情况可以达到高并发,但由于每个分区都生成大量的文件,对于数据分布不均匀的分区,可能会出现大量的小文件问题;2的情况恰恰相反,由于只有一个reducer工作,解决了小文件的问题,但丧失了多个reducer高并发的优势,任务的效率大大降低。

那接下来,如何综合1和2的优点,使任务既可以做到多个reducer高并发处理,又可以避免小文件的问题呢,下面是第三种情况

3. distribute by pdate ,也就是根据某个分区key值

这样的分发情况是这样的:同一个分区的数据,会分发到同一个reducer上进行处理,每一个reducer往对应的分区路径下写一个文件,最终,01,02,03分区各自会有1个文件,这样既可以做到高并发,又避免了小文件的问题

补充,如果文件大小过大,可以后面跟个随机数,比如

distribute by pdate, cast(rand()*N as int)?

这样同一个pdate分区的数据,会进一步细分为N,从由1个reducer处理,变为由N个reducer处理,这样最后每个分区路径下,会生成N个文件

但是,对于3,同样存在一系列的问题,比如数据倾斜

比如,01分区的数据特别多,02特别少,那对应处理01分区的reducer压力就会非常大,造成任务一直卡死在这个reducer上,解决数据倾斜的方法非常多,就不一一细说,这里列举一个只从distribute by的角度解决的case

4. distribute by case when pdate=01 then?cast(rand()*N as int) else 1 end

可以看出,当pdate=01,数据量特别大的时候,采用N个reducer处理,其余情况,直接由单个reducer处理

简单的个人学习总结,若有错误,欢迎各位大佬指出~

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-02-22 20:40:12  更:2022-02-22 20:41:18 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 11:00:44-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码