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.(注意,要留一些系统空间! ...
随机推荐
- base64位代码转图片文件并保存到文件夹的解决方案
#region Base64 转图片方法 protected string Base64StringToImage(string strbase64) { try { string imgurl = ...
- Linux - 用户权限相关命令
用户权限相关命令 目标 用户 和 权限 的基本概念 用户管理 终端命令 组管理 终端命令 修改权限 终端命令 01. 用户 和 权限 的基本概念 1.1 基本概念 用户 是 Linux 系统工作中重要 ...
- 从零开始学spring cloud(三) -------- Eureka简介
1.服务发现组件:Eureka Eureka的开源文档介绍地址:https://github.com/Netflix/eureka/wiki/Eureka-at-a-glance What is Eu ...
- Java8-函数式接口理解及测试
1. 函数式接口的理解 根据重构的思想,需要把容易变化的模块进行抽象并封装起来,从这个点来看,Java8新引入的函数式接口就是基于这个思想进行设计的. 2. 函数式接口定义 2.1 自定义如下 需要 ...
- vue项目中使用less或者sass的方法
半年木有更新博客了... 前段时间一直在学习vue,开始记录一下遇到的问题吧 这篇文章主要是总结一下vue中使用less或者sass的方法,以less为例(style.less) 主要是两种 1.对于 ...
- LAB6 SOAP
有web服务的,需要Deploy一下才能跑 通过ls看所有文件的所在地,cd进入对应文件夹,才可以编译 javac 编译,Java是执行 URL必须是WSDL文件点进去里面的:http://local ...
- 浅谈spring为什么推荐使用构造器注入
转载自: https://www.cnblogs.com/joemsu/p/7688307.html 一.前言 Spring框架对Java开发的重要性不言而喻,其核心特性就是IOC(Inversi ...
- Oracle 存储过程笔记.
业务说明: 主要用于计算采购加权平均价.入参为年份和月份,首先判断输入的年月是否已经结账,如果已经结账就将所有物料和供应商的采购加权平均价返回. 要点说明: 1.如何在存储过程中定义临时表 答:ora ...
- JavaSE基础知识(6)—异常和异常处理
一.异常的理解及体系结构图 1.理解 异常:程序运行过程中发生的不正常现象.java中的错误: 语法错误 运行异常 逻辑错误 2.体系图 java程序在执行过程中所发生的异常分为两类: Error:J ...
- node 常用模块及方法fs,url,http,path
http://www.cnblogs.com/mangoxin/p/5664615.html https://www.liaoxuefeng.com/wiki/001434446689867b2715 ...