Hive
Hive
Hive概述
Hive是基于Hadoop的一个数据仓库工具。可以将结构化的数据文件映射为一张表,并提供完整的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。其优点是学习成本低,可以通过类SQL语句快速实现MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析。
Hive是建立在 Hadoop 上的数据仓库基础构架。
它提供了一系列的工具,可以用来进行数据提取、转化、加载(ETL Extract-Transform-Load ),这是一种可以存储、查询和分析存储在 Hadoop 中的大规模数据的机制。
Hive 定义了简单的类 SQL 查询语言,称为 HiveQL,它允许熟悉 SQL 的用户查询数据。
Hive其实是基于Hadoop的一种分布式计算框架,底层仍然是MapReduce,所以它本质上还是一种离线大数据分析工具。
提取、转化、加载(ETL Extract-Transform-Load )
Hive体系结构
Hql--HIVE特点
HQL - Hive通过类SQL的语法,来进行分布式的计算。
Hive在执行的过程中会将HQL转换为MapReduce去执行
针对海量数据的高性能查询和分析系统
类SQL的查询语言
HiveQL 灵活的可扩展性(Extendibility)
高扩展性(Scalability)和容错性
与 Hadoop 其他产品完全兼容
数据仓库的特征
1.数据仓库是多个异构数据源所集成的。
2.数据仓库存储的一般是历史数据。 读数据,分析数据,弱事务
3.数据库是为捕获数据而设计,数据仓库是为分析数据而设计。
4.数据仓库是时变的,数据存储从历史的角度提供信息。即数据仓库中的关键结构都隐式或显示地包含时间元素。
5.数据仓库是弱事务的,因为数据仓库存的是历史数据,一般都读(分析)数据场景。
数据库属于OLTP系统。(Online Transaction Processing)联机事务处理系统。
OLTP是面向用户的、用于程序员的事务处理以及客户的查询处理。
OLTP系统的访问由于要保证原子性,所以有事务机制和恢复机制。
数据仓库属于OLAP系统。(Online Analytical Processing)联机分析处理系统。
OLAP是面向市场的,用于知识工人(经理、主管和数据分析人员)的数据分析。
OLAP通常会集成多个异构数据源的数据,数量巨大。
OLAP系统一般存储的是历史数据,所以大部分都是只读操作,不需要事务。
用户接口主要有三个:CLI,JDBC 和 WUI
1.CLI,最常用的模式。实际上在>hive 命令行下操作时,就是利用CLI用户接口。
2.JDBC,通过java代码操作,需要启动hiveserver,然后连接操作。
Metastore
Hive将元数据存储在数据库中,如mysql、derby。Hive中的元数据包括表的名字,
表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等。
解释器(complier)、优化器(optimizer)、执行器(executor)组件
这三个组件用于:HQL语句从词法分析、语法分析、编译、优化以及查询计划的生成。生成的查询计划存储在HDFS中,并在随后有MapReduce调用执行。
Hadoop
Hive的数据存储在HDFS中,大部分的查询、计算由MapReduce完成
适用场景
Hive 构建在基于静态批处理的Hadoop 之上,Hadoop 通常都有较高的延迟并且在作业提交和调度的时候需要大量的开销。因此,Hive 并不能够在大规模数据集上实现低延迟快速的查询,
Hive 并不适合那些需要低延迟的应用
Hive 的最佳使用场合是大数据集的批处理作业,例如,网络日志分析。
配置依赖
实现步骤
1.安装JDK
2.安装Hadoop
3.配置JDK和Hadoop的环境变量
4.下载Hive安装包
5.解压安装hive
6.启动Hadoop的HDFS和Yarn
7.启动Hive
Hive的数据,是存在HDFS里的。此外,hive有哪些数据库,每个数据库有哪些表,这样的信息称之为hive的元数据信息。
元数据信息不存在HDFS里。而是存在关系型数据库里,hive默认用的是derby数据库来存储。即hive工作时,除了要依赖Hadoop,还要依赖关系型数据库。
虽然我们能通过HDFS查看到hive有哪些数据库,有哪些表,以及表里的数据,但是,这不是元数据信息。HDFS最主要的是存储hive的数据信息。
用derby数据库,也不支持并发所以我们选择用mysql数据库。目前hive支持derby和mysql两种数据库。
内外部表
内部表的概念
先在hive里建一张表,然后向这个表插入数据(用insert可以插入数据,也可以通过加载外部文件方式来插入数据),这样的表称之为hive的内部表。
外部表的概念
通过hive创建一张表stu来管理这个文件数据。则stu这样表称之为外部表。注意,hive外部表管理的是HDFS里的某一个目录下的文件数据。
create external table stu (id int,name string) row format delimited fields terminated by ' ' location '/目录路径'
hive无论是内部表或外部表,当向HDFS对应的目录节点下追加文件时(只要格式符合),hive都可以把数据管理进来
内部表和外部标的区别
通过hive执行:drop table stu 。这是删除表操作。如果stu是一个内部表,则HDFS对应的目录节点会被删除。
如果stu是一个外部表,HDFS对应的目录节点不会删除
Hive分区表
Hive也支持分区表,对数据进行分区可以提高查询时的效率。
普通表和分区表区别:有大量数据增加的需要建分区表
create table book (id int, name string) partitioned by (category string) row format delimited fields terminated by '\t';
在创建分区表时,partitioned字段可以不在字段列表中。生成的表中自动就会具有该字段。category 是自定义的字段
分区表加载数据
1)load data local inpath '/home/cn.txt' overwrite into table book partition (category='cn');
2)load data local inpath './book_english.txt' overwrite into table book partition (category='en');
基本数据结构类型
UDF
如果hive的内置函数不够用,我们也可以自己定义函数来使用,这样的函数称为hive的用户自定义函数,简称UDF。
1.新建java工程,导入hive相关包,导入hive相关的lib。
2.创建类继承UDF
3.自己编写一个evaluate方法,返回值和参数任意。
4.为了能让mapreduce处理,String要用Text处理。
5.将写好的类打成jar包,上传到linux中
6.在hive命令行下,向hive注册UDF:add jar /xxxx/xxxx.jar
7.在hive命令行下,为当前udf起一个名字:create temporary function fname as '类的全路径名';
8.之后就可以在hql中使用该自定义函数了。
Hive解决数据倾斜问题
概述
简单来说数据倾斜就是数据的key 的分化严重不均,造成一部分数据很多,一部分数据很少的局面。
从另外角度看数据倾斜,其本质还是在单台节点在执行那一部分数据reduce任务的时候,由于数据量大,跑不动,造成任务卡住。
业务逻辑造成的数据倾斜会多很多,日常使用过程中,容易造成数据倾斜的原因可以归纳为几点:
1)group by
2)distinct count(distinct xx)
3)join
如何处理group by的数据倾斜问题
1、调优参数
set hive.groupby.skewindata=true;
数据倾斜时负载均衡,当选项设定为true,生成的查询计划会有两个MRJob。
Hive优化
1)map side join
2)join语句优化
3)group by 优化
4)count distinct 优化
5)调整切片数(map任务数)
6)JVM重利用
7)启用严格模式
8)关闭推测执行
Hive的分桶表
如何使用分桶表
1.创建带桶的 table :
create table teacher(class string,name string) clustered by (class) into 3 buckets row formatdelimited fields terminated by ' ';
2.开启分桶机制:
set hive.enforce.bucketing=true;
3.往表中插入数据:
insert overwrite table teacher select * from tmp;//需要提前准备好temp,从temp查询数据写入teacher
作用及原理
分桶的原理是根据指定的列的计算hash值模余分桶数量后将数据分开存放。
Sqoop
Sqoop介绍
sqoop是Apache 提供的工具
用于hdfs和关系型数据库之间数据的导入和导入
可以从hdfs导出数据到关系型数据库,也可以从关系型数据库导入数据到hdfs。
实现步骤:
1.准备sqoop安装包,官网地址:http://sqoop.apache.org
2.配置jdk环境变量和Hadoop的环境变量。因为sqoop在使用是会去找环境变量对应的路径,从而完整工作。
3.sqoop解压即可使用(前提是环境变量都配好了)
4.需要将要连接的数据库的驱动包加入sqoop的lib目录下(本例中用的是mysql数据库)
5.利用指令操作sqoop
Hive的jdbc编程
hive实现了jdbc接口,所以可以非常方便用jdbc技术通过java代码操作。但是实际应用中用的不多,一般都是在HDFS储存的文件基础上建立外部表来进行查询处理。所以jdbc了解一下即可
Hive工作流程
1.通过客户端提交一条Hql语句
2.通过complier(编译组件)对Hql进行词法分析、语法分析。在这一步,编译器要知道此hql语句到底要操作哪张表
3.去元数据库找表信息
4.得到信息
5.complier编译器提交Hql语句分析方案。
6.1 executor 执行器收到方案后,执行方案(DDL过程)。在这里注意,执行器在执行方案时,会判断
如果当前方案不涉及到MR组件,比如为表添加分区信息、比如字符串操作等,比如简单的查询操作等,此时就会直接和元数据库交互,然后去HDFS上去找具体数据。
如果方案需要转换成MR job,则会将job 提交给Hadoop的JobTracker。
6.2 MR job完成,并且将运行结果写入到HDFS上。
6.3 执行器和HDFS交互,获取结果文件信息。
7.如果客户端提交Hql语句是带有查询结果性的,则会发生:7-8-9步,完成结果的查询。