hive - 可优化的 10 个地方及详解

1.合理选择排序

排序算法比较耗资源,应根据业务需要选择

  • order by :全局排序,大数据集会消耗太过漫长的时间
  • sort by:局部排序,只能保证每个reducer的输出数据都是有序的
  • distribute by:分桶不排序,控制map的输出在reducer中是如何划分的,若需排序,则+sort by[字段]
  • cluster by:分桶且排序

 

 

2.慎用笛卡尔积

与join关联不同,笛卡尔积没有关联条件,转换成mr程序的时候,所有数据都进入一个reducetask中,性能极低。

左表:stu 右表:sco 右表:sco_copy

huang math 1 music 1 music 2

meng chinese 2 read 1 read 2

jun english 1

zheng math 2

fan it 1

若无法避免,则需要增加reducetask的个数:

1、假设需要增加reducetask的个数为2,将右表复制一个,形成两个右表;

create table sco_copy as select * from sco;

2、为右表增加关联键index,右表1的关联键均等于1,右表2的关联键均等于2;

3、为左表增加关联键index,根据1、2、1、2...的顺序添加,可防止数据倾斜;

将左表的大表分解成两部分,分别对两个一样的右表进行关联键匹配,增加reducetask的并行度,提高效率。

 

 

3.合并小文件

小文件过多会导致maptask的个数过多,则导致container的启动和销毁的次数过多,启动销毁的时间远远大于程序运行的时间。

(输入合并)原始数据中的小文件过多,合并。

对应参数:

set mapred.max.split.size=256000000;  #每个Map最大输入大小 set mapred.min.split.size.per.node=100000000; #一个节点上split的至少的大小  set mapred.min.split.size.per.rack=100000000; #一个交换机下split的至少的大小

执行Map前进行小文件合并(常用)

set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;  

在开启了org.apache.hadoop.hive.ql.io.CombineHiveInputFormat后,一个data node节点上多个小文件会进行合并,合并文件数由mapred.max.split.size限制的大小决定。

mapred.min.split.size.per.node决定了多个data node上的文件是否需要合并~

mapred.min.split.size.per.rack决定了多个交换机上的文件是否需要合并~

 

(输出合并)当hql中存在多个mr程序串联的时候,上个mr程序的reducetask的个数为3,则会输出3个文件,要合并后进入下一个mr程序。

set hive.merge.mapfiles = true #在Map-only的任务结束时合并小文件 set hive.merge.mapredfiles = true #在Map-Reduce的任务结束时合并小文件 set hive.merge.size.per.task = 256*1000*1000 #合并文件的大小

当输出文件的平均大小小于该值时,启动一个独立的map-reduce任务进行文件merge

set hive.merge.smallfiles.avgsize=16000000

 

 

4.合理设计maptask的个数(最好128M一个)

个数过多,效率低主要是container的启动和销毁时间耽误的;

若是小文件过多导致的,则执行上面的合并小文件过程即可;

若是分片计算导致过多的,则需要设置MaxInputSplitSize(最大数据分片大小)为一个大于默认blockSize的值,越大map数量越少。

FileInputFormat.setMaxInputSplitSize(job,157286400); #默认值是134217728(128M),157286400(150M)

 

或者设置一个container中运行多个maptask任务

set mapred.job.reuse.jvm.num.tasks = 5;设置可以运行5个maptask任务

 

个数过少,导致map端的并行度不高,资源没有充分利用,大量工作时容易堵塞集群;

设置MaxInputSplitSize(最大数据分片大小)为一个小于默认blockSize的值,越小map数量越多。

FileInputFormat.setMaxInputSplitSize(job,104857600); #默认值是134217728(128M),104857600(100M)

 

 

5.合理设计reducetask的个数

reducetask决定的是map端出来的数据的走向

经验值:上限: reducetask*0.95

在没有达到上限之前 根据map端输出的数据量和本身业务决定最终输出的reducetask的个数

reducetask一旦设定 内部的分区:key.hash%reducetask

 

 

6.尽量不要使用in/exists,用left semi join代替

因为in/exists没有关联条件,而semi join有,hive擅长有关联条件的关联。

 

 

7.多表插入时,使用多重查询,不要使用单重

单重:每插入一个表就要全表扫描一次stu表

insert into table stu01 select * from stu where age = 18; insert into table stu02 select * from stu where age = 19;

多重:仅扫描一次stu表

from stu insert into table stu01 select * where age = 18, insert into table stu02 select * where age = 19;

 

 

8.合理设计分区

为了减少全表扫描所耗费的时间,将一些频繁作为筛选条件的字段,设置为分区字段;

select * from stu where age =18;

未分区的时候,需要扫描stu全表;

以age字段分区后,仅扫描age=18的子表;

 

 

9.合理设计分桶

分桶的作用:

  • 提高join的性能,分桶前:大表 join 大表 ; 分桶后:小表 join 小表;
  • 提高抽样的性能,分桶是按照hash算法分的,使得数据足够散列;

怎么抽样?语法:

tablesample(bucket x out of y);#y:桶簇的个数,x:选择第几个桶簇

举例:

1、stu表分了6个桶存储,将stu分成6个桶簇,取第1个桶簇的数据作为样本

select * from stu tablesample(bucket 1 out of 6);

6个桶分成6个桶簇,则一个桶簇中正好是一个完整的桶,取第1个桶簇等同于取第一个桶中的数据。

 

2、stu表分了6个桶存储,将stu分成12个桶簇,取第1个桶簇的数据作为样本

select * from stu tablesample(bucket 1 out of 12);

6个桶分成12个桶簇,则一个桶簇中只有半个桶,取第1个桶簇等同于取第一个桶中的上一半数据

 

3、stu表分了6个桶存储,将stu分成3个桶簇,取第1个桶簇的数据作为样本

select * from stu tablesample(bucket 1 out of 3);

6个桶分成3个桶簇,则一个桶簇中有两个桶,但是,第一个桶簇中并非是第1个桶和第2个桶的数据,而是第1个和第1+3=4个桶中的数据,以此类推:

  • 第 1 个桶簇:第 1 桶 + 第 4 桶的数据;
  • 第 2 个桶簇:第 2 桶 + 第 5 桶的数据;
  • 第 3 个桶簇:第 3 桶 + 第 6 桶的数据;

 

 

10.join的优化

1、先过滤再join匹配,最大限度的减少参与join匹配的数据量;

2、大表 join 小表 ,最好启动mapjoin

如果没有启动MapJoin,那么Hive解析器会在Reduce阶段完成join,整个过程包含Map、Shuffle、Reduce阶段,在在Shuffle阶段时要进行的大量数据传输,若在Map阶段完成join,则节省了数据传输的时间。

为了让小表和大表可以进入同一个map中处理,可以小表文件复制到每一个Map任务的本地,再让Map把文件读到内存中待用。

参考文章:https://www.cnblogs.com/qiuhong10/p/7698277.html

https://blog.csdn.net/shudaqi2010/article/details/89505599

在Hive0.11后,可以通过以下两个属性来设置该优化的触发时机

set hive.auto.convert.join=true; hive.mapjoin.smalltable.filesize=25000000 ; #25M

 

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

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

相关文章

[scikit-learn 机器学习] 7. 朴素贝叶斯

文章目录1. 朴素贝叶斯2. NB 与 逻辑回归对比本文为 scikit-learn机器学习(第2版)学习笔记相关知识参考:《统计学习方法》朴素贝叶斯法(Naive Bayes,NB) 1. 朴素贝叶斯 通过最大概率来预测类&#xff1a…

堕落的时候看看——清华大学老师的一席话

一双鞋,耐克的6百多;李宁的4百多;特步的3百多;361的2百多;所以,你毕业于一个什么样的大学很重要。 一双鞋,在地摊不过几十元,到了商场、专卖店,会涨到一百甚至几百。所以…

塔菲克蓝牙适配器驱动_小身材,大功能,biaze毕亚兹USB蓝牙适配器开箱体验

在日常生活中,我们平时使用的台式电脑或是笔记本电脑,想要传输数据或者音频的时候,都是需要借助数据传输线或是U盘等传输设备,使用过程可想而知,有点麻烦。我们都知道,手机是有蓝牙传输功能的,只…

MySQL - cast()函数

日常建表习惯用 create tabel tb_name as select......,这种建表方式的其中一个缺点就是:系统会根据查询出的字段,定义字段类型。有时候会把 %Y-%m-%d 格式的日期字段定义为 varchar 。建模的时候苦不堪言。 那么怎么在建表过程中自己定义每…

HDU1003——MAX SUM

简单DP&#xff0c;状态转移公式&#xff1a;num[j].data max{num[j].data, num[j].datanum[j-1].data}&#xff0c;也就是保证加上前一个数不失自己的值减小。 View Code #include <stdio.h>#define N 100010#define inf 9999999struct _num{int data;int pre;int nex…

[scikit-learn 机器学习] 8. 非线性分类和决策树

文章目录1. 特征选择标准2. 网页广告预测2.1 数量处理2.2 网格搜索模型参数3. 决策树优缺点本文为 scikit-learn机器学习&#xff08;第2版&#xff09;学习笔记相关知识&#xff1a;《统计学习方法》决策树&#xff08;Decision Tree&#xff0c;DT&#xff09; 1. 特征选择…

智慧新泰时空大数据与云平台_智慧警务大数据云平台开发情报研判系统解决方案...

智慧公安作为公安信息化开展到高级阶段的一种警务形态&#xff0c;“智慧公安”主要采用物联网、云计算、无线通讯、智能动态感知分析等新一代信息技术,将公安工作IT根底设备与物理设备、人际环境等高度交融,以提供智能化公安决策与效劳。智慧警务大数据云平台开发情报研判系统…

RGB颜色查询对照表#FFFFFF

大致是下图这样的&#xff0c;有需要的可以点击下面的连接复制使用&#xff1a; https://www.114la.com/other/rgb.htm

ikbc机械键盘打字出现重复_超小无线机械键盘,绝佳移动打字体验

NuType筹资信息产品名称NuType上线平台Kickstarter发起团队NUPHY发起地区中国香港目标金额80,000HKD筹集金额1,301,212HKD完全进度1,627%支持人数1,612最低价格697HKD上线时间2019/11/13-2019/12/28创次方/制表时间&#xff1a;2019年12月28日文/大智笔电键盘的打字体验远不及桌…

英语语法之形容词从句:定语从句

形容词从句:定语从句 限制和非限制性定语从句 ----------------------------------------------------------------------------- 限制和非限制性定语从句: 限制性定语从句是名词词组不可缺少的一个组成部分,去掉了会造成病句或意义不明确; 非限制性定语从句属于补充说明性质…

MySQL - 定时任务(每天凌晨1点、每小时、每分钟、某一时间点)

常用的一定要写在前面 # 从2019-10-11开始&#xff0c;每天的00:30:00执行定时任务 ON SCHEDULE EVERY 1 DAY STARTS 2019-10-11 00:30:00 # 每天的凌晨1点执行定时任务 ON SCHEDULE EVERY 1 DAY STARTS DATE_ADD(DATE_ADD(CURDATE(), INTERVAL 1 DAY), INTERVAL 1 HOUR)# 特…

数据库中的null和c#中的null

再向数据库中插入数据时&#xff0c;如果插入c#中的null会报错&#xff0c;需要转换成SQl中的DBNull.Value public static object ToDbNull(object value) { if (value null || value.ToString() DateTime.MinValue.ToString()) { …

极光无限渗透测试面经_认识工业以太网及线缆测试

工业以太网由于其固有的可靠性、高性能和互操作性&#xff0c;已经渗透到工厂车间&#xff0c;成为自动化和控制系统的首选通信协议。近年&#xff0c;工业以太网的市场份额已经超过了传统的现场总线协议&#xff0c;总线协议通常需要多个独立和专有的布线设施。为了满足工业环…

mysql_根据身份证号识别性别、年龄、所在省份

1.性别&#xff1a; IF(mod(SUBSTR(c.reciver_idcard_num,17,1),2),man,woman) 性别, 2. 年龄&#xff1a; CASE WHEN c.reciver_idcard_num <> THEN (YEAR(CURDATE()) - SUBSTRING(c.reciver_idcard_num,7,4)) ELSE NULL END AS 年龄, 3. 所属省份&#xff1a; CAS…

LeetCode 286. 墙与门(BFS)

文章目录1. 题目2. 解题2.1 BFS 超时解2.2 从门开始逆向BFS1. 题目 你被给定一个 m n 的二维网格&#xff0c;网格中有以下三种可能的初始化值&#xff1a; -1 表示墙或是障碍物0 表示一扇门INF 无限表示一个空的房间。然后&#xff0c;我们用 231 - 1 2147483647 代表 INF…

法斗几个月长鼻筋_路医生说丨脚底板早起一下地特别疼?得了足底筋膜炎,该怎么办?...

老李很奇怪&#xff0c;他压根就没有受过伤&#xff0c;怎么突然就脚底板疼了起来。就是这两天走的稍多了点&#xff0c;也不知道为什么脚底板就开始疼了&#xff0c;走路踩地就疼&#xff0c;尤其是早晨起床脚一踩地&#xff0c;那酸爽简直了&#xff0c;刚下地的前几步走起来…

Power BI连接MySQL 提示错误......未能加载文件或程序集......或它的某一个依赖项

Power BI连接MySQL数据库时报错&#xff1a; 提示错误未能加载文件或程序集“MySql.Data, Version5.1.4.0, Cultureneutral,........”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 解决办法&#xff1a;下载MySQL.Data.dll(5.1.4)程序集&#xff01; 解压…

LeetCode 346. 数据流中的移动平均值(队列)

文章目录1. 题目2. 解题1. 题目 给定一个整数数据流和一个窗口大小&#xff0c;根据该滑动窗口的大小&#xff0c;计算其所有整数的移动平均值。 示例: MovingAverage m new MovingAverage(3); m.next(1) 1 m.next(10) (1 10) / 2 m.next(3) (1 10 3) / 3 m.next(5) …

SQL 语句还原SQL Server数据库

/* 断开所有用户打开的连接 */ use master--一定要有这个 goif exists (select * from dbo.sysobjects where id object_id(N[dbo].[p_killspid]) and OBJECTPROPERTY(id, NIsProcedure) 1) drop procedure [dbo].[p_killspid] GOcreate proc p_killspid--创建存储过程 dbnam…

系统错误_Win10系统提示0x80004005错误的解决方法

win7系统虽然身手大家喜爱&#xff0c;但是最新的PC和笔记本电脑想要装win7很难了&#xff0c;所以现在越来越多人开始使用Win10系统&#xff0c;但是&#xff0c;最近有用户在使用win10系统的时候&#xff0c;发现因为电脑没有正确注册某些动态链接库文件&#xff0c;或者计算…