hive详解(一)

1、Hive简介

 Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射成一张表,并提供类SQL查询功能。Hive是由Facebook开源用于解决海量结构化日志的数据统计的工具。
 在Hadoop生态系统中,HDFS用于存储数据,Yarn用于资源管理,MapReduce用于数据处理,而Hive是构建在Hadoop之上的数据仓库,包括以下方面:
(1)使用HQL作为查询接口;
(2)使用HDFS存储;
(3)使用MapReduce计算;
(4)执行程序运行在Yarn上。
 Hive的本质是:将HQL转化成MapReduce程序,其灵活性和扩展性比较好,支持UDF,自定义存储格式等;适合离线数据处理。
hive是什么?
The Apache Hive™ data warehouse software facilitates reading, writing, and managing large datasets residing in distributed storage and queried using SQL syntax.
一个数据仓库(工具),一个基于hadoop的数据仓库,可以通过类SQL语句来对数据进行读、写、管理(元数据)
提取/转换/加载(ETL)
为什么有hive?

  • 随着数据量越来越大,传统关系型数据库不能满足业务的查询需求,hive能满足查询需求。
  • hive是facebook提供出来的,主要是用来分析大量的社交数据和机器学习。
  • 使用类似SQL的语句:简单、学习成本低

2、Hive在生态系统中的位置

hive详解(一)
hive详解(一)
hive的特点:
Tools to enable easy access to data via SQL, thus enabling data warehousing tasks such as extract/transform/load (ETL), reporting, and data analysis.
A mechanism to impose structure on a variety of data formats
Access to files stored either directly in Apache HDFS™ or in other data storage systems such as Apache HBase™ .
Query execution via Apache Tez™, Apache Spark™, or MapReduce
Procedural language with HPL-SQL
Sub-second query retrieval via Hive LLAP, Apache YARN and Apache Slider.
hive和hadoop的关系
hive基于hadoop,它本身没有存储功能,它相当于套在hadoop上的一个壳子,它的存储基于hdfs,它的计算基于MapReduce。

3、Hive组件

(1)用户接口:Client CLI(hive shell)、JDBC/ODBC(java访问hive),WEBUI(浏览器访问hive)。
(2)Metastore 元数据包括:表名、表所属的数据库(默认是default)、表的拥有者、列/ 分区字段、表的类型(是否是外部表)、表的数据所在目录等。默认存储在自带的derby数据库中,推荐使用采用MySQL存储Metastore。
(3)Hadoop组件:使用HDFS进行存储,使用MapReduce进行计算。
(4)驱动器:Driver 包含:解析器、编译器、优化器、执行器。
(5)解析器:将SQL字符串转换成抽象语法树AST,这一步一般都用第三方工 具库完成,比如antlr;对AST进行语法分析,比如表是否存在、字段是否 存在、SQL语义是否有误(比如select中被判定为聚合的字段在group by中是否有出现)。
(6)编译器:将AST编译生成逻辑执行计划。
(7)优化器:对逻辑执行计划进行优化。
(8)执行器:把逻辑执行计划转换成可以运行的物理计划。对于Hive来说,就是MR/TEZ/Spark。
hive详解(一)

hive的架构(同上):
用户连接客户端:cli、 jdbc/odbc、 web、 GUI
thrift server:第三方服务
Metastore:hive元数据(描述数据的数据)【库名、表名、字段名、字段类型、分区、分桶、创建时间、创建人 …】
解析器Driver:将hql预计生成抽象表达树
编译器Compiler:对hql语句进行词法、语法、语义的编译【需要关联元数据】,编译完成之后生成一个有向无环的执行计划。
优化器Optimizer:将执行计划进行优化,减少不必要的列、使用分区,索引。
执行器Executor:将优化后的执行计划提交给hadoop的MapReduce。

4、Hive优点与使用场景

优点:
(1)操作接口采用类SQL语法,提供快速开发的能力(简单、容易上手);
(2)避免了去写MapReduce,减少开发人员的学习成本;
(3)统一的元数据管理,可与impala/spark等共享元数据;
(4)易扩展(HDFS+MapReduce:可以扩展集群规模;支持自定义函数);
(5)数据的离线处理;比如:日志分析,海量结构化数据离线分析。
使用场景:
(1)Hive的执行延迟比较高,因此hive常用于数据分析的,对实时性要求 不高的场合;
(2)Hive优势在于处理大数据,对于处理小数据没有优势,因为Hive的执 行延迟比较高。

5、Hive相关网站

官网:http://hive.apache.org
文档:https://cwiki.apache.org/confluence/display/Hive/GettingStarted
https://cwiki.apache.org/confluence/display/Hive/Home
下载:http://archive.apache.org/dist/hive
https://github.com/apache/hive

6、hive的安装

通常有3种安装方式:
1、本地模式(多用户):使用hive自带的derby数据库进行元数据存储,通常用于测试.hive会在启动目录下生成一个metastore_db

优点:使用简单,不需要配置
缺点:只支持单session
(1)解压配置环境变量:

[[email protected] ~]# tar -zxvf apache-hive-1.2.1-bin.tar.gz -C /usr/local/

[[email protected] ~]# vi /etc/profile 

export HIVE_HOME=/usr/local/apache-hive-1.2.1-bin
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$ZOOKEEPER_HOME/bin:$HIVE_HOME/bin:

[[email protected] ~]# source /etc/profile

hive启动:

[[email protected] ~]# $HIVE_HOME/bin/hive

出现错误:

[[email protected] local]# hive
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/hive/ql/CommandNeedRetryException
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:348)
at org.apache.hadoop.util.RunJar.run(RunJar.java:232)
at org.apache.hadoop.util.RunJar.main(RunJar.java:153)
Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.hive.ql.CommandNeedRetryException
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 4 more

hive详解(一)
**分析:**hive连接到hadoop集群需要找到类,这个类包的路径就是通过HADOOP_CLASSPATH 环境变量来指定的,我将其指向了个空目录,启动hive的时候当然就包各种类无法找到的问题。
export HADOOP_CLASSPATH=.:CLASSPATH:CLASSPATH:HADOOP_CLASSPATH:$HADOOP_HOME/bin
解决方法:

[[email protected] ~]# vi /usr/local/hadoop-2.9.1/etc/hadoop/hadoop-env.sh

export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:SOMGTHING ELSE

注意
(1)hive会自动检测hadoop的环境变量,有的话必须先启动hadoop

(2)使用hive与$HIVE_HOME/bin/hive 在不同目录下启动,会在当前目录下生成一个metastore_db,所以能启动,同一目录下无法启动两个服务。

2、远程模式(元数据在本台服务器上,多用户):使用关系型数据库(mysql、oracle等带jdbc驱动的数据库)来对元数据进行存储。
优点:支持多session
缺点:需要配置,还需要安装mysql数据库
安装步骤:
(1)、解压并配置环境变量(同上)
(2)、配置配置文件(疑问:多属性值怎么写?)
[[email protected] conf]# vi ./hive-site.xml

<configuration>
<!--配置MySql的连接字符串-->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://192.168.216.15:3306/hive?createDatabaseIfNotExist=true</value>
<description>JDBC connect string for a JDBC metastore</description>
</property>

<!--配置MySql的驱动-->
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
<description>Driver class name for a JDBC metastore</description>
</property>

<!--配置连接MySql数据库的用户-->
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
<description>username to use against metastore database</description>
</property>

<!--配置用户的登录密码-->
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>root</value>
<description>password to use against metastore database</description>
</property>
</configuration>

(3)、将mysql的驱动包copy到hive安装目录下的lib目录
(4)、在指定数据库中创建元数据库,数据库的编码最好需要设置成latin1
(5)、启动测试
[[email protected] apache-hive-1.2.1-bin]# bin/hive
可能出错:(权限问题)
如果出现没有权限的问题,在mysql授权(在安装mysql的机器上执行)

mysql -uroot -p
#(执行下面的语句  *.*:所有库下的所有表   %:任何IP地址或主机都可以连接)
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'mysql' WITH GRANT OPTION;
FLUSH PRIVILEGES;
grant all privileges on *.* to [email protected]"localhost" identified by "mysql" with grant option;
FLUSH PRIVILEGES;

3、远程模式(元数据在其他服务器上,多用户):元数据库存放在不同的服务器上,可以有一个hive的server和多个client。
具体查看后续

7、hive的使用

特点:
hive是以;驱动执行
hive有一个默认的数据库,叫default,操作hql不指定数据库则使用默认库。
注意:hive数据库名、表名不区分大小写

  1、名字不能使用数字开头
  2、不能使用关键字
  3、尽量不要使用特殊字符

1、创建库

hive> create database if not exists brz comment 'this is brz';
OK
Time taken: 0.069 seconds

hive详解(一)
创建数据库的本质:
在hive的数据仓库下创建一个目录($name.db),hive数据仓库的hdfs根目录:/user/hive/warehouse/,我们也可以把文件进行上传至此目录下达到创建的目的
注意:hive的分隔符默认为:(ctrl+v ctrl+A),hive是严格的读时模式,如果格式不正确,就会用MULL代替
2、切换库:use brz;

hive> use brz;
OK
Time taken: 0.027 seconds

3、创建表

建表语法
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name
[(col_name data_type [COMMENT col_comment], …)]
[COMMENT table_comment]
[PARTITIONED BY (col_name data_type [COMMENT col_comment], …)]
[CLUSTERED BY (col_name, col_name, …)
[SORTED BY (col_name [ASC|DESC], …)] INTO num_buckets BUCKETS]
[ROW FORMAT row_format]
[STORED AS file_format]
[LOCATION hdfs_path]

hive> set hive.cli.print.current.db=true; //显示当前库
hive (default)> create table if not exists brz.t_1(id int,name string);
OK
Time taken: 0.241 seconds

显示当前库:
set hive.cli.print.current.db=true;

–指定行列分隔符创建表

create table if not exists t_2(
uid int,
uname string
)
row format delimited 
fields terminated by ','   //分隔符
lines terminated by '\n'
;

create external table if not exists t_3(
uid int,
uname string
)
row format delimited 
fields terminated by ','
;

create external table if not exists t_4(
uid int,
uname string
)
row format delimited 
fields terminated by ','
location '/t_user_aaa'   //到根目录下t_user_aaa
;

//查看表

hive (brz)> show tables;
OK
t_1
t_2
t_3
t_4
Time taken: 0.035 seconds, Fetched: 4 row(s)

显示命令
show tables;
show databases;
show partitions table_name;
show functions; // 打印函数列表
desc extended table_name;
desc formatted table_name;

hive中表的类型:
1、内部表 表目录会创建在hdfs的/user/hive/warehouse/的相应库目录
2、外部表 外部表会根据建表时LOCATION关键字指定的路径创建表目录(如果没有指定LOCATION,则建表的位置与内部表相同)

内部表的创建与外部表的创建,就差两个关键字:EXTERNAL LOCATION
示例:
内部表 -- CREATE TABLE IF NOT EXISTS T_INNER(ID INT);
外部表 -- CREATE EXTERNAL TABLE IF NOT EXISTS T_OUTER(ID INT) LOCATION '/AAA/BBB/XXX';

hive建表语句所做的两件事:
1、在hdfs中创建目录
2、创建元数据 库中创建相应的表的描述数据(元数据)
内部表和外部表在drop时有不同的特性
1、drop时,元数据都会被清除
2、drop时,内部表的表数据目录会被删除,但是外部表的表数据目录不会被删除
例:

hive (brz)> drop table if exists t_1;
OK
Time taken: 0.557 seconds
hive (brz)> drop table if exists t_3;
OK
Time taken: 0.136 seconds

hive详解(一)
hive详解(一)

hive详解(一)
information_schema:MYSQL数据库元数据库
hive:hive数据库元数据库 DBS TBLS…

外部表的使用场景
使用后数据不删除则使用外部表(推荐使用外部表),所以,整个数据仓库中最底层的表(与仓库外的数据对接的层,叫ODS层)使用外部表
hive详解(一)
业务系统–数据分析–数据可视化
其中:ODS(存储业务系统的数据)-数据仓库层(把数据整合或打散)(数据建模)-数据集市(存储分析结果)(hive)