4.1 Hive基本概念


1 Hive简介

学习目标
- 了解什么是Hive
- 了解为什么使用Hive

什么是 Hive

  • Hive 由 Facebook 实现并开源,是基于 Hadoop 的一个数据仓库工具,可以将结构化的数据映射为一张数据库表,并提供 HQL(Hive SQL)查询功能,底层数据是存储在 HDFS 上。
  • Hive 本质: 将 SQL 语句转换为 MapReduce 任务运行,使不熟悉 MapReduce 的用户很方便地利用 HQL 处理和计算 HDFS 上的结构化的数据,是一款基于 HDFS 的 MapReduce 计算框架
  • 主要用途:用来做离线数据分析,比直接用 MapReduce 开发效率更高。

为什么使用 Hive

  • 直接使用 Hadoop MapReduce 处理数据所面临的问题:
    • 人员学习成本太高
    • MapReduce 实现复杂查询逻辑开发难度太大
  • 使用 Hive
    • 操作接口采用类 SQL 语法,提供快速开发的能力
    • 避免了去写 MapReduce,减少开发人员的学习成本
    • 功能扩展很方便

2 Hive 架构

Hive 架构图

Hive 组件

  • 用户接口:包括 CLI、JDBC/ODBC、WebGUI。
    • CLI(command line interface)为 shell 命令行
    • JDBC/ODBC 是 Hive 的 JAVA 实现,与传统数据库JDBC 类似
    • WebGUI 是通过浏览器访问 Hive。
    • HiveServer2基于Thrift, 允许远程客户端使用多种编程语言如Java、Python向Hive提交请求
  • 元数据存储:通常是存储在关系数据库如 mysql/derby 中。
    • Hive 将元数据存储在数据库中。
    • Hive 中的元数据包括
      • 表的名字
      • 表的列
      • 分区及其属性
      • 表的属性(是否为外部表等)
      • 表的数据所在目录等。
  • 解释器、编译器、优化器、执行器:完成 HQL 查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。生成的查询计划存储在 HDFS 中,并在随后由 MapReduce 调用执行

Hive 与 Hadoop 的关系

Hive 利用 HDFS 存储数据,利用 MapReduce 查询分析数据。

Hive是数据仓库工具,没有集群的概念,如果想提交Hive作业只需要在hadoop集群 Master节点上装Hive就可以了

3 Hive 与传统数据库对比

  • hive 用于海量数据的离线数据分析。
Hive 关系型数据库
ANSI SQL 不完全支持 支持
更新 INSERT OVERWRITE\INTO TABLE(默认) UPDATE\INSERT\DELETE
事务 不支持(默认) 支持
模式 读模式 写模式
查询语言 HQL SQL
数据存储 HDFS Raw Device or Local FS
执行 MapReduce Executor
执行延迟
子查询 只能用在From子句中 完全支持
处理数据规模
可扩展性
索引 0.8版本后加入位图索引 有复杂的索引
  • hive支持的数据类型
    • 原子数据类型
      • TINYINT SMALLINT INT BIGINT BOOLEAN FLOAT DOUBLE STRING BINARY TIMESTAMP DECIMAL CHAR VARCHAR DATE
    • 复杂数据类型
      • ARRAY
      • MAP
      • STRUCT
  • hive中表的类型
    • 托管表 (managed table) (内部表)
    • 外部表

4 Hive 数据模型

  • Hive 中所有的数据都存储在 HDFS 中,没有专门的数据存储格式
  • 在创建表时指定数据中的分隔符,Hive 就可以映射成功,解析数据。
  • Hive 中包含以下数据模型:
    • db:在 hdfs 中表现为 hive.metastore.warehouse.dir 目录下一个文件夹
    • table:在 hdfs 中表现所属 db 目录下一个文件夹
    • external table:数据存放位置可以在 HDFS 任意指定路径
    • partition:在 hdfs 中表现为 table 目录下的子目录
    • bucket:在 hdfs 中表现为同一个表目录下根据 hash 散列之后的多个文件

5 Hive 安装部署

  • Hive 安装前需要安装好 JDK 和 Hadoop。配置好环境变量。

  • 下载Hive的安装包 http://archive.cloudera.com/cdh5/cdh/5/ 并解压

     tar -zxvf hive-1.1.0-cdh5.7.0.tar.gz  -C ~/app/
    
  • 进入到 解压后的hive目录 找到 conf目录, 修改配置文件

    cp hive-env.sh.template hive-env.sh
    vi hive-env.sh
    

    在hive-env.sh中指定hadoop的路径

    HADOOP_HOME=/root/bigdata/hadoop
    
  • 配置环境变量

    • vi ~/.bash_profile
      
    • export HIVE_HOME=/root/bigdata/hive
      export PATH=$HIVE_HOME/bin:$PATH
      
    • source ~/.bash_profile
      
  • 根据元数据存储的介质不同,分为下面两个版本,其中 derby 属于内嵌模式。实际生产环境中则使用 mysql 来进行元数据的存储。

    • 内置 derby 版:
      bin/hive 启动即可使用
      缺点:不同路径启动 hive,每一个 hive 拥有一套自己的元数据,无法共享

    • mysql 版:

      • 上传 mysql驱动到 hive安装目录的lib目录下

        mysql-connector-java-5.*.jar

      • vi conf/hive-site.xml 配置 Mysql 元数据库信息(MySql安装见文档)

        <?xml version="1.0" encoding="UTF-8" standalone="no"?>
        <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
        <configuration>
        <!-- 插入以下代码 -->
            <property>
                <name>javax.jdo.option.ConnectionUserName</name>
                <value>root</value><!-- 指定mysql用户名 -->
            </property>
            <property>
                <name>javax.jdo.option.ConnectionPassword</name>
                <value>password</value><!-- 指定mysql密码 -->
            </property>
           <property>
                <name>javax.jdo.option.ConnectionURL</name>mysql
                <value>jdbc:mysql://127.0.0.1:3306/hive</value>
            </property><!-- 指定mysql数据库地址 -->
            <property>
                <name>javax.jdo.option.ConnectionDriverName</name>
                <value>com.mysql.jdbc.Driver</value><!-- 指定mysql驱动 -->
            </property>
                <!-- 到此结束代码 -->
          <property>
            <name>hive.exec.script.wrapper</name>
            <value/>
            <description/>
          </property>
        </configuration>
        
        
  • hive启动

    • 启动docker

      service docker start

    • 通过docker 启动mysql

      docker start mysql

    • 启动 hive的metastore元数据服务

      hive --service metastore

    • 启动hive

      hive

    • MySQL

      • 用户名:root
      • 密码:password