1, hive简介

hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。 其优点是学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析。是为了非java人员对hdfs进行mapreduce操作的

数据仓库,英文名称为Data Warehouse,可简写为DW或DWH。数据仓库,是为企业所有级别的决策制定过程,提供所有类型数据支持的战略集合。它是单个数据存储,出于分析性报告和决策支持目的而创建。 为需要业务智能的企业,提供指导业务流程改进、监视时间、成本、质量以及控制,简而言之,数据仓库是用来做查询分析的数据库,基本不用来做插入,修改,删除

hive的本质为: 线下数据挖掘和分析使用的工具

解释器: 解释sql语句
编译器: (将sql编译为maperduce), 
优化器: 对编译过程优化

2, hive结构

hadoop hive 数仓搭建 hadoop构建数据仓库_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, 实现原理

hadoop hive 数仓搭建 hadoop构建数据仓库_hive_02

 

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, 上传解压

hadoop hive 数仓搭建 hadoop构建数据仓库_hadoop hive 数仓搭建_03

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中

hadoop hive 数仓搭建 hadoop构建数据仓库_mysql_04

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自己创建的表信息

hadoop hive 数仓搭建 hadoop构建数据仓库_hadoop hive 数仓搭建_05