登 录
注 册
< 大 数 据
Flink
Hadoop
Spark
Hive
HBase
Kafka
其他框架
生产中常见问题
Hive压缩和存储
通过JDBC访问
企业级调优(一)
企业级调优(二)
企业级调优(三)
UDF实战
Hive调优参数大全
热门推荐>>>
中台架构
中台建设与架构
Hadoop
源码分析-NN启动(三)
HBase
HBased对接Hive
Linux
Nginx高可用
Python
数据导出工具
Flink
3分钟搭建Flink SQL测试环境
Kafka
Kafka对接Flume
深度学习
卷积神经网络
数据结构与算法
选择合适的算法
MySQL
数据备份恢复
计算机系统
信号量同步线程
其他框架
Azkaban Flow1.0与2.0
ClickHouse
表引擎-其他类型
技术成长
最好的职业建议
精选书单
技术成长书单—机器学习
技术资讯
数据在线:计算将成为公共服务
开发工具
IntelliJ IDEA 20年发展回顾(二)
系统工具
Mac命令行工具
虚拟化
内存虚拟化概述
云原生
云原生构建现代化应用
云服务
一文搞懂公有云、私有云...
Java
Spring Boot依赖注入与Runners
Go
Go函数与方法
SQL
SQL模板
安全常识
一文读懂SSO
当前位置:
首页
>>
Hive
>>
企业级调优(三)
企业级调优(三)
2020-10-08 20:43:25 星期四 阅读:2247
####Hive小文件合并 ①、输出合并:(有Map输出和reduce输出) 以下设置均是临时修改,只在当前会话有效。永久生效需要在hive-default.xml文件里修改 ``` #在Map-only的任务结束时合并小文件 set hive.merge.mapfiles = true #在Map-Reduce的任务结束时合并小文件 set hive.merge.mapredfiles = true #合并文件的大小 set hive.merge.size.per.task = 256*1000*1000 #当输出文件的平均大小小于该值时,启动一个独立的map-reduce任务进行文件merge set hive.merge.smallfiles.avgsize=16000000 ``` 我们要做的就是设置hive.merge.smallfiles.avgsize,这里建议设置为5000000 = 5M , 即当输出文件的平均大小小于该值时,启动一个独立的map-reduce任务进行文件merge ②、增加reduce数量,提高hive运行速度 ``` set mapred.reduce.tasks=10; ``` ####Map join【生产环境中常用】 注:在hive2.0版本中,map join是自动完成的,不需要手动指定小表。 在传统的数据库中,使用join的方式有3种: ①、loop方式:逐行比较,就是拿A表中的每个值和B表中的每个值比较,如果两个表中的数据量大,(比如A表有100W行,B表有100W行,那就比较100W*100W次) ②、sort(排序方式):对表中的数据进行排序,减少比较的次数。 ③、hash方式【传统数据库用的最多】:把A表和B表中的数据都转换成hash值,直接按照hash值比较。比较的时候直接比较hash值的前几位了就可以了。 在hive中使用join的方式只有loop方式,默认情况下join在reduce中比较。 `map join 的使用条件` ①、当其中一个表是小表(能够驻留在内存中); ②、当数据倾斜的时候; 可以通过使用hint的方式指定join时使用mapjoin。 ``` SELECT /*+ mapjoin(A)*/ f.a,f.b FROM A t join B f on ( f.a=t.a and f.ftime=20110802) ``` 其中mapjoin(A)表示把A表放在内存中,再运行发现执行的效率比以前的写法高了好多。 在生产环境中MR运行正常的标准:【注意:是平均时长】 每个map平均运行的时间<50秒。 每个reduce均运行的时间<50秒 ###Hive 索引、表压缩 ①、索引:生产中用的不多。比较鸡肋 ②、 hive 表压缩:减少存储空间,在特定的场合可以用,不频繁使用的大文件才可以开启压缩功能 启动压缩 ``` hive> set hive.exec.compress.output=true; hive> set mapred.output.compress=true; #MR输出压缩格式 hive> set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec; #文件IO传输的压缩格式 hive> set io.compression.codecs=org.apache.hadoop.io.compress.GzipCodec; ``` ####SQL设计【重点】 Hive是将符合SQL语法的字符串解析生成可以在Hadoop上执行的MapReduce的工具。`使用Hive尽量按照分布式计算的一些特点来设计sql`,和传统关系型数据库有区别,所以需要去掉原有关系型数据库下开发的一些固有思维。 基本原则:`尽量尽早地过滤数据,减少每个阶段的数据量`,对于分区表要加分区,同时只选择需要使用到的字段。 比如,如下SQL: ``` select ... from A join B on A.key = B.key where A.userid>10 and B.userid<10 and A.dt="20200417" and B.dt="20200417"; ``` 应该改写为两个子查询,也就是先过滤: ``` select .... from (select .... from A where dt="20200417" and userid>10 ) a join (select .... from B where dt="20200417" and userid < 10 ) b on a.key = b.key; ``` 总结:join过程中,如果每个单表都有where条件,则先where再join,也就是先把数据量过滤掉一部分再join。 ###值为空不参与关联 空字段join就相当于浪费资源,因为空值跟所有值比,没有意义,两个空值比,也没有意义。正确的做法是【先排除空值再比较】 ``` select * from log a join users b on a.user_id is not null and a.user_id = b.user_id unoin all select * from loga where a.user_id is null; ``` 或者【rand()是随机数。如果是空,直接输出"hive"和随机数,不参与比较。不为空才参与比较】 ``` select * from log a left outer join users b on case when a.user_id is null then concat("hive",rand()) else a.user_id end =b.user_id; ```