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 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> Hive优化总结 -> 正文阅读

[大数据]Hive优化总结

一、SQL本身的优化

1、只select需要的列,避免select *
2、where条件写在子查询中,先过滤再关联
3、关联条件写在on中,而不是where中
4、数据量大时,用group by代替count distinct
5、数据量小时,用in代替join
6、避免笛卡尔积
7、join时大表放后面,使用相同的连接键
7、严格格式

Hive.mapred.mode,分 nonstrict,strict,默认是nonstrict,
如果设置为strict,对三种情况限制:
(1)分区表必须加分区。
(2)order by 必须使用limit
(3)存在笛卡尔积

二、数据倾斜的处理

数据倾斜的现象:
1、任务进度长时间维持在99%(或100%);
2、查看任务监控页面,发现只有少量(1个或几个)reduce子任务未完成。
3、本地读写数据量很大。
导致数据倾斜的原因:
1、空值问题
2、数据类型不一致
3、业务数据本身的问题

1、小表关联大表,开启mapjoin

(1)设置参数
set hive.auto.convert.join=true;
hive.mapjoin.smalltable.filesize=25000000 即25M

(2)手动指定
select /+ mapjoin(A)/ f.a,f.b from A t join B f on ( f.a=t.a and f.ftime=20110802)

2、加盐打散

(1)空值0值 或 关联不上的,用随机数
from a join b
on if(a.key=’’, rand()-1, a.key)=b.key
–rand() 0-1之间的小数

(2)都是有用的key,则加随机数后缀
group by concat(key, cast(round(rand()*10) as int))
缺点是分成10份是提前写好的,数据变更大时,还是会跑得慢。

3、开启combiner,即map端聚合

set hive.map.aggr=true;

4、开启负载均衡,会生成两个MRJob

set hive.groupby.skewindata=true;

第一个 MR Job 中,Map 的输出结果集合会随机分布到Reduce 中,每个 Reduce 做部分聚合操作,并输出结果,这样处理的结果是相同的 Group By Key有可能被分发到不同的 Reduce 中,从而达到负载均衡的目的;第二个 MR Job 再根据预处理的数据结果按照 Group ByKey 分布到 Reduce 中(这个过程可以保证相同的 Group By Key 被分布到同一个 Reduce中),最后完成最终的聚合操作。

5、group by 代替count distinct
6、大key单独处理,再union回去
7、增大并行度

三、hive参数的调整

1、多个job无依赖(如union all),可设置并行执行

//开启任务并行执行
set hive.exec.parallel=true;
//同一个sql允许并行任务的最大线程数
set hive.exec.parallel.thread.number=8;

2、设置map和reduce个数

set mapred.max.split.size=100000000; 每个map的最大输入大小
set mapred.min.split.size.per.node=100000000;一个节点上split的至少的大小,决定了多个data node上的文件是否需要合并
set mapred.min.split.size.per.rack=100000000;一个交换机下split的至少的大小,决定了多个交换机上的文件是否需要合并

3、设置mapjoin
4、设置资源相关参数

【hive on mr】
set hive.execution.engine=mr;
set mapreduce.map.java.opts=-Xmx2048m;
set mapreduce.map.memory.mb=4096;
set mapreduce.reduce.java.opts=-Xmx2048m;
set mapreduce.reduce.memory.mb=4096;
【hive on spark】
set hive.execution.engine=spark;
set spark.executor.cores=1;
set spark.executor.memory=4g;
set spark.yarn.executor.memoryOverhead=2048;

四、小文件的处理

【产生原因】
1、动态分区
2、数据源是小文件
3、reduce个数多
【影响】
1、小文件会开很多map,初始化、启动、执行会浪费资源影响性能。
2、在HDFS中,每个小文件对象约占150byte,如果小文件过多会占用大量内存。
【解决方法】
1、Hadoop achieve命令把小文件归档
2、减少reduce个数
3、参数调节
(1)设置map输入合并小文件
(2)设置map和reduce输出合并小文件
4、少用动态分区,使用distribute by分区

五、数据压缩和存储格式

【数据的压缩与存储格式】
1、压缩 gzip bzip2 snappy
2、存储格式
【行式存储和列式存储】
TextFile:行式存储,Gzip压缩后不支持split
RCFile:数据按行分块,每块按列存储。头信息:行组记录数、每列字节数、
ORC:数据按行分块,每块按列存储,是rcfile的改良版本。头信息:每一列最大小值、该行的偏移量和长度
Parquet:列式存储(压缩比高)。头信息:数据量、偏移量。

六、其他

1、查看sql执行计划 explain sql
2、分区表、分桶表

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-04-01 00:08:39  更:2022-04-01 00:08:42 
 
开发: 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 5:44:41-

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