Hive简介
什么是Hive
hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。 其优点是学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析。
Hive的架构
(1)用户接口主要有三个:CLI,Client 和 WUI。其中最常用的是CLI,Cli启动的时候,会同时启动一个Hive副本。Client是Hive的客户端,用户连接至Hive Server。在启动 Client模式的时候,需要指出Hive Server所在节点,并且在该节点启动Hive Server。 WUI是通过浏览器访问Hive。
(2)Hive将元数据存储在数据库中,如mysql、derby。Hive中的元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等。
(3)解释器、编译器、优化器完成HQL查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。生成的查询计划存储在HDFS中,并在随后有MapReduce调用执行。
(4)Hive的数据存储在HDFS中,大部分的查询、计算由MapReduce完成(包含*的查询,比如select * from tbl不会生成MapRedcue任务)。
搭建Hive的方法
1.基于derby的本地方式
derby与hive工具在同一个节点,缺点:不支持多个用户同时链接。
2.基于mysql的本地模式
(1)运行hadoop集群
(2)安装mysql数据库
yum install mysql-server -y
(3)配置环境变量:
HADOOP_HOME=
HIVE_HOME=
(4)修改KaTeX parse error: Expected 'EOF', got '\lib' at position 12: HADOOP_HOME\̲l̲i̲b̲目录下的jline-*.jar…HIVE_HOME\lib下的jline-2.12.jar
(5)拷贝mysql驱动包到$HIVE_HOME\lib目录下
(6)修改hive-site.xml
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive_remote/warehouse</value>
</property>
<property>
<name>hive.metastore.local</name>
<value>true</value>
</property>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost/hive_meta?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>
(7)修改mysql权限并创建hive_meta数据库:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123' WITH GRANT OPTION;
flush privileges;
进入mysql.user表删除多余会对权限造成影响的数据
添加用户和数据库:
CREATE USER 'hive'@'%' IDENTIFIED BY '123';
CREATE DATABASE hive_meta;
grant all privileges on hive_meta.* to [email protected]"%" identified by '123';
flush privileges;
3.基于mysql的远程模式
(1)服务端配置文件
<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>
(2)客户端配置文件
<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>
(3)启动hive服务端程序
hive --service metastore >> /tmp/meta.log 2>&1 &
(4)客户端直接使用hive命令即可
Hive表种类
- 内部表(受控表)
完全被Hive控制,删除内部表,元数据、源数据一同被删除 - 临时表
生命周期是一次会话,主要用于测试 - 外部表
不是完全受Hive控制,源数据可以在任何的目录下,删除外部表,源数据不会被删除,只是删除元数据 - 分区表
将源数据分到不同的Hive工作目录中存储,一个分区对应一个目录,防止暴力扫描全表 - 分桶表
将大文件拆分成小文件来存储,提升join以及抽样的效率