什么是hive:Hive是基于hadoop的一个数据仓库工具,实质就是一款基于hdfs的MapReduce计算框架,对存储在HDFS中的数据进行分析和管理。
hive的工作方式:把存放在hive中的数据都抽象成一张二维表格,提供了一个类似于sql语句的操作方式,这些sql语句最终被hive的底层翻译成为MapReduce程序,最终在hadoop集群上运行,结果也会输出在hdfs之中。(必须是结构化的数据)。在存储的时候hive对数据不做校验,在读取的时候校验。
hive的的优点:极大的简化了分布式的计算程序的编程。使不会分布式编程的,其他工作人员都可以进行海量数据的统计分析。
hive的的缺点:不支持行级别的增删改操作、hive的查询延迟很严重、hive中不支持事务,主要用于做OLAP(联机分析处理)。
hive的的适用场景:hive数据仓库中的数据,主要是存储,在进行ETL(数据清洗、抽取、转换、装载)操作之后的具有结构化的数据。但是数据的存储的格式没有特殊要求,可以使普通文件,也可以是溢写压缩文件等等。
hive的的与关系型数据库的对比:
hive的架构中有四个部分组成:
用户接口:
- CLI(command line interface),shell终端命令行,采用交互式使用hive命令行与hive进行交互,最常用(学习、生成、调试)
- Jdbc/odbc:是hive的基于jdbc操作提供的客户端,用户(开发、运维)通过这个链接hive server服务
- Web UI:通过浏览器访问hive(基本不用)
Thrift Server:Thrift是facebook开发的一个软件框架,可以用来进行可扩展且跨语言的服务的开发,hive集成了该服务,能让不同的编程语言调用hive的接口。
底层四大组件:底层的四大组件完成hql查询语句从词法分析,语法分析,编译,优化,以及生成逻辑执行计划的生成。生成的逻辑执行计划存储在hdfs中,并随后由MapReduce调用执行。
- 解释器:解释器的作用是将hiveSQL语句转换成抽象语法数
- 编译器:编译器是将语法树编译成为逻辑执行计划
- 优化器:优化器是对逻辑执行计划进行优化
- 执行器:执行时调用底层的运行框架执行逻辑执行计划
执行流程就是:hiveQL,通过命令或者客户端提交,经过compiler编译器,运用metastore中的元数据进行类型检测和语法分析,生成一个逻辑方案,然后通过的优化处理,产生一个maptask程序。
元数据库:就是存储在hive中的数据的描述信息,通常包括:表的名字、表的列和分区以及其属性、表的属性(内部表和外部表),表的数据所在目录。而hive有两种元数据的存储方案:
- Metastore默认存储在自带的derby数据库中。缺点是:不适合多用户操作,并且数据存储目录不固定。数据库跟着hive的进入目录走,极度不方便管理。
- Hive和mysql之间通过Metastore服务交互(本地或者远程)
hive的存储特点:
- hive中所有的数据都存储在hdfs中,没有专门的数据存储格式,因为hive是读模式,可支持TezxtFile、SequenceFile(序列化)RCFile(行列结合)或者自定义格式等
- 只需要在创建表的时候,告诉hive数据中的列分隔符和行分隔符,hive就可以解析数据,默认的列分隔符是:(Ctrl + a 不可见字符: \x01),行分隔符是:(\n 换行符)
hive的存储结构: hive的存储结构:数据库、表、视图、分区和表数据等。数据库、表、视图、分区等等都对应hdfs上的一个目录,表数据对应hdfs对应目录下的文件。
例:
Hdfs://Hadoop01/user/hive/warehouse/myhive.db/student/student.txt
Hdfs://Hadoop01/user/hive/warehouse:表示hive的数据仓库
Hdfs://Hadoop01/user/hive/warehouse/myhive.db: hive的一个数据库
Hdfs://Hadoop01/user/hive/warehouse/myhive.db/student hive中的一个表
Hdfs://Hadoop01/user/hive/warehouse/myhive.db/student/student.txt 数据文件
注意:当我们在创建表的时候,首先会在hdfs上的相应的目录下生成一个文件,同时在hive的元数据库中会为这个新建的表生成一条记录。
hive具体的存储结构:
- 数据仓库:在 HDFS 中表现为${hive.metastore.warehouse.dir}目录下一个文件夹
-表:hive的表分为内部表、外部表、分区表、分桶表,表在hdfs中的表现形式也是目录,但是不同的表之间的表现形式不同
- 视图:物化,hive是不会进行物化,相当于给一个sql语句建立了一个快捷方式,保存的是一个视图中的sql语句。只读,基于基表创建。
- 数据文件 :表中的真实数据
内部表:又叫管理表,表的创建,和删除都由hive自己决定。
外部表:表结构上同内部表,但是存储的数据时自己定义的,外部表在删除的时候只删除元数据,原始数据时不能删除的。
内部表和外部表的区别主要体现在两个方面:
- 删除:删除内部表,删除元数据和数据;删除外部表,删除元数据,保留数据。
- 使用:如果数据的所有处理都在 Hive 中进行,那么倾向于 选择内部表,但是如果 Hive 和其他工具要针对相同的数据集进行处理,外部表更合适。使用外部表访问存储在hdfs上的数据,然后通过hive转化数据并存储到内部表中。
分区表: 原来的一个大表存储的时候分成不同的数据目录进行存储。
如果说是单分区表,那么在表的目录下就只有一级子目录,如果说是多分区表,那么在表的目录下有多少分区就有多少级子目录。不管是单分区表,还是多分区表,在表的目录下,和非最终分区目录下是不能之间存储数据文件的。
例:
单分区表:
Hdfs://Hadoop01/user/hive/warehouse/myhive.db/student/p0
多分区表:
Hdfs://Hadoop01/user/hive/warehouse/myhive.db/student/p0
Hdfs://Hadoop01/user/hive/warehouse/myhive.db/student/p1
Hdfs://Hadoop01/user/hive/warehouse/myhive.db/student/p2
Hdfs://Hadoop01/user/hive/warehouse/myhive.db/student/p1/p11
分桶表: 原理和hashpartitioner 一样,将hive中的一张表的数据进行归纳分类的时候,归纳分类规则就是hashpartitioner。(需要指定分桶字段,指定分成多少桶)
bucket:在hdfs中表现为同一个表目录或者分区目录下根据某个字段的值进行Hash散列之后的多个文件,分桶的表现形式就是一个单独的文件.
例:
Hdfs://Hadoop01/user/hive/warehouse/myhive.db/student/age>15
Hdfs://Hadoop01/user/hive/warehouse/myhive.db/student/age>20
Hdfs://Hadoop01/user/hive/warehouse/myhive.db/student/age>30
分区表和分桶的区别除了存储的格式不同外,最主要的是作用:
- 分区表:细化数据管理,缩小mapreduce程序 需要扫描的数据量。
- 分桶表:提高join查询的效率,在一份数据会被经常用来做连接查询的时候建立分桶,分桶字段就是连接字段;提高采样的效率。
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。