Hive教程

Hive教程


一、Hive简介

1.1、什么是 Hive ?

  Hive 是一个基于 Hadoop 文件系统之上的数据仓库架构。它为数据仓库的管理提供了许多功能:数据 ETL (抽取、转换和加载)工具、数据存储管理和大型数据集的查询和分析能力。同时 Hive 还定义了类 SQL的语言 – Hive QL. Hive QL 允许用户进行和 SQL 相似的操作,它可以将结构化的数据文件映射为一张数据库表,并提供简单的 SQL 查询功能。还允许开发人员方便地使用 Mapper 和 Reducer 操作,可以将 SQL 语句转换为 MapReduce 任务运行,这对 MapReduce 框架来说是一个强有力的支持。

1.2、Hive 体系结构

  Hive 是 Hadoop 中的一个重要子项目,从下图我们就可以大致了解 Hive 在 Hadoop 中的位置和关系。
在这里插入图片描述
上图描述 Hadoop EcoSystem 中的各层系统。而 Hive 本身的体系结构如下:
在这里插入图片描述

  • 从图中我们可以看出 Hive 其基本组成可以分为:

    • 用户接口,包括 CLI, JDBC/ODBC, WebUI
    • 元数据存储,通常是存储在关系数据库如 MySQL, Derby 中
    • 解释器、编译器、优化器、执行器
    • Hadoop, 用 HDFS 进行存储,利用 MapReduce 进行计算

1.3、Hive 与关系数据库的区别

  Hive 在很多方面与传统关系数据库类似(例如支持 SQL 接口),但是其底层对 HDFS 和 MapReduce 的依赖意味着它的体系结构有别于传统关系数据库,而这些区别又影响着 Hive 所支持的特性,进而影响着 Hive 的使用。

  • 我们可以列举一些简单区别:
    • Hive 和关系数据库存储文件的系统不同,Hive 使用的是 Hadoop 的HDFS(Hadoop的分布式文件系统),关系数据库则是服务器本地的文件系统;
    • Hive 使用的计算模型是 MapReduce,而关系数据库则是自己设计的计算模型;
    • 关系数据库都是为实时查询的业务进行设计的,而 Hive 则是为海量数据做数据挖掘设计的,实时性很差;实时性的区别导致 Hive 的应用场景和关系数据库有很大的不同;
    • Hive 很容易扩展自己的存储能力和计算能力,这个是继承 Hadoop 的,而关系数据库在这个方面要差很多。

1.4、Hive 应用场景

  • 通过对 Hive 与传统关系数据库的比较之后,其实我们不难得出 Hive 可以应用于哪些场景。

  • Hive 构建在基于静态批处理的 Hadoop 之上,Hadoop 通常都有较高的延迟并且在作业提交和调度的时候需要大量的开销。因此,Hive 不适合在大规模数据集上实现低延迟快速的查询。

  • Hive 并不适合那些需要低延迟的应用,例如,联机事务处理(OLTP)。Hive 查询操作过程严格遵守 Hadoop MapReduce 的作业执行模型,Hive 将用户的 HiveQL 语句通过解释器转换为 MapReduce 作业提交到 Hadoop 集群上,Hadoop 监控作业执行过程,然后返回作业执行结果给用户。Hive 并非为联机事务处理而设计,Hive 并不提供实时的查询和基于行级的数据更新操作。

  • Hive 的最佳使用场合是大数据集的批处理作业,例如,网络日志分析。

1.5、Hive 的数据存储

  • Hive 的存储是建立在 Hadoop 文件系统之上的。Hive 本身没有专门的数据存储格式,也不能为数据建立索引,因此用户可以非常自由地组织 Hive 中的表,只需要在创建表的时候告诉 Hive 数据中的列分隔符就可以解析数据了。

  • Hive 中主要包括 4 种数据模型:表(Table)外部表(External Table)分区(Partition)以及 桶(Bucket)

  • Hive 的表和数据库中的表在概念上没有什么本质区别,在 Hive 中每个表都有一个对应的存储目录。而外部表指向已经在 HDFS 中存在的数据,也可以创建分区。Hive 中的每个分区都对应数据库中相应分区列的一个索引,但是其对分区的组织方式和传统关系数据库不同。桶在指定列进行 Hash 计算时,会根据哈希值切分数据,使每个桶对应一个文件。

1.6、Hive 的元数据存储

  • 由于 Hive 的元数据可能要面临不断地更新、修改和读取操作,所以它显然不适合使用 Hadoop 文件系统进行存储。目前 Hive 把元数据存储在 RDBMS 中,比如存储在 MySQL, Derby 中。这点我们在上面介绍的 Hive 的体系结构图中,也可以看出。

二、Hive 环境介绍

  • 与 Hadoop 类似,Hive 也有 3 种运行模式:
    • 1.内嵌模式
      将元数据保存在本地内嵌的 Derby 数据库中,这是使用 Hive 最简单的方式。但是这种方式缺点也比较明显,因为一个内嵌的 Derby 数据库每次只能访问一个数据文件,这也就意味着它不支持多会话连接。

    • 2.本地模式
      这种模式是将元数据保存在本地独立的数据库中(一般是 MySQL),这就可以支持多会话和多用户连接了。

    • 3.远程模式
      此模式应用于 Hive 客户端较多的情况。把 MySQL 数据库独立出来,将元数据保存在远端独立的 MySQL 服务中,避免了在每个客户端都安装 MySQL 服务从而造成冗余浪费的情况。

2.1、安装准备

  • 1、下载安装 hive
    首先打开终端切换到 hadoop 用户下:

    su -l hadoop #密码为hadoop
    

    在这里插入图片描述
    Hive 是基于 Hadoop 文件系统之上的数据仓库。因此,安装 Hive 之前必须确保 Hadoop 已经成功安装。本次我们使用 Hive 1.2.1 版本。Hive 1.2.1 可以在 Hadoop V2.7.x 以上环境中工作。

    下载 apache-hive-1.2.1-bin.tar.gz 后,对其进行解压: tar zxvf apache-hive-1.2.1-bin.tar.gz
    下载地址:hive-1.2.1

  • 2、配置系统环境变量

    • 修改/etc/profile 文件和.bashrc文件
      sudo vim /etc/profile
      
      # Hive environment
      export HIVE_HOME=/opt/apache-hive-1.2.1-bin
      export PATH=$PATH:$HIVE_HOME/bin
      
  • 3、hadoop 集群启动

    • 先进入的/opt/hadoop-2.7.3/sbin 目录下,再启动 hdfs
      $ cd /opt/hadoop-2.7.3/sbin
      $ hdfs namenode -format                 #namenode初始化
      $ ./start-all.sh                          # 启动hadoop
      
    • 验证 hdfs 是否启动成功
      1、输入jps查看相关进程是否存在
      2、输入hadoop dfs -fs /确定能否链接成功
      在这里插入图片描述

2.2、本地模式

  现在我们替换默认的 Derby 数据库为 MySQL 数据库。

2.2.1、下载安装 MySQL
  • mysql安装教程:地址

  • 创建 hive 数据库:

    mysql -u root -p  #没有密码直接回车即可
    create database hive;  #创建hive数据库
    grant all on hive.* to 'hive'@'localhost' identified by 'hive';   #创建用户hive
    

    在这里插入图片描述
    在这里插入图片描述

    虽然 MySQL 已经默认安装,但我们还需要下载一个 MySQL 的 JDBC 驱动包。这里使用的是 mysql-connector-java-5.1.32-bin.jar,助攻文件需要复制到 $HIVE_HOME/lib 目录下面。

  • 这里我们提供了 mysql-connector-java-5.1.32.jar 的下载链接,需要的同学可以自行下载:

    wget https://labfile.oss.aliyuncs.com/courses/38/mysql-connector-java-5.1.32.rar
    
2.2.2、修改 hive-site.xml 配置文件
  • 最后,依然是修改 $HIVE_HOME/conf 下的 hive-site.xml 文件,把默认的 Derby 修改为 MySQL :

    <?xml version="1.0"?>
    <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
    <configuration>
            <property>
                    <name>javax.jdo.option.ConnectionURL</name>
                    <value>jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true</value>
                    <!-- 这里自己搓自己的mysql的ip地址 -->
            </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>hive</value>
                    <!-- 这里搓自己的mysql账号和密码 -->
            </property>
    </configuration>
    
2.2.3、启动 Hive
  • 初始化 hive 元数据库:

    schematool -dbType mysql -initSchema
    
  • 启动 Hive 的方式如下:

    cd /opt/apache-hive-1.2.1-bin/bin
    hive
    

    在这里插入图片描述

2.3、内嵌模式

2.3.1、修改hive-site.xml
  • 先切换到对应的目录下操作:

    cd /opt/apache-hive-1.2.1-bin/conf/
    ls
    

    在这里插入图片描述

    $ sudo cp hive-default.xml.template hive-site.xml
    
  • hive-site.xml 的主要配置有以下,不需要修改:
    在这里插入图片描述
    在这里插入图片描述

    hive.metastore.warehouse.dir 该参数指定了 Hive 的数据存储目录,默认位置在 HDFS 上面的 /user/hive/warehouse 路径下。

    hive.exec.scratchdir 该参数指定了 Hive 的数据临时文件目录,默认位置为 HDFS 上面的 /tmp/hive 路径下。

  • 同时我们还要修改 Hive 目录下 /conf/hive-env.sh 文件(请根据自己的实际路径修改),该文件默认也不存在,同样是拷贝它的模版来修改

    cat hive-env.sh
    

    在这里插入图片描述

2.3.2、创建必要目录
  • 前面我们看到 hive-site.xml 文件中有两个重要的路径,切换到 hadoop 用户下查看 HDFS (需要先启动 Hadoop)是否有这些路径:

    $ hadoop dfs -ls /
    

    在这里插入图片描述
    没有发现上面提到的路径,因此我们需要自己新建这些目录,并且给它们赋予用户写(W)权限。

    $ hadoop dfs -mkdir /user
    $ hadoop dfs -mkdir /user/hive
    $ hadoop dfs -mkdir /user/hive/warehouse
    $ hadoop dfs -mkdir /tmp
    $ hadoop dfs -mkdir /tmp/hive
    $ hadoop dfs -chmod 777 /user/hive/warehouse
    $ hadoop dfs -chmod 777 /tmp/hive
    

    在这里插入图片描述

  • 检查是否新建成功 hadoop dfs -ls / 以及 hadoop dfs -ls /user/hive/ :
    在这里插入图片描述

2.3.3、修改 io.tmpdir 路径
  • 同时,要修改 hive-site.xml 中所有包含 ${system:java.io.tmpdir} 字段的 value ,可以自己新建一个目录来替换它,例如 /home/hadoop/hive/iotmp 。(以下是一个修改示例,其他的同理)

    # 将
    <value>${system:java.io.tmpdir}/${system:user.name}</value>
    # 改成
    <value>/home/hadoop/hive/iotmp</value>
    
  • 并且需要在/home/hadoop/下建立相应的目录

    $ mkdir /home/hadoop/hive
    
  • 如果不修改这个目录,你很可能会出现如下错误:
    在这里插入图片描述

    vim 下 / 表示搜索,后面跟你的关键词,比如搜索 hello,则为 /hello , 再回车即可), 同样注意修改写权限

2.3.4、运行 Hive
  • 前面我们已经提到过,内嵌模式使用默认配置和 Derby 数据库,所以无需其它特别修改直接运行 hive(确保 Hadoop 已经先启动)。完整步骤如下:

    cd ..
    cd bin/
    schematool -dbType derby -initSchema  # 初始化hive的元数据库
    hive  #启动hive
    

三、Hive基本操作

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值