HIVE 调优思路和实践
1,数据存储调优
1.1 设置压缩:
设置中间数据/输出结果压缩传输,使用snappy格式。
hive-site.xml:
set hive.exec.compress.output = true # 输出结果压缩 set hive.exec.compress.intermediate = true # 中间结果压缩
具体压缩算法配置:
mapred-default.xml(Hadoop 安装目录内):
mapreduce.map.output.compress = true # map任务输出压缩
mapreduce.map.output.compress.codec = Snappy #压缩算法
mapreduce.output.fileoutputformat.compress # reducer 输出压缩
mapreduce.output.fileoutputformat.compress.codec # reducer 压缩算法
mapreduce.output.fileoutputformat.compress.type #reducer 压缩类型
1.2 增加热数据的副本数. 减少传输延迟。
hdfs系统的副本数是固定的。这里是修改单个文件的副本数量。
在写入表(文件)时设置:
set dfs.replication=10; # dfs默认3
Insert overwrite table tmp.dim_test select * from other_table;
或者在hdfs 内,上传文件时修改;
hadoop dfs -D dfs.replication=2 -put dim_test.txt /***/
2,常见配置项调优
2.1 当查询的数据量足够小时,启用本地模式。
hive-site.xml:
hive.exec.mode.local.auto = true # 自动启动local 模式
hive.exec.mode.local.auto.inputbytes.max = 50000000 # 最大字节数的阈值
2.2 在一些可以设置并行执行的任务中,配置 parallel
可以运行并行的任务,比如 在join 之前,对多个数据源的处理。 还有移动多个数据源插入目标表。
hive.exec.parallel = true # 并行运行
hive.exec.parallel.thread.number = 8 # 最多线程数
2.3 Fetch task获取数据,直接读取文件,不MR。 某些简单操作适用。
hive.fetch.task.conversion = more # 对 SELECT, FILTER, LIMIT only UDFs, 有效
2.4 更换执行引擎: spark tez mr
hive.execution.engine = spark # 设置spark引擎
3,计算代码级调优
3.1,去重算法调优
不可使用DISTINCT;Hive去重最佳方法----row_number() ,模拟了分区排序。map 内分区排序,reduce内 归并排序,效率高。
举例对 客户表(id , name , order_id , data )去重, 假设数据量非常大。
3.2 排序算法
order by :一个reduce,全局排序,性能差。 数据量较少时,可以使用
sort by : map端排序完成,分区输出,局部有序。
distribute by:按照指定的字段对数据进行划分到不同的输出reduce
cluster by 除了具有 distribute by 的功能外还兼具 sort by 的功能,建议使用。
4,常见问题调优
4.1 、小文件太多如何调优
4.1.1,调用 hdfs的方法合并小文件,sync() append() 文件层面; 或者使用hadoop 管理命令合并;
举例 : 每日产生大量product_info_* 的文件, 合并这些文件
hadoop fs -getmerge /hdfs_path/product_info_* /local_path/product_inf # 合并后保存到本地 hadoop fs -put /local_path/product_inf /hdfs_path # 合并文件再上传到hdfs
4.1.2, Hadoop archive 命令, 解决对于NN 内存问题。 但是不能解决计算中的问题
可以更有效的把大量小文件打包放入block,因此减少NameNode压力。
hadoop archive -archiveName name -p <parent> <src>* <dest> # 打包成 .har文件
4.1.3,SequenceFile ,使用文件名作为 key,文件内容作为 value。支持mr分块处理,支持压缩
最好将源数据直接写入 SequenceFile,而不是作为中间步骤写入小文件。
4.2 、数据倾斜如何调优
本质原因是,1,发生大量数据的网络传输 2,磁盘IO速度缓慢
4.2.1 配置项
hive.optimize.skewjoin=true; #默认false,如果存在数据倾斜可能性,可以将其设置为true SET hive.skewjoin.key=100000; #默认为100000,如果key的数量大于配置的值,则超过的数量的key对应的数据会被发送到其他的reduce任务 hive.groupby.skewindata=true #在分组任务,首先额外触发一个mr作业,该作业的map任务的输出会被随机地分配到reduce任务上,从而避免数据倾斜 hive.auto.convert.join=true # 大表和小表连接问题, 新版可以配置后,自动识别到此情况。
4.2.2 代码级
1,行列裁剪; 2个都是分桶表,连接key是分桶字段。 只读取需要的桶数据。
select name , order from table_a where date >= '2008-03-01' AND date <= '2008-03-31'
2,大表和大表连接问题
1,Key 字段加随机字段,把分区打散。
比如, a 和 b 表连接,连接的key集中于 date = 20200120
2,把2个表定义为 ”有序分桶表“ 使用 BUCKET MAP JOIN / SORT MERGE BUCKET MAP JOIN // 分桶 有序
HIVE 调优思路和实践的更多相关文章
- MySQL面试必考知识点:揭秘亿级高并发数据库调优与最佳实践法则
做业务,要懂基本的SQL语句: 做性能优化,要懂索引,懂引擎: 做分库分表,要懂主从,懂读写分离... 数据库的使用,是开发人员的基本功,对它掌握越清晰越深入,你能做的事情就越多. 今天我们用10分钟 ...
- [转]10分钟梳理MySQL知识点:揭秘亿级高并发数据库调优与最佳实践法则
转:https://mp.weixin.qq.com/s/RYIiHAHHStIMftQT6lQSgA 做业务,要懂基本的SQL语句: 做性能优化,要懂索引,懂引擎: 做分库分表,要懂主从,懂读写分离 ...
- 【Hive】Hive笔记:Hive调优总结——数据倾斜,join表连接优化
数据倾斜即为数据在节点上分布不均,是常见的优化过程中常见的需要解决的问题.常见的Hive调优的方法:列剪裁.Map Join操作. Group By操作.合并小文件. 一.表现 1.任务进度长度为99 ...
- Hive调优相关
前言 Hive是由Facebook 开源用于解决海量结构化日志的数据统计,是基于Hadoop 的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类 SQL查询功能. 在资源有限的情况下,提 ...
- 【原创 Hadoop&Spark 动手实践 8】Spark 应用经验、调优与动手实践
[原创 Hadoop&Spark 动手实践 7]Spark 应用经验.调优与动手实践 目标: 1. 了解Spark 应用经验与调优的理论与方法,如果遇到Spark调优的事情,有理论思考框架. ...
- 【Hive六】Hive调优小结
Hive调优 Hive调优 Fetch抓取 本地模式 表的优化 小表.大表Join 大表Join大表 MapJoin Group By Count(Distinct) 去重统计 行列过滤 动态分区调整 ...
- MySQL性能调优思路
1.MySQL性能调优思路 如果一台服务器出现长时间负载过高 /周期性负载过大,或偶尔卡住如何来处理? 是周期性的变化还是偶尔问题?是服务器整体性能的问题, 还是某单条语句的问题? 具体到单条语句, ...
- Hive调优笔记
Hive调优 先记录了这么多,日后如果有遇到,再补充. fetch模式 <property> <name>hive.fetch.task.conversion</name ...
- (转) hive调优(2)
hive 调优(二)参数调优汇总 在hive调优(一) 中说了一些常见的调优,但是觉得参数涉及不多,补充如下 1.设置合理solt数 mapred.tasktracker.map.tasks.maxi ...
- (转)hive调优(1) coding调优
hive 调优(一)coding调优 本人认为hive是很好的工具,目前支持mr,tez,spark执行引擎,有些大公司原来封装的sparksql,开发py脚本,但是目前hive支持spark引擎(不 ...
随机推荐
- .NET为什么推荐它作为RabbitMQ消息队列的首选开发工具
支持.Net Core(2.0及以上)/.Net Framework(4.5及以上),可以部署在Docker, Windows, Linux, Mac. RabbitMQ作为一款主流的消息队列工具早已 ...
- 关于我在学习LFU的时候,在开源项目捡了个漏这件事。
你好呀,我是歪歪. 这篇文章带大家盘一下 LFU 这个玩意. 为什么突然想起聊聊这个东西呢,因为前段时间有个读者给我扔过来一个链接: 我一看,好家伙,这不是我亲爱的老朋友,Dubbo 同学嘛. 点进去 ...
- MySQL数据库报1055错误
有点坑啊,当初装MySQL数据库的时候没有整配置文件,结果MySQL报1055错误的时候,网上的解决办法都说如果需要永久生效的话,只能通过改配置文件实现,but,我没有配置文件,蜜汁尴尬啊 1.已安装 ...
- Android JetPack~ DataBinding(数据绑定)(一) 集成与使用
近期将会梳理一下JetPack全家桶的使用,包括DataBinding,Room,ViewModel,LiveData,Navigation等. 本来打算先写DataBinding的使用,没想到在17 ...
- Visual Studio 集成了.NET 升级助手插件
.NET团队2023年2月16日在官方博客上发布了名为".NET Upgrade Assistant"的全新 Visual Studio 扩展,帮助开发人员升级.NET 应用程序. ...
- yaml进阶用法
我们知道 json 是 yaml 的子集,作为超集的 yaml,必然有着很多与 json 不一样的特性,比如定义变量.引用.拼接等,下面来看看吧~ 为了方便和python的字典快速对比,我们直接使用y ...
- python实现移动二级目录下的文件到一级目录
python实现移动二级目录下的文件到一级目录 import os import shutil import sys def move_to_work_folder(work_path, cur_pa ...
- python批量修改一个文件夹下含多个文件夹中的所有图片名称
网上能找到的,大多是只对一个文件夹下所有图片进行重命名的代码. 这边实现的是,一个文件夹下有多个文件夹内图片的重命名. rename.py #!/usr/bin/python # -*- coding ...
- 开源分布式任务调度系统就选:DolphinScheduler
分布式任务调度这个话题是每个后端开发和大数据开发都会接触的话题.因为应用场景的广泛,所以有很多开源项目专注于解决这类问题,比如我们熟知的xxl-job. 那么今天要给大家推荐的则是另一个更为强大的开源 ...
- C++实现二叉树的定义与操作
头文件及常量定义 #include<stdio.h> #include<stdlib.h> #include<stdarg.h> #include<iostr ...