HIVE
学习目标:
- 了解hive是什么
- 理解hive架构
- hive搭建
- 熟练hive sql的使用
- 理解hive分区
- 外部表和内部表区别
- DML
- beeline和JDBC
- hive的函数
HIVE数据仓库
保存历史数据
数据库:数据交互。
解释器 编译器 优化器
hive运行时,元数据存储在关系型数据库(Mysql)
HIVE架构图
hive.apcache.com
依托于hadoop,底层存储 hdfs
解释器
anltr —> 语法树
编译器
将HIVE sQL 转换成车工操作符
操作符是hive的最小处理单元
每个操作符代表HDFS的一个操作或者是一个job
优化器
HIVE 搭建
前置条件
安装Mysql
#查看是否安装了mysql
rpm -qa|grep -i mysql
#卸载mysql
rpm -e mysql*
#安装mysql
Yum -y install mysql-server
启动mysql:
service mysqld start
连接数据库:
mysql -uroot -p
输入密码:
#修改密码
set password for 'root'@'localhost'=password('123456');
设置无密码登录:
vim /etc/my.cnf
#添加
skip-grant-tables
安装HIVE
- 上传安装包
- 解压
- 配置环境变量
- hive-site.xml
tar -xzvf hive-xyztar.gz
将环境变量设置HIVE_HOME
为指向安装目录:
$ cd hive-xyz
$ export HIVE_HOME = {{pwd}}
最后,添加$HIVE_HOME/bin
到您的PATH
:
$ export PATH = $ HIVE_HOME / bin:$ PATH
Hive中metastore()的三种方式:
参考链接:HIVE的元数据相关配置
- Local/Embedded Metastore Database (Derby)
- Remote Metastore Database
- Local/Embedded Metastore Server
- Remote Metastore Server
a)内嵌Derby方式
嵌入式Metastore数据库主要用于单元测试。一次只能有一个进程连接到Metastore数据库,因此它不是一个真正的实用解决方案,但适用于单元测试。
只能有一个hive客户端能使用数据库,不推荐
<configuration>
<!--连接URL-->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:derby:;databaseName=metastore_db;create=true</value>
</property>
<!--连接驱动名称-->
<!--derby-->
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>org.apache.derby.jdbc.EmbeddedDriver</value>
</property>
<!--是否使用本地元数据模式
(从Hive 0.10删除:如果hive.metastore.uris是就是cal 模式,否则额就是远程-->
<!--虽然这么官方文档这么备注-->
<property>
<name>hive.metastore.local</name>
<value>true</value>
</property>
<!--在HDFS存储HIVE的地址-->
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
</configuration>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FWBzC8PX-1570610031603)(E:\朱琰笔记\pic\1564753514137.png)]
b)远程访问数据库方式
在此配置中,您将远程链接关系型数据库。 以下示例为连接MySQL服务器.
<configuration>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive_remote/warehouse</value>
</property>
<!--本地或远程Metastore
(从Hive 0.10删除:如果hive.metastore.uris是就是cal 模式,否则额就是远程-->
<property>
<name>hive.metastore.local</name>
<value>true</value>
</property>
<!--Mysql服務器地址-->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost/hive_remote?createDatabaseIfNotExist=true</value>
</property>
<!--MySQL JDBC驱动程序类-->
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<!--MySQL用戶名-->
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>hive</value>
</property>
<!--MySQL密碼-->
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>password</value>
</property>
</configuration>
c)内嵌元数据服务方式
在这种方式中,Metastore服务器组件的使用类似于Hive Client中的库。 每个Hive客户端都将打开与数据库的连接并对其进行SQL查询。
确保可以从执行Hive查询的计算机访问数据库,因为这是本地存储。还要确保JDBC客户端库位于Hive Client的类路径中。
此配置通常与HiveServer2一起使用(仅在HiveServer2中使用嵌入式Metastore,在hiveserver2 start命令的命令行参数中添加“–hiveconf hive.metastore.uris =’’”或使用hiveserver2-site.xml(在Hive 0.14中可用) ))
配置Param | 配置值 | 评论 |
---|---|---|
hive.metastore.uris | 不需要因为这是本地商店 | |
hive.metastore.local | true | 这是本地商店(在Hive 0.10中删除,请参阅配置说明部分) |
hive.metastore.warehouse.dir | <base hdfs path> | 指向HDFS中非外部Hive表的默认位置。 |
d)远程Metastore服务方式
在远程Metastore设置中,所有Hive客户端都将与Metastore服务器建立连接,然后Metastore服务器会查询数据存储区(本例中为MySQL)以获取元数据。Metastore服务器和客户端使用Thrift 协议进行通信 。从Hive 0.5.0开始,您可以通过执行以下命令来启动Thrift服务器:
hive --service metastore
1
<configuration>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://192.168.57.6:3306/hive?createDatabaseIfNotExist=true</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>hive</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>password</value>
</property>
<property>
<name>hive.metastore.local</name>
<value>false</value>
</property>
<!--Hive Metastore是无状态的,因此可以有多个实例来实现高可用性。-->
<!--使用 hive.metastore.uris它可以指定多个远程Metastore。-->
<!--默认情况下,Hive将使用列表中的第一个,在连接失败时,会随机选择一个重新连接-->
<property>
<name>hive.metastore.uris</name>
<value>thrift://192.168.1.188:9083</value>
</property>
</configuration>
注:这里把hive的服务端和客户端都放在同一台服务器上了。服务端和客户端可以拆开,
2
将hive-site.xml配置文件拆为如下两部分
1)、服务端配置文件
<configuration>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://192.168.57.6:3306/hive?createDatabaseIfNotExist=true</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>123456</value>
</property>
</configuration>
<configuration>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
<property>
<name>hive.metastore.local</name>
<value>false</value>
</property>
<property>
<name>hive.metastore.uris</name>
<value>thrift://192.168.57.5:9083</value>
</property>
</configuration>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
启动hive服务端程序
hive --service metastore
客户端直接使用hive命令即可
root@my188:~$ hive
Hive history file=/tmp/root/hive_job_log_root_201301301416_955801255.txt
hive> show tables;
OK
test_hive
fhive>
ve.metastore.uris
thrift://192.168.57.5:9083
启动hive服务端程序
hive --service metastore
客户端直接使用hive命令即可
root@my188:~$ hive
Hive history file=/tmp/root/hive_job_log_root_201301301416_955801255.txt
hive> show tables;
OK
test_hive
fhive>