hive是依赖于hdfs和yarn的一个数据仓库
数据库和数据仓库的区别:
数据库在存储数据的同时,允许实时的增删改查等操作
数据仓库在存储数据的同时还执行着计算和分析数据的工作,但是并不能实时的进行增删改等操作,如果
需要对数据进行更新则需要将数据下载下来更新之后再放入数据仓库中,是一次写入多次读取的过程
所以hive并不能取代mysql,mssql等数据库(不像hbase一样可以根据不同业务的需求取代那些传统数据
库),甚至可以将hive看成是一种数据挖掘工具,用来分析hdfs上的大数据
hive上的数据库和表都对应着hdfs上的一个目录(不是文件),表中的数据对应的是该目录下的文件内容
,hive的表分为内部表,外部表和分区表
内部表:创建表时没有指定的话,默认为内部表。先创建,后从本地系统导入数据到内部表中
外部表:创建表时通过指定对应的hdfs存储地址来建立外部表和hdfs文件的关联
分区表:创建表时可以通过业务需求来建立多级分区,如:按照日期来分区,这样在hdfs中不同分区的数
据会被存储在不同的文件夹中。向分区表导入数据时需要指定分区的字段
hive执行流程:
当hive执行一个任务时,会向元数据仓储发送或者查询元数据信息,以获得hive中表和hdfs文件系统中的
对应关系。以mysql为例:hive中的信息都存储在mysql的名为hive的数据库中,hive表信息存储在TBLS表
中,TBLS存储了hive中每个表的ID,创建时间,类型等信息。根据表ID可以在COLUMNS_V2表中查找该表对
应的有哪些字段,字段的类型等。根据表ID可以在SDS表中查到该表的hdfs输入路径,输入输出格式化的
方式(mr任务时有用)等信息
hive安装和配置mysql作为其元数据的仓储:
只在一个节点上安装即可
1.上传tar包
2.解压
tar -zxvf hive-0.9.0.tar.gz ~/cloud/
3.安装mysql(切换到root用户)
配置HIVE_HOME环境变量
检查机器上是否有安装了mysql相应的服务
rpm -qa | grep mysql
如果有则卸载
rpm -e mysql-libs-5.1.66-2.el6_3.i686 --nodeps
安装mysql服务端和客户端
rpm -ivh MySQL-server-5.1.73-1.glibc23.i386.rpm
rpm -ivh MySQL-client-5.1.73-1.glibc23.i386.rpm
安装成功后运行下面的程序进行mysql初始化
/usr/bin/mysql_secure_installation
(注意:删除匿名用户,允许用户远程连接)
登陆mysql
mysql -u root -p
4.配置hive
cp hive-default.xml.template hive-site.xml
修改hive-site.xml(删除所有内容,只留一个<configuration></configuration>,然后将下面
对应的property属性添加进进去)
或者新建hive-site.xml 文件添加如下内容(以下配置文件要注意mysql服务所在的地址和连接
的用户名密码等):
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://cloud3:3306/hive?createDatabaseIfNotExist=true</value>
<description>JDBC connect string for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
<description>Driver class name for a JDBC metastore</description>
</property>
<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>123</value>
<description>password to use against metastore database</description>
</property>
</configuration>
5.安装hive和mysql完成后,将mysql的连接jar包拷贝到$HIVE_HOME/lib目录下
如果出现没有权限的问题,在mysql授权(在安装mysql的机器上执行)
mysql -uroot -p
#(执行下面的语句 *.*:所有库下的所有表 %:任何IP地址或主机都可以连接)
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'JChubby123' WITH GRANT OPTION;
FLUSH PRIVILEGES;
hive操作:
6.建表(默认是内部表)
create table trade_detail(id bigint, account string, income double, expenses double,
time string) row format delimited fields terminated by ' ';
建表时要指定字段之间的分隔符
建分区表
create table td_part(id bigint, account string, income double, expenses double, time
string) partitioned by (logdate string) row format delimited fields terminated by ' ';
除了执行字段分隔符 之外还要指定分区字段
建外部表
create external table td_ext(id bigint, account string, income double, expenses
double, time string) row format delimited fields terminated by ' ' location '/td_ext';
通过external关键字来建立外部表,location来指定要关联的hdfs文件系统的位置
分区表加载数据
load data local inpath './book.txt' overwrite into table book partition
(pubdate='2010-08-22');
使用sqoop将mysql的数据导入到hive表中(sqoop先将数据导入到hdfs中,在调用hive的命令load到hive
表中,所以要配置hive的环境变量)
在hive当中创建两张表
create table trade_detail (id bigint, account string, income double,
expenses double, time string) row format delimited fields terminated by ' ';
create table user_info (id bigint, account string, name string, age int)
row format delimited fields terminated by ' ';
将mysq当中的数据直接导入到hive当中
sqoop import --connect jdbc:mysql://192.168.61.130:3306/cloud --username
root --password JChubby123 --table trade_detail --hive-import --hive-overwrite --hive-table
trade_detail --fields-terminated-by ' '
sqoop import --connect jdbc:mysql://192.168.61.130:3306/cloud --username
root --password JChubby123 --table user_info --hive-import --hive-overwrite --hive-table
user_info -- fields-terminated-by ' '
创建一个result表保存前一个sql执行的结果
create table result row format delimited fields terminated by ' ' as select
t2.account, t2.name, t1.income, t1.expenses, t1.surplus from user_info t2 join (select
account, sum(income) as income, sum(expenses) as expenses, sum(income-expenses) as surplus
from trade_detail group by account) t1 on (t1.account = t2.account);
使用自定义的UDF函数
像传统数据库中的存储过程一样,自定义的UDF函数有输入和输出。当hive的函数不能满足业务需求的时
候就需要自定义UDF函数来进行任务执行
1.引入hive和hadoop common的jar包
2.自定义类,并继承自UDF类
3.定义UDF函数,统一命名为evaluate,如:
public Text evaluate(Text in)
输入和输出要使用hadoop io的基本类型,因为其也要走mr任务和网络传输
4.将其打包成jar并上传到装有hive的机器中
5.在hive shell中执行命令将jar包中的函数添加进去
自定义函数调用过程:
1.添加jar包(在hive命令行里面执行)
hive> add jar /root/NUDF.jar;
2.创建临时函数
hive> create temporary function getNation as 'NationUDF';
函数要写成包括包名的全名称
3.调用
hive> select id, name, getNation(nation) from beauty;
4.将查询结果保存到HDFS中
create table result row format delimited fields terminated by ' ' as select id, getNation
(nation) from beauties;