深度理解篇之Hive-个人拙见

Hive

公司的数据越来越多,业务越来越多,会伴随着在存储层存下不同的文件,每个文件代表什么意思呢?打开文件之后,每一列代表什么意思呢?

这时候就很难去分别,很难去管理了,人很难通过电脑记录下来将这写不同的数据,所以可以通过第三方存储系统来存储这些记录,比如说数据库建表来记录那个目录里面存的是什么数据,每个数据有什么特点,每一行每一列代表什么意思。总体的意思就是我们得有一个存储系统来记录大量业务所产生的数据的元数据,因为一个文件打开,里面肯定有数据,面向这个文件,有文件的元数据,面向文件里面的数据,也有这些数据的元数据,也就是现在就要管住这些数据的元数据,所以产生了Hive中的metastore,metastore只是一种存储映射关系,将文件系统中的文件以及里面的数据,映射成table表格结构化,以便管理数据查询.

而在Hive中metastore不只是做元数据的管理,还提供给我们一种sql,它还支持了结构化查询语句sql,就是在数据管理的时候只需要写sql就可以了,因为Hive会将我们的写的sql变成计算框架程序,可以变成MapReduce,可以变成Spark,可以随便挑随便配,在这个过程当中sql是如何变成计算框架的呢?是怎么实现的呢?这里呢Hive中又引入了Driver,Driver只是一种概念型的东西,是由那些进程来构成的呢,怎么去解析sql呢?首先metastore进程首先得启动,它是吧元数据存储在mysql或者Derby这样的数据库中,比如说我们在使用Hive --service metastore开启了一个Hive的服务进程Cli,Cli是意思呢?Comnd Line interface命令行接口,也就是直接在使用Hive命令之后,Hive给我们提供了一个命令行接口,我们可以在命令行中输入sql,这个Hive服务就是一个JVM进程Cli命令行接口就是一个Driver,当在Cli出入sql时,是由Hive这个进程来解析我们写的sql,写sql是我们不可避免滴会写一个关键字from,不如from table1,这个字符串,它代表什么意思呢,这时候Hive这个进程就会资讯metastore,会在metastore中找到table1这个定义,Hive服务会有一个location的关键字,告诉他这个table1的字符串指向了磁盘的某一个目录,会有内部表和外部表,但是就是一个目录,为什么呢?抛开上层我们写逻辑的层面,本质就是跑一个分布式计算程序,程序第一知道的就是我算的是哪个目录下的计算程序,比如我们Hadoop jar提交的时候肯定会给一个数据的目录路径,不给数据路径算什么呢?是无法计算的,Hadoop jar中的路径是怎么来的呢?就是我们sql中from table1,去metastore找到的table1指向的是哪个目录,所以这时候我们去想,整个集群当中,有个一个进程是metastore,有一个进程就是Cli命令行,命令行有一个缺点,这个命令行是人机交互写sql的,我们还得登录到它,启动它,进行交互很麻烦的,有时候在特殊情况下,在异地我们访问不了他,这时候Hive有提供了另外一个进程,因为企业中不太推荐使用启动Hive --service服务,然后使用Hive去登录写sql的模式,这种模式已经被淘汰了,所以提供了一种beeline的模式,前面除了我们启动一个metastore这个元数据服务进程外,还需要启动一个Hiveserver2的服务进程,Hiveserver2这个进程一启动变成jvm进程,它不像Hive一样等待我们输入东西,Hiveserver2他会一直在阻塞,也输入不了东西,它就是一个独立的东西,一般我们叫它是一个后台服务,这个进程提供什么功能呢?它对外可以提供thrift、jdbc这种连接方式,也就是说Hive中那个等待用户输入的输入流切割出来,中间使用thrift、jdbc,也就是说吧前面的一个Hive服务切割成了两个东西了,Hiveserver2起来之后,我们在任意一个地方能够访问Hiveserver2的地方编程使用jdbc使用Hive,把sql提交给他,可以通过thrift调用,将写的sql传递给它,而beeline就是现成的这么一个访问工具,bebline就是一个客户端,能力就是开启一个客户端标准输入,beeline会将我们书写的sql传递给它连接的那个服务,比如我们beeline启动之后,!Connect Hive2:10000//localhost:db  连接到10000端口之后,那么我们在beeline中敲的每一行语句,最终是由beeline将sql语句传输给所连接的Hiveserver2,最终是由Hiveserve2去解析我们的sql语句,然后和metastore元数据做映射的解析,如果我们写了一个from table2的字符串,那么Hiveserver2接收到之后,去metastore解析查询映射的信息,如果转换为MapReduce程序的话,就是那个数据的输入路径。这里最重要就是进程就是metastore,元数据服务,一家公司如果将所有的数据都使用metastore进行元数据管理,那么只会写sql就可以了。每个部门可以对相同的metatore进行操作,不需要重新定义表,只需要一个部门构建一个表就可以了,任何部门拿着不同的引擎,对着一个metastore书写不同的sql就可以进行业务逻辑的书写了。

Hive的存储层可以是HDFS也可以是HBase,所以利用Hive既可以操作HDFS数据,也可以操作HBase中的数据,我们可以将HBase和HDFS可以理解为存储层,虽然说HBase中的数据好像最终会落地HDFS上的,但是HDFS和Hbase是同级同层的。都是存储层,有什么不一样呢?HDFS只能线性存储,缺点是数据写入一次不可修改,只能append追加。优点是什么呢?对数据进行批量计算的时候是很快的,但是不能够随机读取随机读写。而HBase它的级别是RowKey,一条记录,而且还支持增删改查,如果HBase作为存储层的话,那么他会支持了随机读写,可以随机地访问任意一条数据取修改它。缺点就是它在做批量计算的时候,性能反而不是特别好。

必须要阐述的重点;

  1. 可以解析sql
  2. 人们可以解析sql,而不需要开发mapReduce
  3. 数据由文件系统一映射成了表这种模型,
  4. 元数据管理,sql解析,Hiveserver2,metastore最重要公司的核心,spark impala都是基于metastore元数据管理。

Hive的读写流程

问:你用Hive建过什么表,内外表,分区分桶表。在这上面还可以改那些东西和关键字,

存储的什么文件格式,最损耗内存空间的是txt。文件格式一般有textfile,sequencefile、rcfile

分区:一般对应的是hdfs上的不同的目录,对应着不同分区。比如说按照性别去分区,只有俩个分区,比如男女分区在什么时候会生效,where 性别 等于男的时候,会生效,如果没有where性别等于男的情况下,那么这个时候俩个目录都要参与计算,所以分区是没有意义的,分区的意义的作用在:条件过滤,减少他的索引,换个语义的是如果你做了分区表,如果你where命中了分区的某一个值的话,那么只有这一个值的目录会参与计算和输入,其他目录不会参与,所以分区优化的是计算程序加载的数据的IO量。

分桶的含义:用在抽样

什么叫做分桶:具备了什么特征什么优势:在计算的时候,

他们更容易去往一个jvm里面,就是进入到一个maptask里面,如果maptask里面有一个什么优化那,combiner, 他就会压缩一条记录,如果相同数据没有做分桶的话,这些会返回到不同的位置,就不会去到一个jvm,一个task里面,这个combiner就很难将这些数据压缩成一条数据,就在shuffle的时候,有没有分桶就决定了你shuffle的io量,如果你做了分桶且什么情况下会生效呢,使用了关键字 groupBy,如果你按照性别去做分桶,groupBY 性别的话,那么这个时候你的kv对的key,性别的值作为key了,groupBY谁 ,谁就是key,(男,女) 这个时候你做分桶的时候 又是按照性别去做分桶,你的表的目录当中一定有若干文件,要么0号文件  要么1号文件,0号文件里面放的都是女,1号文件里面放的都是男,如果这个时候跑计算的话拿哪个目录参与计算的话,那么0号文件都是女,他们计算maptask 他们都是一条记录,1号文件都是男,他们计算maptask也会变成一条记录,你的sql还要必须groubyp性别,这个时候你分区的优势就是你计算的加载数据的io量变小,分桶的目的是让你计算程序shuffle的时候IO量变小,因为combiner优化会生效,一定要明白这个IO量,你做了分区分桶和你没做分区分桶是指有几秒的差异么?他是一个指数值的效果,如果你没做分区分桶那么你的一条sql会跑几个小时,但是你做的话那么几秒几分钟就会跑完,最少30秒的一个概念,你没做分区分桶你的sql成本是他的几倍或者几十倍,都是很有可能的,以上是DDL(数据定义语言)的。

官网的创建表语句 关键字什么意思 ,用这些关键字 做了什么,分区分桶可不可以一起使用,

DML: 数据加载,

表中数据的加载形式有4种:  load  ,from  insert select ,as关键字,

load data [local] inpath './path数据路径' into table table_name from otherTableName:

inset into tablename

select colname

 

HIVE精讲:https://blog.csdn.net/Mirror_w/article/details/89461885

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值