hive建表说明:
目前我们建表主要使用两种方式,默认的text格式和orc格式。orc格式采用列式存储方式,可以较好的减少磁盘IO。orc增加了轻量级的索引,默认采用ZLIB压缩,有很好的压缩比。
使用场景:每天上G的数据建议采用ORC。数据量比较小的话可以自由选择text和orc两种方式。
hive 小文件处理说明:
解决方式分为两种。1)控制每个任务处理的最小数据量 2)输出结果控制,通过配置参数让程序自动启动一个任务来合并文件。两种方法应用场景不太一样。
针对表格式为ORC存储的小文件处理参数为:
set hive.merge.mapredfiles = true;
set hive.merge.mapfiles = true;
set hive.merge.smallfiles.avgsize = 134217728;
set mapred.min.split.size = 134217728;
set mapred.max.split.size = 268435456;
set mapred.min.split.size.per.node = 134217728;
set mapred.min.split.size.per.rack = 134217728;
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
针对表格式为TEXT存储的小文件处理参数为:
set hive.merge.mapredfiles = true;
set hive.merge.mapfiles = true;
set hive.merge.smallfiles.avgsize = 134217728;
hive主要参数调优使用场景
查询时间过长或者partition(分区)比较多的场景:jvm
set mapred.job.reuse.jvm.num.tasks=10;
reducer数据量过大的情况或者reducer负载过高
可以适当调整reducer个数,不要过高,目前集群默认配置最大数目为100。此参数一般不要设置。
set hive.exec.reducers.max=150;
Hive 编程注意点
注意:hive sql运行是否高效,主要在于sql本身编写的是否合理高效,参数调优只是在某种条件下对减少运行时间有帮助。
避免不必要的数据扫描,设定分区
各个表之间的连接最好采用括号括起来的子查询方式,如果可以在连接之前进行的计算,那么尽量在连接之前进行计算,减少连接之后的数据量。一方面是因为mysql和hive执行引擎优化逻辑不一样,mysql会更加智能一 些,另一方面是为了方便查找sql问题,可以更快速的定位问题。
注意多表连接的执行计划
减少不必要的数据表的重复扫描,同时减少不必要的java对象生成
Hive 函数介绍:
见此博客:https://blog.youkuaiyun.com/hellojoy/article/details/82592059
这里我只记录一个使用点:
select date, 2 is_asdk from test ;
在本查询语句中使查询出来的is_asdk字段值为2。
top n:
需求:求取华为和oppo这两个品牌中使用者数目排行前十的机型;
select manu,model from(select manu,model,row_number() over(partition by manu order by number desc) rank from (select split(device,"_")[0] manu, split(device,"_")[1] model,count(distinct(cuid)) number from dsdk.user_behavior where upper(split(device,"_")[0]) in("HUAWEI","OPPO") and date= '20190103' group by split(device,"_")[0],split(device,"_")[1] ) tb )tb1 where tb1.rank <=10
stream join:
在多表级联时,一般大表都写在最后,因为写在最后的表默认使用stream形式加载,其他表的结果缓存在内存中。
可以使用/*+ STREAMTABLE(a) */ 来标示具体哪个表使用stream形式。在表关联时,使用该标识来指出大表,能避免数据表过大导致占用内存过多而产生的问题
SELECT /*+ STREAMTABLE(a) */ a.val, b.val, c.val FROM a JOIN b ON (a.key = b.key1) JOIN c ON (c.key = b.key1)
Hive体系结构
角色:gateway, metadata,hiveserver1,hiveserver2
gateway:由于Hive服务没有工作者角色,因此需要另一种机制来支持将客户机配置自动传播到集群中的其他主机。网关角色实现此功能。网关实际上并不是真正的角色,也没有状态,但是它们作为指示客户端配置应该放在哪里的指示器。在添加Hive服务时,默认情况下会创建Hive网关。当配置了gateway,当一个节点的hive数据发生更改时,其余节点同步更改。
metadata: 元数据服务组件,这个组件存储hive的元数据,hive的元数据存储在关系数据库里,hive支持的关系数据库有derby、mysql。元数据对于hive十分重要,因此hive支持把metastore服务独立出来,安装到远程的服务器集群里,从而解耦hive服务和metastore服务,保证hive运行的健壮性.
Hive有2个服务端守护进程:Hiveserver2:支撑JDBC访问,Thrift服务。MetaStore Server:支撑访问元数据库的服务。