1, hive简介
hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。 其优点是学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析。是为了非java人员对hdfs进行mapreduce操作的
数据仓库,英文名称为Data Warehouse,可简写为DW或DWH。数据仓库,是为企业所有级别的决策制定过程,提供所有类型数据支持的战略集合。它是单个数据存储,出于分析性报告和决策支持目的而创建。 为需要业务智能的企业,提供指导业务流程改进、监视时间、成本、质量以及控制,简而言之,数据仓库是用来做查询分析的数据库,基本不用来做插入,修改,删除
hive的本质为: 线下数据挖掘和分析使用的工具
解释器: 解释sql语句
编译器: (将sql编译为maperduce),
优化器: 对编译过程优化
2, 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 QL转换操作符
•操作符是Hive的最小的处理单元
•每个操作符代表HDFS的一个操作或者一道MapReduce作业
3, 实现原理
Operator都是hive定义的一个处理过程
•Operator都定义有:
•protected List <Operator<? extends Serializable >> childOperators;
•protected List <Operator<? extends Serializable >> parentOperators;
•protected boolean done; // 初始化值为false
•所有的操作构成了 Operator图,hive正是基于这些图关系来处理诸如limit, group by, join等操作
使用Antlr解析hql语句的
4, 执行流程
hive通过 ExecMapper 和 ExecReduce 执行mapreduce任务
TableScanOperator 扫描hive表数据
ReduceSinkOperator 创建将发送到Reducer端的<Key,Value>对
JoinOperator Join两份数据
SelectOperator 选择输出列
FileSinkOperator 建立结果数据,输出至文件
FilterOperator 过滤输入数据
GroupByOperator GroupBy语句
MapJoinOperator /*+mapjoin(t) */
LimitOperator Limit语句
UnionOperator Union语句
5, 三种模式
Derby: 单用户, 内置数据库
Mysql: 单用户, 使用mysql
meta: 多用户, 区分客户端和服务端
需要Mysql, ( )
1) derby模式的搭建:
1, 上传解压
2, 修改配置文件
cp hive-default.xml.template hive-site.xml
将hive-site.xml中的所有信息删除, 更换为一下配置文件
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:derby:;databaseName=metastore_db;create=true</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>org.apache.derby.jdbc.EmbeddedDriver</value>
</property>
<property>
<name>hive.metastore.local</name>
<value>true</value>
</property>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
</configuration>
3, 更改hadoop的jline.jar
因为hadoop安装的为2.5.1, hive的版本是1,2,1 , 所以更换hadoop的hive链接包, jline
将 HADOOP_HOME//share/hadoop/yarn/lib 下的jline 更换为 jline.2.12.jar
4, 添加环境变量(可选)
将 HIVE_HOME 添加到环境变量中
export HIVE_HOME=/opt/apache-hive-1.2.1-bin
export PATH=$PATH:$HIVE_HOME/bin
5, 启动
hive
2) mysql模式安装
1, 需要mysql的环境
此处mysql和hive为同一台机器
/* 创建hive的专用数据库(需要创建, 不然报错) */
create database hive;
2, 将 mysql的链接jar放进jdbc中
3, 更改配置文件
<configuration>
<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://192.168.208.109:3306/hive_remote?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>123</value>
</property>
</configuration>
4, 启动
./hive
3), metastore 模式
配置文件不同:
service端
<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.208.109: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>123</value>
</property>
</configuration>
client端:
<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.208.109:9083</value>
</property>
</configuration>
2, 启动hive服务端程序
hive --service metastore
3, 客户端直接使用hive命令即可
root@my188:~$ hive
Hive history file=/tmp/root/hive_job_log_root_201301301416_955801255.txt
hive> show tables;
OK
test_hive
Time taken: 0.736 seconds
4, 验证是否成功
进入hive后, 创建一个表, 看表信息是否存储在mysql中了( 此处使用的第二种模式)
CREATE TABLE xp(id INT,name string) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';
然后进入mysql下, 在hive或 hive_remote 数据库下, 有hive自己创建的表信息