9. 学习distribute by rand()

文章目录

        • 1、rand()和rand(int seed)
        • 2、distribute by
        • 3、distribute by rand和生成文件数的关系
          • set hive.exec.reducers.max 对比 set mapred.reduce.tasks
        • 4、distribute by rand的风险
        • 5、hive 中什么场景下会使用 distirbute by rand() 呢?
        • 学习链接

1、rand()和rand(int seed)

两种随机数生成函数,返回值: [0, 1)的随机浮点数。
说明: 如果指定种子seed,则会得到一个稳定的随机数序列。生成的数字序列中每个数是随机的,但是每次生成的序列是固定的。

2、distribute by

Hive官网解释:Hive uses the columns in Distribute By to distribute the rows among reducers. All rows with the same Distribute By columns will go to the same reducer.
翻译:Hive根据distribute by column中的column值将不同的行数据发送到不同reducer,具有相同的column值的所有行将被发送到相同的reducer中。实质是hash(column)%reducer数。

3、distribute by rand和生成文件数的关系

比如:insert into table b select xxx from a;

该sql语句的最后一个job是一个仅有map阶段的任务(以该情况为例,其他场景可能也会有reduce阶段)。
假如有1000个map,该情况下map任务在往hive分区(一个分区)中写数据的时候,每个map都要产生1个文件;如果用到动态分区,假如有10个分区,数据量在每个分区都比较大的情况下,每个map几乎都要产生10个文件,文件个数呈现乘法的放大;

假如distribute by rand() + set hive.exec.reducers.max = 500(或者set mapred.reduce.tasks = 500);

先对rand取哈希然后对reduce数目(500)取余,保证了每条数据分配到所有reducer的可能性是相等的,这样reducer处理的数据量就是均匀的,在数据量比较大的情况下,每个reducer产生的文件数为动态分区的个数,产生的文件总个数50010(reducer个数分区个数)。

假如使用distribute by pmod(hash(1000*rand()), 80) + set mapred.reduce.tasks = 200;

此时 200>80,会有200个redurcer启动,但是只有80个实际接收了数据(即distribute by rand可以控制生成文件的数量);

# 同时,如果设置
set hive.merge.mapfiles=true;
set hive.merge.mapredfiles=true;
set hive.merge.size.per.task=256000000;
set hive.merge.smallfiles.avgsize=64000000;
# 在落地前可能会进行文件合并,落地文件大小是256m,落地文件数<=min(reduce数*分区个数,distribute by pmod(hash(1000*rand()), xx)*分区个数);
set hive.exec.reducers.max 对比 set mapred.reduce.tasks

1)相同点:
这两个参数均与Hive作业中的reduce任务数量有关。

2)不同点:
set hive.exec.reducers.max是Hive层面的参数,用于限制Hive作业推测出的reduce任务的最大数量。指定10可能是10、也可能是7。

set mapred.reduce.tasks是Hadoop MapReduce框架层面的参数,用于指定一个MapReduce作业的reduce任务数量。指定1就是1,指定10就是10。

4、distribute by rand的风险

distribute by rand() 使用不带随机种子的函数,在mapreduce框架下这种使用方式存在一定风险,可能导致部分数据丢失或者重复;

具体原理如下:
       部分reduce shuffle失败导致上游个别map task重新生成数据,如果shuffle分片逻辑包含随机因子,会导致新生成的数据shuffle分片与之前不完全一致,进而导致部分数据重复读取或者数据丢失。新生成的shuffle分片内数据会漏数据也会包含分发到其他reducer的数据。(reduce task从每个map task的结果文件中拉取对应分区的数据。数据在map阶段已经是分好区了,并且会有一个额外的索引文件记录每个分区的起始偏移量。所以reduce task取数的时候直接根据偏移量去拉取数据。)

        重要!!! 建议使用rand(int seed)设置随机种子。如果shuffle过程中个别reducer失败,对应上游mapper重试发送数据时,使用带种子的随机函数可以保证重试时生成的随机值相同,发送到该reducer的数据和之前一致。

5、hive 中什么场景下会使用 distirbute by rand() 呢?

在Hive中,DISTRIBUTE BY 子句与 RAND() 函数一起使用时,通常是为了将数据随机(近似均匀)分布到不同的Reduce中。

1)负载均衡:当数据量非常大,并且需要在多个reduce任务之间平衡负载时,使用 DISTRIBUTE BY RAND() 可以随机(近似均匀)分配数据,从而避免某些reduce任务过载而其他任务却空闲的情况。

2)小文件问题:在Hive中,如果有很多小文件,它们可能会导致大量的Seek操作(指HDFS在处理文件时的开销),从而降低查询性能。使用 DISTRIBUTE BY RAND() 可以将数据随机写入更少的文件中,减少小文件的数量(distribute by rand可以控制生成文件的数量;见3、)。

3)数据倾斜:在某些情况下,数据倾斜可能导致某些键(key)的数据量远大于其他键。通过随机分布数据,可以减少数据倾斜的影响。

4)测试和样例:在开发或测试阶段,可能需要从生产表中随机抽取一部分数据进行测试。使用 DISTRIBUTE BY RAND 可以快速创建一个随机样本(每个reduce任务独立随机抽样,而非全局随机抽样)。

-- 使用 DISTRIBUTE BY RAND() 来获取随机样本的 Hive SQL 示例
INSERT OVERWRITE LOCAL DIRECTORY '/tmp/sample_dir'
SELECT *
FROM source_table
DISTRIBUTE BY RAND()
LIMIT 1000;
-- 由于 DISTRIBUTE BY RAND() 会随机分配行到reduce任务,每个reduce任务处理一部分数据,并且 LIMIT 是在每个reduce任务的结果上独立执行的,因此每个reduce任务将返回一定数量的行,最终合并后形成整个随机样本。
学习链接

https://zhuanlan.zhihu.com/p/252776975

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

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

相关文章

wordpress增加谷歌分析

wordpress增加谷歌分析 为了更好的浏览体验&#xff0c;欢迎光顾勤奋的凯尔森同学个人博客 http://www.huerpu.cc:7000 一、创建谷歌分析账号与媒体应用 谷歌分析地址&#xff1a;https://analytics.google.com/analytics 创建一个账号&#xff0c;如果你没有的话。 在该账…

基于 Ubuntu22.04 安装 SSH 服务

文章目录 一、Ubuntu22.04 安装 SSH 服务二、配置 OpenSSH&#xff08;安全性&#xff09;1. 更改 OpenSSH 端口2. 限制使用 SSH 登录尝试次数3. 禁止 SSH 以 root 身份连接 三、设置防火墙&#xff08;UFW&#xff09;锁定 SSH四、远程终端软件通过 SSH 连接 Ubuntu22.041. 远…

自学32单片机两个周了,感觉非常懵逼怎么办?

在开始前我分享下我的经历&#xff0c;我刚入行时遇到一个好公司和师父&#xff0c;给了我机会&#xff0c;一年时间从3k薪资涨到18k的&#xff0c; 我师父给了一些单片机学习方法和资料&#xff0c;让我不断提升自己&#xff0c;感谢帮助过我的人&#xff0c; 如大家和我一样…

如何使用Shortemall自动扫描URL短链接中的隐藏内容

关于Shortemall Shortemall是一款针对URL地址安全与Web内容安全的强大工具&#xff0c;该工具基于纯Python开发&#xff0c;专为Web安全方向设计&#xff0c;可以帮助广大研究人员以自动化的形式扫描URL短链接中的隐藏内容。 Shortemall的全名为ShortEm All&#xff0c;该工具…

【大比武05】多方主体参与下的工程档案资料数据化实现路径探究

关注我们 - 数字罗塞塔计划 - 数据化&#xff0c;是以数据为基础&#xff0c;以信息技术为手段&#xff0c;以数据分析为切入点&#xff0c;通过数据发现并分析问题&#xff0c;实现科学决策。而工程档案资料的数据化是实现工程全生命周期管理智慧化&#xff0c;发挥数据生产…

机器学习1——线性回归、误差推导

有监督——分类、回归 一、线性回归 对于一个线性方程&#xff0c;没办法拟合所有的数据点&#xff0c;但是要尽可能的覆盖尽可能多的点。 在下面的图中&#xff0c;x01。添加这一项的目的是&#xff1a;将数据矩阵补全&#xff08;比如年龄是x1、工资是x2&#xff0c;那么x0手…

“等保测评实施策略:保障企业信息安全合规“

等保测评&#xff0c;即网络安全等级保护测评&#xff0c;是企业保障信息安全合规的重要实施策略。以下是企业实施等保测评的一些关键策略&#xff1a; 理解等保测评的重要性&#xff1a; 等保测评有助于企业识别和评价信息系统的安全性能&#xff0c;提供改进建议&#xff0c;…

可重构柔性装配产线:为工业制造领域注入了新的活力

随着科技的飞速发展&#xff0c;智能制造正逐渐成为引领工业革新的重要力量。在这一浪潮中&#xff0c;可重构柔性装配产线以其独特的技术优势和创新理念&#xff0c;为工业制造领域注入了新的活力&#xff0c;开启了创新驱动的智能制造新篇章。 可重构柔性装配产线是基于富唯智…

面试常见手撕代码

目录 1.线程池 and 数据库连接池 2.生产者&#xff0c;消费者问题 3.排序算法 1.线程池 and 数据库连接池 线程池 #include <iostream> #include <vector> #include <queue> #include <thread> #include <mutex> #include <condition_va…

2024第二届智慧教育和人类发展国际会议(ICSEHD2024)

2024第二届智慧教育和人类发展国际会议(ICSEHD2024) 会议简介 智慧教育对于提升教育质量、促进教育公平、推动教育现代化和数字化转型、培养创新人才以及推动教育理论的发展都具有重要的意义&#xff0c;对人类发展产生着深远的影响&#xff0c;人类发展是智慧教育的最终目的…

易图讯科技数字武装三维电子沙盘

深圳易图讯科技(www.3dgis.top)集成了高清卫星影像、地形数据、实景三维模型、基干民兵、普通民兵、重要目标、兵要地志、企业潜力 、行业潜力 、社会组织潜力 、特种装备器材潜力、敌情数据、现场环境数据、物联感知信息&#xff0c;构建一体化的数字孪生空间&#xff0c;实现…

美港通正规股票炒股市场又一新能车火了!上市首日,大涨34%

查查配大家早上好!昨夜今晨,又有很多大事发生! 美三大股指涨跌不一,美债收益率集体收涨;OpenAI或推AI语音助手;来自中国的新能源车品牌——极氪在美股上市,首日大涨超34%。 美港通证券以其专业的服务和较低的管理费用在市场中受到不少关注。该平台提供了实盘交易、止盈止损、…

element ui输入框后面带输入的字符数量

使用el-input的属性&#xff1a; maxlength&#xff1a;最长字符限制&#xff1b; show-word-limit&#xff1a;显示输入字符数量&#xff1b; 例&#xff1a; <el-input v-model"title" placeholder"请输入名称" maxlength"200" show-wor…

woffice– 内部网和外部网WordPress高端资讯主题

下载地址&#xff1a;https://m.gx.cn/site/3046.html 完全灵活&#xff0c;与最新的WordPress品牌兼容 翻译语言超过15种 使用最新技术设计快速web应用程序 所有这些都以谷歌材料设计为灵感&#xff0c;采用易于定制的设计&#xff0c;给人一种优美的现代感和易于导航的用户…

ERROR 1045 (28000) Access denied for user ‘root‘@‘IP‘(using password YES/NO)

查看权限 要查看MySQL用户的权限&#xff0c;您可以使用SHOW GRANTS语句。这将列出用户的权限&#xff0c;包括授予的权限和可以授予其他用户的权限。 以下是查看当前用户权限的SQL命令&#xff1a; SHOW GRANTS; 如果您想查看特定用户的权限&#xff0c;可以使用以下命令&…

让 CloudFlare 支持 Brotli 压缩算法 11 级压缩比,更节流!

站长们应该都知道 Brotli 压缩算法吧&#xff0c;这是一种通用的无损压缩算法。它结合使用 LZ77 算法的一个现代变体&#xff08;Lempel-Ziv 编码&#xff09;、霍夫曼编码和二阶上下文建模来压缩数据&#xff0c;提供了与当前最佳通用压缩方法相媲美的压缩比。2015 年 9 月谷歌…

笔记-跨域方式实现原理

websocket Websocket是HTML5的一个持久化的协议&#xff0c;它实现了浏览器与服务器的全双工通信&#xff0c;同时也是跨域的一种解决方案。WebSocket和HTTP都是应用层协议&#xff0c;都基于 TCP 协议。但是 WebSocket 是一种双向通信协议&#xff0c;在建立连接之后&#xff…

51-50 两万字长文解读ControlNet论文和代码,以及自定义模型训练和图片精确控制生成实验

今天咱们来看 ICCV2023 最佳论文Adding Conditional Control to Text-to-Image Diffusion Models&#xff0c;又称为ControlNet。提到图像生成Finetuning工程方法&#xff0c;有Textual inversion、DreamBooth、LoRA、T2I-Adapter以及ControlNet&#xff0c;其中最著名的当属Co…

Jupyter配置

一、修改Jupyter打开界面 &#xff08;1&#xff09;打开【Anaconda Prompt】&#xff0c;输入【jupyter notebook --generate-config】命令 从运行结果可知【jupyter_notebook_config.py】的位置 &#xff08;2&#xff09;使用【记事本】打开 找到# c.NotebookApp.noteb…

同城预约上门服务家政小程序

基于Thinkphp和原生微信小程序开发的一款同城预约、上门服务、到店核销家政系统&#xff0c;用户端、服务端、门店端各端相互依赖又相互独立&#xff0c;支持选择项目、选择服务人员、选择门店多种下单方式&#xff0c;支持上门服务和到店核销两种服务方式&#xff0c;支持自营…