HIVE 架构及原理
架构图

1.Client:用户接口———三种使用方式
1、CLI hive 命令行模式command-line interface
直接输入/hive/bin/hive的执行程序,或者输入 hive –service cli 用于linux平台命令行查询,查询语句基本跟MySQL查询语句类似
2、hive web界面的启动方式
hive –service hwi 用于通过浏览器来访问hive
hive –service hwi 用于通过浏览器来访问hive,如果lib目录下没有hive-hwi-{version}.war包,我们要自己打包
3、jdbc远程连接hiveserver2
2.Metastore:元数据 元数据包括表名、表所属的数据库、表的拥有者、列/分区字段、表的类型、表的数据所在目录等;默认存储在自带的derby数据 库中,由于开启多个hive时会报异常,推荐使用MySQL存储Metastore。
3.Hadoop 使用HDFS进行存储数据,使用MapReduce进行计算。
4.Driver:驱动器
解析器(SQL Parser):将SQL字符串转换成抽象语法树AST,对AST进行语法分析,比如表是否存在,字段是否存在,SQL语 义是否有误。 编译器(Physical Plan):将AST编译生成逻辑执行计划。 优化器(Query Optimizer):对逻辑执行计划进行优化。
结论
Hive通过给用户提供的一系列交互接口,接收到用户的指令(SQL),使用自己的驱动器(Driver),将SQL语句解析成对应的MapReduce程序,并生成相应的mapreduce jar包,结合元数据(MetaStore)提供的对应文件的路径,提交到Hadoop的Yarn中执行,最后将执行结果输出到用户交互接口,数据存储在HDFS当中。
Hive将元数据存储在数据库中,如mysql、derby。Hive中的元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等。
解释器、编译器、优化器完成HQL查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。生成的查询计划存储在HDFS中,并在随后由MapReduce调用执行。
Hive的数据存储在HDFS中,大部分的查询、计算由MapReduce完成(注意,简单的列查询不会生成MapRedcue任务)

1.用户提交 查询等任务 给 Driver
2.Driver会发送 查询操作到Compiler(编译器)去生成一个execute plan
3.Compiler根据用户任务去MetaStore中获取需要的Hive的元数据信息。
4.Compiler得到元数据信息,对task进行编译,先将HiveQL转换为抽象语法树,然后将抽象语法树转换成查询块,将查询块转化为逻辑的查询plan,重写逻辑查询plan,将逻辑plan转化为物理的plan(MapReduce), 最后选择最佳策略。
5.将最终的plan提交给Driver
6.Driver将plan转交给ExecutionEngine去执行,将获取到的元数据信息,提交到JobTracker或者ResourceManager执行该task,任务会直接读取到HDFS中进行相应的操作。
7.获取执行的结果。
8.取得并返回执行结果。
优化器是一个不断更新的组件,大部分plan的转移都是通过优化器完成的。
常用语句
行转列:
1.先用explode炸开,去重
select distinct tmp.sub
from
(select explode(subject) as sub from t_stu_subject) tmp;
2.lateral view
select id, name,tmp.sub
from t_stu_subject lateral view explore(subjects) tmp as sub;
HIVE wordcount:
select word,count(1) as num
from (select explore(split(sentence,' ')) as word
from t_name) tmp
group by word
order by num desc;
类型转化:
select id,cast(birthday as date) as bir,cast(salry as floot) from t_name;
求出每人的累加总额
1.先求出每人每月的总额
create table t_account as
select id, month ,sum(account)
from t_n
group by id,month
2.join
create table t_tmp as
select a.id as id,a.month as month,a.t_account as accounts,b.account as account,
from t_account a join t_account b
on a.id = b.id
where a.month<=b.month;
3.累加
select id,month,max(amount) as account,sum(accounts) as mounts
from tmp
group by id,month;
第二种方法:
sum(amount) over(parttition by uid order by month rows between unbounded preceding and current row)
活跃用户
select ip,uid,access_time,url
from(select ip,uid,access_time,url,
row number() over(partition by uid order by access_time) as rn
from t_web
where day =5.17)tmp
where rn =1;
本文详细介绍了Hive的架构,包括Client、Metastore、Hadoop存储和Driver四个部分,强调了元数据在Hive中的重要性,以及如何通过Driver将SQL转化为MapReduce任务执行。此外,还分享了Hive的行转列、wordcount和类型转化等常用语句。
164

被折叠的 条评论
为什么被折叠?



