| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> 大数据篇(2-3)--Hive(3)Hive调优 -> 正文阅读 |
|
[大数据]大数据篇(2-3)--Hive(3)Hive调优 |
hvie调优可以分为几个模块进行考虑,数据的压缩与存储,hive参数的优化,sql的优化,解决数据的倾斜等。 一,数据的压缩与存储格式1)压缩方式 ????? 压缩可以节约磁盘的空间,基于文本的压缩率可达40%+; 压缩可增加吞吐量和性能量(减小载入内存的数据量),但是在压缩和解压过程中会增加CPU的开销。所以针对IO密集型的jobs(非计算密集型)可以使用压缩的方式提高性能。 几种压缩算法:
2)存储格式(行存与列存) 1. TextFile 2.Sequence Files 3. RCFile 4.ORCFile 5.Parquet
建表中与mapreduce可以选择压缩的地方 设置方式: 1. map阶段输出数据压缩 ,在这个阶段,优先选择一个低CPU开销的算法。
2.hive.exec.compress.output:用户可以对最终生成的Hive表的数据通常也需要压缩。该参数控制这一功能的激活与禁用,设置为true来声明将结果文件进行压缩。 (也可以在建表的时候进行设置)
结论,一般选择orcfile/parquet + snappy 的方式 建表语句:
二、创建分区表,桶表1)创建分区表:(分区表相当于hive的索引,加快查询速度) 2)创建桶表: 三、hive参数优化1)fetch task 为执行hive时,不用执行MapReduce。如select * from emp;
2)并行执行 当一个sql中有多个job时候,且这多个job之间没有依赖,则可以让顺序执行变为并行执行(一般为用到union all )
3)jvm 重用 重用JVM可以减少JVM启动时带来的开销: JVM重用对hive的性能具有非常大的 影响,特别是对于很难避免小文件的场景或者task特别多的场景,这类场景大多数执行时间都很短。jvm的启动过程可能会造成相当大的开销,尤其是执行的job包含有成千上万个task任务的情况。
备注: ????????JVM的一个缺点是,开启JVM重用将会一直占用使用到的task插槽,以便进行重用,直到任务完成后才能释放。如果某个“不平衡“的job中有几个 reduce task 执行的时间要比其他reduce task消耗的时间多得多的话,那么保留的插槽就会一直空闲着却无法被其他的job使用,直到所有的task都结束了才会释放。 4)设置reduce的数目
reduce个数的设定极大影响任务执行效率,不指定reduce个数的情况下,Hive会猜测确定一个reduce个数,基于以下两个设定:
?计算reducer数的公式很简单N=min(参数2,总输入数据量/参数1) 即,如果reduce的输入(map的输出)总大小不超过1G,那么只会有一个reduce任务; reduce个数并不是越多越好; 同map一样,启动和初始化reduce也会消耗时间和资源; 另外,有多少个reduce,就会有多少个输出文件,如果生成了很多个小文件,那么如果这些小文件作为下一个任务的输入,则也会出现小文件过多的问题 5) 推测执行 ??什么是推测执行? ????????所谓的推测执行,就是当所有task都开始运行之后,Job Tracker会统计所有任务的平均进度,如果某个task所在的task node机器配置比较低或者CPU load很高(原因很多),导致任务执行比总体任务的平均执行要慢,此时Job Tracker会启动一个新的任务(duplicate task),原有任务和新任务哪个先执行完就把另外一个kill掉 怎么配置推测执行参数?
四、优化sql(1)where条件优化 优化前(关系数据库不用考虑会自动优化):
优化后(where条件在map端执行而不是在reduce端执行):
(2)union优化 尽量不要使用union (union 去掉重复的记录)而是使用 union all 然后在用group by 去重 (3)count distinct优化 不要使用count (distinct?? cloumn) ,使用子查询
(4) 用in 来代替join 如果需要根据一个表的字段来约束另为一个表,尽量用in来代替join .
(5)消灭子查询内的 group by 、 COUNT(DISTINCT),MAX,MIN。 可以减少job的数量。 (6) join 优化:
Map join : 连接发生在map阶段 , 适用于小表 连接 大表 ? ? ? ? ? ? 大表的数据从文件中读取 ? ? ? ? ? ? 小表的数据存放在内存中(hive中已经自动进行了优化,自动判断小表,然后进行缓存) SMB join: ?? Sort -Merge -Bucket Join? 对大表连接大表的优化,用桶表的概念来进行优化。在一个桶内发送生笛卡尔积连接(需要是两个桶表进行join)
五、数据倾斜某个reduce的数据输入量远远大于其他reduce数据的输入量 (比如:任务进度长时间维持在99%(或100%),查看任务监控页面,发现只有少量(1个或几个)reduce子任务未完成。因为其处理的数据量和其他reduce差异过大。) 原因: 1)、key分布不均匀 2)、业务数据本身的特性 3)、建表时考虑不周 4)、某些SQL语句本身就有数据倾斜
解决方案: (1)参数调节
(2) 熟悉数据的分布,优化sql的逻辑,找出数据倾斜的原因。 六、合并小文件小文件的产生有三个地方,map输入,map输出,reduce输出,小文件过多也会影响hive的分析效率: 设置map输入的小文件合并
设置map输出和reduce输出进行合并的相关参数:
更多Hive内容: 大数据篇(2-3)--Hive(3)Hive调优??????? |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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 0:52:02- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |