Hive企业实战ORC表数据翻倍,颠覆你认知的Cluster by作用?

news2024/11/15 23:31:07

 咱们玩开源和大数据领域的几乎天天和Exception和Error打交道,尤其是面对海量数据的存储计算,复杂业务场景的时候。

      真正能让你学到东西的大数据都需要是符合大数据特点的数据,比如低价值密度,如何从一眼看不出价值的数据中挖掘出商业价值,颠覆你的认知。比如海量数据计算,遇到性能瓶颈时我们如何调优,没有性能瓶颈的调优都是脱裤子放屁。比如数据的复杂多样性,面对复杂业务场景如何管理数据,数仓架构,数据建模,几万张表,几十万张的管理跟你几百张的难度可不是线性倍增的。

1.事故与故事背景

  今天公司新来的小趴菜同事提出了一个问题,代码部门整合后脱敏(当然实际代码很长)。如下两个表进行leftjoin,结果表的总条数没变都是596亿行,字段个数也没变,字段也没做过啥处理,但是结果表的总存储变变成了3TB(单副本)

如下代码,两个表进行join,分布式a left join b ,两表信息如下:
leftjoin源表a: dws_device_pkg_install_status_180d_df_md 表默认存储格式ORC分区20210530 总行数596亿行,资产上看分区存储大小单副本500G.
join的b表,XXX_test.dws_device_pkg_install_status_180d_df_md数据量大概几十亿,大概存储单副本95G;INSERT overwrite TABLE dm_xxx_topi.dws_device_pkg_install_status_180d_df_tmp4 partition(DAY='20221122')SELECT a.device,       a.pkg,       install_datetime,       unstall_datetime,       all_datetime,       df_final_time,       final_flag,       final_time,       coalesce(b.refine_final_flag, a.reserved_flag) as reserved_flag,       process_time from  ( SELECT device, pkg, install_datetime, unstall_datetime, all_datetime, df_final_time, final_flag, final_time, reserved_flag, process_time   FROM dm_xxx_topi.dws_device_pkg_install_status_180d_df   WHERE DAY = '20210530' ) aLEFT JOIN  (select device,pkg,refine_final_flag   from  XXX_test.dws_device_pkg_install_status_180d_df_md  group by device,pkg,refine_final_flag )  b ON a.device = b.device and a.pkg = b.pkg

2.Trouble Shooting 来了

       这个问题很奇怪吧,就是简单的a left  joinb,如果数据量没有变多,字段也没有变长变多,同一个集群环境,按理来说数据应该不会膨胀。那是为什么呢?

    小趴菜说是不是集群问题?这个锅我不能背?既然不背锅,我就必须得找到证据,生产上除了问题有时候真的很难排查哇,全靠经验了

2.1 计算引擎问题?

首先想到最简单的问题?是hive的问题?那我换个spark引擎试试?结果小趴菜说他试了,没问题,spark跑也是数据翻倍。

2.2 是数据问题,集群参数问题?

  是不是数据本身相关问题,比如文件数,集群参数,客户端环境等,于是直接跑了个存map的任务;

INSERT overwrite TABLE dm_xxx_topi.dws_device_pkg_install_status_180d_df_tmp4 partition(DAY='20221122')SELECT a.device,       a.pkg,       install_datetime,       unstall_datetime,       all_datetime,       df_final_time,       final_flag,       final_time,        reserved_flag,       process_time from  ( SELECT device, pkg, install_datetime, unstall_datetime, all_datetime, df_final_time, final_flag, final_time, reserved_flag, process_time   FROM dm_xxx_topi.dws_device_pkg_install_status_180d_df   WHERE DAY = '20210530' ) a

发现存map任务的数据符合结果预期,596亿条,最后的文件大小会随着文件个数等略微变化,但整体都在500G上下,跟之前3TB差别很大。

既然存Map任务没有问题,难道是map结果输出执行了压缩,reduce结果没有压缩吗?排查了了集群配置,客户端配置等,发现并不是这个问题。就是只有shuffle时才有这种问题,那就应该是shuffle对数据二次分发造成的问题,以为存map任务不牵涉数据的重新分发。

2.3 shuffle造成的问题?

既然排查到shuffle造成的问题,就很尴尬了,这个任务代码看不出啥问题。当时我就懵逼了,去扒拉一下ORC的官网,orc的源码,也没找到啥思路或者突破口,放张图,证明我确实看过

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+ORC

还是回到shuffle的问题,因为实际测试看,只有shuffle造成了数据膨胀,那就是问题处在shuffle上,shuffle的作用干啥?大家回忆一下,shuffle的过程其实就是对map输出的kv键值对,使用key按照hash算法进行分发到不同的reuduce上,shuffle过程基本就是:分区+排序+分发,reduce的过程就是合并排序+计算。

这么一看,有点思路了,应该大概率是排序造成的。因为排序对压缩的影响性能很大?来先学习下压缩的原理知识

压缩原理其实很简单,就是找出那些重复出现的字符串,然后用更短的符号代替,从而达到缩短字符串的目的。

比如,有一篇文章大量使用"中华人民共和国"这个词语,我们用"中国"代替,就缩短了 5 个字符,如果用"华"代替,就缩短了 6 个字符。事实上,只要保证对应关系,可以用任意字符代替那些重复出现的字符串。本质上,所谓"压缩"就是找出文件内容的概率分布,将那些出现概率高的部分代替成 更 短 的 形 式 。所 以 , 内 容 越 是 重 复 的 文 件 , 就 可 以 压 缩 地 越 小 。比 如 ,“ABABABABABABAB"可以压缩成"7AB”。

相应地,如果内容毫无重复,就很难压缩。极端情况就是,遇到那些均匀分布的随机字符串,往往连一个字符都压缩不了。比如,任意排列的 10 个阿拉伯数字(5271839406),就是无法压缩的;再比如,无理数(比如 π)也很难压缩。

为了验证这个想法,我看了下源表: dws_device_pkg_install_status_180d_df的生成业务逻辑,发现这个表是通过很多表加工而来,这个表生成的时候通过device进行shuffle的(这个表生成的十几张原表通过device-join聚合而来,所以其实数据是通过device进行hashshuffle而来的)。这个表的每个分区大概都是500亿-700亿行数据,分区大小单副本500G上下。而现在我们生成的结果是shuffle的条件是device+pkg连个复合键。

于是乎,为了验证是shuffle造成,是因为shuffle的hash-key不同造成的,于是乎,我给小趴菜上面代码加了个cluster-by-device,让最后的结果集通过device进行shuffle,重新落地。

测试了下,结果集立马变成了596亿,文件存储大概500G左右,解决问题。继续测试验证,结果如此。

为什么会出现这种问题呢?

因为这个表里device字段有大量的重复值,如果你用device进行shuffle的话,那么同样device,或者相近的device会被分配到同一个reduce里,这样最后orc列式存储时会有非常高的压缩率,重复值越高,压缩率越高。这个时候你换成device+pkg作为shuffle过程的hash-key,那么数据会打的更散,这个时候压缩率会有影响,造成跟之前相比会有膨胀。

这种问题生产很常见,我们生产上有很多代码最后都加了一个cluster by ,小趴菜当时还有疑问,为啥最后要加个这个呢,看上去没啥功能作用哇,对业务加工也没啥帮助哇。

这就是因为clusterby有时候用的好,对orc表降低存储有巨大的好处,尤其生产上某个字段有大量重复值的时候,比如电商公司,某个商铺以王者一般承担了大量的订单。

最后考大家一个问题,这个如何生产上更好的避免这种数据膨胀的问题?

这种面试的时候你吹起来工作中遇到过哪些问题?不比你背的八股文牛逼,不说了,点赞关注收藏起来哈

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/56650.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[附源码]计算机毕业设计游戏论坛网站Springboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

C语言初学者必学必会的C语言必背100代码

对于C语言这门计算机语言&#xff0c;算是老生常谈了&#xff0c;现在就由我来给大家分享几个关于C语言的几个代码吧&#xff01;(如果有错的地方还望见谅) 1.入门级别hello&#xff0c;world #include<stdio.h> int main() { printf("Hello,world!\n"); …

基于PHP+MySQL员工电子考勤网站的设计与实现

民工电子考勤网站是信息时代的产物,它是管理人员的一个好帮手。有了它不再需要繁重的纸质登记,有了它管理员不再需要繁重的工作,一些员工信息,考勤信息等基本信息可以由管理人员及时的对信息进行查询、更新、修改和删除,方便简易,且时效性高。 随着信息技术的不断进步,运用于活…

C++11标准模板(STL)- 算法(std::set_difference)

定义于头文件 <algorithm> 算法库提供大量用途的函数&#xff08;例如查找、排序、计数、操作&#xff09;&#xff0c;它们在元素范围上操作。注意范围定义为 [first, last) &#xff0c;其中 last 指代要查询或修改的最后元素的后一个元素。 计算两个集合的差集 std:…

Maven的简单介绍

Maven 构件 <packaging> : pom、jar、ear、war以及maven-plugin,构建Maven之后所生成的文件类型&#xff0c;Pom本身不产生构件&#xff0c;用来作为依赖库。 pom类型常用于微服务中作为父Pom,通过 可以将子模块包含进来&#xff0c;共享父Pom的依赖&#xff0c; GAV坐标…

【数据库与事务系列】多数据源切换

分库分表 不光是管理多个数据源&#xff0c;是对sql的优化、改写、归并等一系列操作的解决方案。关注的是sql语句。以shardingSphere为例&#xff0c;虽然也支持跟sql无关的hint策略提供路由功能&#xff0c;但是在sql改写以及归并过程中&#xff0c;依旧对sql有限制。 多数据…

页面转变为灰色,如此简单

页面转变为灰色 网站变灰色 html标签 一、通过浏览器操作 在网页端按下 F12&#xff0c;打开开发者模式&#xff0c;用元素选择器定位到 HTML 标签上&#xff0c;在「样式」的面板中往下翻&#xff0c;就可以看到这样一段代码。 在html标签添加filter: grayscale(100%); 效…

LAS、CTC、RNN-T、NT、MoChA

LAS LAS是一个做语音识别的经典seq2seq模型&#xff0c;主要分为三个部分Listen、Attention、Spell Listen Listen部分就是一个encoder。 输入声学特征向量&#xff0c;提取信息、消除噪声&#xff0c;输出向量。 encoder可以是RNN 也可以是CNN。比较常见的是先用CNN&…

多元宇宙算法求解电力系统多目标优化问题(Matlab实现)【电气期刊论文复现与算例创新】

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f4dd;目前更新&#xff1a;&#x1f31f;&#x1f31f;&#x1f31f;电力系统相关知识&#xff0c;期刊论文&…

Shiro-SpringBoot (一)

前不久负责项目中刚好也使用了Shiro做权限控制&#xff0c;趁着空闲期想把之前做的整理一下。在日常项目开发中&#xff0c;权限认证是不可少的模块。比较常用的有Spring Security&#xff0c;或是轻量级的Apache Shiro。相对来说Shiro提供了认证、授权、加密、会话管理、与Web…

华为机试 - 羊、狼、农夫过河

目录 题目描述 输入描述 输出描述 用例 题目解析 算法源码 题目描述 羊、狼、农夫都在岸边&#xff0c;当羊的数量小于狼的数量时&#xff0c;狼会攻击羊&#xff0c;农夫则会损失羊。农夫有一艘容量固定的船&#xff0c;能够承载固定数量的动物。 要求求出不损失羊情况…

体验Vue3的SSR框架 - Nuxt3

SSR 与 Nuxt SSR 是 Server-Side Rendering&#xff0c;即服务端渲染的英文缩写。 Vue.js 是一个用于构建客户端应用的框架。默认情况下&#xff0c;Vue 组件的职责是在浏览器中生成和操作 DOM。在客户端是单页应用 (SPA) 。 也可以将 vue 程序在服务端渲染&#xff0c;渲染…

【GD-1开发板】CH340驱动安装方法

CH340驱动安装方法正常情况异常情况CH340驱动安装步骤现在国产ARM替代STM32的arm芯片运动正如火如荼进行中&#xff0c;我也录制了一套完整的”ARM嵌入式开发入门教程“&#xff0c;并配套了一个GD32F103C8T6的开发板。 但有小伙伴拿到板子后&#xff0c;说下载程序的时候&…

实验七:定时/计数器8253、8254

目录 例实验目的实验内容报告要求例 已知8253的两个计数器CLK0=1MHZ,CLK1=1KHZ,现系统要求8253的OUT1产生0.1s的定时方波信号。 (1):应如何实现? (2):说明两个计数器的工作方式并计算计数初值 (3):编写初始化程序(8253的端口地址80H-83H,均采用二进制计数) C…

详解torch.nn.functional.grid_sample函数(通俗易懂):可实现对特征图的水平/垂直翻转

一、函数介绍 Pytorch中grid_sample函数的接口声明如下&#xff0c;具体网址可以点这里 torch.nn.functional.grid_sample(input, grid, mode‘bilinear’, padding_mode‘zeros’, align_cornersNone) 为了简单起见&#xff0c;以下讨论都是基于如下参数进行实验及讲解的&…

BSN开放联盟链“中移链”浏览器2.0正式发布!

由中国移动信息技术中心自主研发的中移链EOS区块链浏览器2.0版本&#xff0c;已在区块链服务网络&#xff08;BSN&#xff09;官网和BSN-DDC网络官网正式发布。 中移链浏览器2.0 无论是从政策导向还是从业务需求方面来说&#xff0c;区块链技术的发展已经是一种不可逆的趋势&a…

查找-二叉排序树

问题引入 【问题描述】 输入若干个整数建立二叉排序树,以0结束输入,在二叉排序树上查找关键字,删除指定关键字结点。 【输入形式】 (1)第一行,输入若干个整数,输入0结束输入; 如输入关键字 45 24 53 12 28 90 0 可建立如下二叉排序树 (2)第二行,输入两个整数,一…

GameOff2022参与有感

GameOff2022参与有感以及年度总结 厚颜无耻的用我们美术的立绘 GameOff— Redemption 很高兴在一个月的时间里面和大家一起完成了《Redemption》 比赛链接&#xff1a;Itch.io 百度云盘链接&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1ylK0QRr2lmkqi4JF1wsXtA 提…

【servelt原理_6_servlet核心接口和类】

servlet核心接口和类 在Servlet体系中&#xff0c;除了实现servlet接口,还可以通过继承GenericServlet或HttpServlet类实现编写1.Servlet接口 servlet接口是整个servlet的核心。它是所有Servlet类必须直接或者间接实现的一个接口&#xff0c;其内部需要实现的5个方法分别关乎…

基于flv.js的视频自动播放

1: html <video class"video-content" id"video">您的浏览器不支持 HTML5 video&#xff01; </video> 2: 创建flv实例并播放 let videoPlayer document.getElementById(video); //获取html if (flvJs.isSupported()) {//创建flv实例this.P…