hive在大数据套件中占很的地位,分享下个人经验。
1.在hive日常开发中,我们首先面对的就是hive的表和库,因此我要先了解库,表的命名规范和原则
如 dwd_whct_xmxx_m
第1部分为表数据仓库分层:可能取值为ods,dwd(dw明细层),dws(dw汇总层),ads(应用层)等。
第2部分为业务领域 可能为whct(文化传统),whcp文化产品等。
第3层为用户自定义标签 比如项目信息为xmxx,用户可以可以自己定义业务,项目和产品标签
第4层为时间标签:比如d为天,m为月,y为年,di为增量表,df为全量表。
ods:源头数据原封不动的抽取一遍,准备层。
dw:dwd(数据仓库明细层),dws(数据仓库汇总层)经过ods层数据经过etl清洗,转换,加载生成。
ads:应用层,各个业务方或部门基于dwd和dws建立的数据集市(DM),原则上asd层数据是基于dw层的,不能直接访问ods层,该层只包含部门或业务方自己关心的dwd和dws。
这是使用hive的第一步,没有好的命名规则,那最后会一片狼藉。
2.hsql运行原理
熟悉hive sql 在 hadoop 上 mapreduce的运行原理,不知道这些,很难优化sql,减少资源的浪费。如下:
1)select 数据
eg :select * from tb_tbale where cloumn1 = '2019' and cloumn2 = 'hive';
执行select 语句时,hive只有map阶段,无shuffle和reduce。
map:该阶段会根据split个数开启几个map,每个map task会接收到一个split文件,于是每个map函数会逐行对输入的文件进行检测筛选出cloumn1为2019,cloumn2为hive的数据,保存在本地。
map的个数可以这样理解。如果文件为256M,hadoop2(每个块128)的话,会开启2个map。289M就会三个,要注意的是这些map都是并行执行的,当数据量特别大
的时候开启的map会越多,理论上还会并行执行,所以我们一定要养好习惯select数据的时候一定要加上where条件,避免盲目查询。
2)gruop by
eg: select cloumn1,count(*) from tb_tbale where cloumn2 = ‘hive’ group by cloumn1
map:分完片的文件会产生相应数量的map,每个map会逐行检测cloumn2是否为hive,如果是hive它会生成键值对<cloumn1,1>。
combine: 该操作发生在对应的文件中,也就是讲map分了几个,也就有几个combine,他会把map端产生的键值对相同的key对进行累加如<cloumn1,3>。
shuffle:该操作比较复杂,分为partition,sort,spill,copy,merge.最重要的就是分区和合并过程。
map生成的task会通过对每个键取hash值,使map task按照相同的键均匀分配到reduce上,这个过程就是分区,分配到同一个reduce上的task会经过合并过程
生成这样的键值对<cloumn1,{3,1}>>做完reduce task输入。
reduce:调用函数将他没累加即可,3+1=4
3)join
eg: select t1.cloumn1,t2.cloumn2 from (select cloumn1,cloumn3 from tb_table1) t1 join (select cloumn2,cloumn3 from tb_table2) t2 on t1.cloumn3= t2.cloumn;
会开启三个mapreduce任务。第一个会执行select cloumn1,cloumn3的操作,第2个会执行selec cloumn2,cloum3的操作,主要是第三个,会把第一个和第2个
的结果进行关联合并,然后输出。
split:jion的时候会把第一个mapreduce和第2个MapReduce任务的输出文件输入该次任务。首先会对前两个任务进行分片。hadoop大于128mb分一个片。
map:hadoop 集群根据spilt出来分结果开启相应个数的map task
shuffle:jion时,主要是分区操作,jion的列进行数据的重分布和分发过程,分区的类为cloumn3,于是所有的map task都根据cloumn3进行发布。相同jion知道就会
发生到同一个reducer上。
reduce:shuffle发送的cloumn1,cloumn3 ; cloum2,cloum3.就会根据cloum3 发送到 reduce task上。这个时候根据cloum3将他们的值变成一行,保留到本地输
处文件中
3.hive函数:
了解hive函数对我们数据分析等十分重要,常用日期函数如下:
日期函数:Date_add,datediff,to_date,from_unixtime,unix_timestamp
字符串函数:substr,concat,concat_ws,split,regexp_replace,get_json_object,trim,length
聚合函数:abs,ceil,floor,round,rand,pow
数字函数:count,max,min,avg,count distinct,sum,group_concat
窗口函数:Row_number,lead,lag,rank
其他函数:Coalesce,cast,decode explode
4.hive 简单优化:
1)对于group by引起的倾斜,只要设置下面的参数
set hive.map.aggr =ture
set hive.groupby.skewindata=true
此时hive数据倾斜时会发生负载均衡,生成的查询计划会有两个MapReduce job。第一个MapReduce job中,map输出结果聚合会随机分配到reduce中,每个reduce做部分均和操作并输出结果,这样处理结果是相同的groupbykey有可能被分布到不同的reduce中,所以达到了负载均衡的目的,第2个MapReduce job再根据预处理的数据结果按照groupbykey分布到reduce中,最后完成聚合操作。
2)对于count distinct的优化
在hive开发过程中应该小心使用count distinct,因为很可能出现性能问题,比如
select count(distinct name)from dwd_some_table;
此时因为要去重,hive会把map阶段的输出全部分配到一个reduce task 上,此时很容易发生性能问题,这样我们可以这样先group by 再count,减少distinct的使用。
select count(1) from (select name from dwd_some_table group by user) tmp;
3)对于join的优化最为常用,也很广泛,我给它分为如下几种:
大表join小表:
现实世界的28法则会把百分之八十的数据集中在百分之二十的用户上,数据倾斜很难不会发生,这时候大表join小表的时候可以使用mapjoin的方法来优化,
格式为/*+mapjoin(b,c,d),join个表,mapjoin的优化在map端进行join,不是像通常那样在reduce端按照join列来进行分发后在每个reduce任务节点进行join,不分发也就没有了倾斜问题。相反hive会把小表全量复制到每个map任务节点,然后map任务节点执行lookup小表便可。这样小表不可以太大,不然全量复制得不偿失。
参数hive.auto.convert.join.noconditionaltask.size 来确定是否为小表,默认为25M,最大不可以调节大于1G.
5.创建一个分区表,以 ds 为分区列:
create table invites (id int, name string) partitioned by (ds string) row format delimited fields terminated by 't' stored as textfile;
将数据添加到时间为 2013-08-16 这个分区中:
load data local inpath '/home/hadoop/Desktop/data.txt' overwrite into table invites partition (ds='2013-08-16');
从一个分区中查询数据:
select * from invites where ds ='2018-11-14';
往一个分区表的某一个分区中添加数据:
insert overwrite table invites partition (ds='2018-11-14') select id,max(name) from test group by id;
可以查看分区的具体情况,使用命令:
hadoop fs -ls /home/hadoop.hive/warehouse/invites
或者:
show partitions tablename;
6. 创建带桶的 table :
create table bucketed_user(id int,name string) clustered by (id) sorted by(name) into 4 buckets row format delimited fields terminated by '\t' stored as textfile;
首先,我们来看如何告诉Hive—个表应该被划分成桶。我们使用CLUSTERED BY 子句来指定划分桶所用的列和要划分的桶的个数
CREATE TABLE bucketed_user (id INT, name STRING)
CLUSTERED BY (id) INTO 4 BUCKETS;
桶中的数据可以根据一个或多个列另外进行排序。由于这样对每个桶的连接变成了高效的归并排序(merge-sort), 因此可以进一步提升map端连接的效率。以下语法声明一个表使其使用排序桶:
CREATE TABLE bucketed_users (id INT, name STRING)
CLUSTERED BY (id) SORTED BY (id ASC) INTO 4 BUCKETS;
7.hive动态分区
动态分区导入:
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
insert overwrite table user_log_p_action partition(p_action)
select user_name
,action_type
,ip
,action_type as actiontype
from user_action_log
其中p_action是分区表的分区字段名称
,action_type as actiontype:必须要放在表正式字段的后面,按顺序这个位置往后是分区字段值,动态导入的过程就是根据分区字段值来分区的
- 大数据开发实战:Hive优化实战3-大表join大表优化
5.大表join大表优化 如果Hive优化实战2中mapjoin中小表dim_seller很大呢?比如超过了1GB大小?这种就是大表join大表的问题.首先引入一个具体的问题场景,然后基于此介绍各自优 ...
- 大数据开发实战:Hive优化实战2-大表join小表优化
4.大表join小表优化 和join相关的优化主要分为mapjoin可以解决的优化(即大表join小表)和mapjoin无法解决的优化(即大表join大表),前者相对容易解决,后者较难,比较麻烦. 首 ...
- 大数据开发实战:Hive优化实战1-数据倾斜及join无关的优化
Hive SQL的各种优化方法基本 都和数据倾斜密切相关. Hive的优化分为join相关的优化和join无关的优化,从项目的实际来说,join相关的优化占了Hive优化的大部分内容,而join相关的 ...
- 大数据开发实战:Hive表DDL和DML
1.Hive 表 DDL 1.1.创建表 Hive中创建表的完整语法如下: CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name [ (col_nam ...
- 大数据开发实战:离线大数据处理的主要技术--Hive,概念,SQL,Hive数据库
1.Hive出现背景 Hive是Facebook开发并贡献给Hadoop开源社区的.它是建立在Hadoop体系架构上的一层SQL抽象,使得数据相关人员使用他们最为熟悉的SQL语言就可以进行海量数据的处 ...
- CentOS6安装各种大数据软件 第八章:Hive安装和配置
相关文章链接 CentOS6安装各种大数据软件 第一章:各个软件版本介绍 CentOS6安装各种大数据软件 第二章:Linux各个软件启动命令 CentOS6安装各种大数据软件 第三章:Linux基础 ...
- 2019春招——Vivo大数据开发工程师面经
Vvio总共就一轮技术面+一轮HR面,技术面总体而言,比较宽泛,比较看中基础,面试的全程没有涉及简历上的东西(都准备好跟他扯项目了,感觉是抽取的题库...)具体内容如下: 1.熟悉Hadoop哪些组件 ...
- 大数据开发实战:Spark Streaming流计算开发
1.背景介绍 Storm以及离线数据平台的MapReduce和Hive构成了Hadoop生态对实时和离线数据处理的一套完整处理解决方案.除了此套解决方案之外,还有一种非常流行的而且完整的离线和 实时数 ...
- 大数据开发-Spark-拷问灵魂的5个问题
1.Spark计算依赖内存,如果目前只有10g内存,但是需要将500G的文件排序并输出,需要如何操作? ①.把磁盘上的500G数据分割为100块(chunks),每份5GB.(注意,要留一些系统空间! ...
随机推荐
- js问题: is not a function
今天遇到一个js问题,函数名和页面上的一个element的id重复了.第一次进入这个页面的时候可以点击触发事件,在第二次点击触发事件的时候就会报如下错误. js代码截图: 函数名和页面上的一个元素的i ...
- gym 101982 B题 Coprime Integers
题目链接:https://codeforces.com/gym/101982/attachments 贴一张图吧: 题目意思就是给出四个数字,a,b,c,d,分别代表两个区间[a,b],[c,d],从 ...
- docker image 详解
docker iamge docker 镜像: [root@localhost ~]# docker image --help Usage: docker image COMMAND 管理镜像 Com ...
- 测H5
如果原文本自带样式,需要测在h5里能否正常展示
- web 文件上传的几种方式
问题 文件上传在WEB开发中应用很广泛. 文件上传是指将本地图片.视频.音频等文件上传到服务器上,可以供其他用户浏览或下载的过程. 以下总结了常见的文件(图片)上传的方式和要点处理. 表单上传 这是传 ...
- angular使用Md5加密
一.现象 用户登录时需要记住密码的功能,在前端需要对密码进行加密处理,增加安全性 二解决 1.利用npm(如果没有,先自行安装npm)安装ts-md5 npm install ts-md5 --sav ...
- docker创建镜像及push镜像出错问题
docker build 出错 Got permission denied while trying to connect to the Docker daemon socket at unix:/ ...
- 修改当前会话的sql_mode
-- show variables like 'sql_mode'; -- set session sql_mode="ONLY_FULL_GROUP_BY,STRICT_TRANS_TAB ...
- oracle分区表的使用和查询
本文参考了 https://blog.csdn.net/mzglzzc/article/details/46300645 一 创建和使用分区表 1.范围分区(RANGE)范围分区将数据基于范围映射到 ...
- 构造 this super
构造方法 我们对封装已经有了基本的了解,接下来我们来看一个新的问题,依然以Person为例,由于Person中的属性都被private了,外界无法直接访问属性,必须对外提供相应的set和get方法.当 ...