大数据开发快速入门Hive(第十六篇)

425 阅读5分钟

一、什么是Hive

Hive是建立在Hadoop上的数据仓库基础构架。它提供了一系列的工具,可以用来进行数据提取、转化、加载,可以简称为ETL。

Hive 定义了简单的类SQL查询语言,称为HQL,它允许熟悉SQL的用户直接查询Hadoop中的数据,同 时,这个语言也允许熟悉MapReduce的开发者开发自定义的mapreduce任务来处理内建的SQL函数无法完成的复杂的分析任务。

Hive中包含的有SQL解析引擎,它会将SQL语句转译成M/R Job,然后在Hadoop中执行。

总结:通过这里的分析我们可以了解到Hive可以通过sql查询Hadoop中的数据,并且sql底层也会转化成mapreduce任务,所以hive是基于hadoop的。

二、Hive的数据存储

Hive的数据存储基于Hadoop的 HDFS。

Hive没有专门的数据存储格式。Hive默认可以直接加载文本文件(TextFile),还支持SequenceFile、RCFile等文件格式。针对普通文本数据,我们在创建表时,只需要指定数据的列分隔符与行分隔符,Hive即可解析里面的数据

三、Hive系统架构

Hadoop-Hive.drawio

  1. 用户接口:CLI、JDBC\ODBC、WebUI
  2. 元数据存储(Metastore)关系型数据库如derby、MySQL
  3. Driver:编译器、优化器、执行器
  4. Hadoop:用HDFS进行存储、用MapReduce进行计算
3.1、用户接口
  1. CLI:就是Shell命令行,表示我们可以通过Shell命令操作Hive
  2. JDBC\ODBC:是Hive的Java操作方式,与使用传统数据库JDBC方式类似
  3. WebUI:是通过Web页面进行操作
3.2、元数据

表示一个存储系统,Hive中元数据包括表的相关信息,Hive会将这些元数据存储在Metastore中,目前Metastore只支持mysql、derby

3.3、Driver

包含编译器、优化器、执行器可以完成Hive的查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。生成的查询计划最终存储在HDFS中,并在随后由MapReduce调用执行

3.4、Hadoop

Hive会使用HDFS进行存储,利用MapReduce进行计算。Hive的数据存储在HDFS中,大部分的查询由MapReduce完成。

从Hive2开始,官网不建议默认使用MapReduce引擎了,而是建议使用Tez引擎或者Spark引擎。

3.5、大数据引擎的发展历史
  1. 第一代:MapReduce

  2. 第二代:Tez

  3. 第三代:Spark

    Spark在当时属于一个划时代的产品,改变了之前基于磁盘的计算思路,而是采用内存计算,就是说Spark把数据读取过来以后,中间的计算结果是不会进磁盘的,一直到出来最终结果,才会写磁盘,这样就大大提高了计算效率

  4. 第四代:Flink

    Flink是一个可以支持纯实时数据计算的计算引擎,在实时计算领域要优于Saprk

3.6、Metastore

Metastore是Hive元数据的集中存放地。Hive 中的元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在 的hdfs目录等。

Metastore默认使用内嵌的derby数据库Derby数据库的缺点:在同一个目录下一次只能打开一个会话。使用derby存储方式时,Hive会在当前目录生成一个derby.log文件和一个metastore_db目录,metastore_db里面会存储具体的元数据信息。没有办法使用之前的元数据信息了。推荐使用MySQL作为外置存储引擎,可以支持多用户同时访问以及元数据共享。

四、数据库与数据仓库的区别

4.1、Hive VS MySQL
HiveMySQL
数据存储位置HDFS本地磁盘
数据格式数据格式数据格式
数据更新不支持(不支持修改和删除)支持(支持增删改查)
索引有,但较弱,一般很少用有,经常使用的
执行MapReduceExecutor
执行延迟延迟大延迟小
可扩展性
数据规模
4.2、数据库与数据仓库的区别

数据库:传统的关系型数据库主要应用在基本的事务处理,例如银行交易之类的场景。数据库支持增删改查这些常见的操作

数据仓库:主要做一些复杂的分析操作,侧重决策支持,相对数据库而言,数据仓库分析的数据规模要大得多。但是数据仓库只支持查询操作,不支持修改和删除

五、安装Hive

  1. 官网下载地址dlcdn.apache.org/hive/hive-3…

  2. 解压:

    tar -zxvf apache-hive-3.1.3-bin.tar.gz

  3. 修改配置

    接着需要修改配置文件,进入hive的conf目录中,先对这两个模板文件重命名

    mv hive-env.sh.template hive-env.sh

    mv hive-default.xml.template hive-site.xml

  4. 在 hive-env.sh 文件的末尾直接增加下面三行内容

    export JAVA_HOME=/root/software/jdk1.8.0_341
    export HADOOP_HOME=/root/software/hadoop-3.3.4
    export HIVE_HOME=/root/software/hive-3.1.3
    
  5. 修改hive-site.xml文件

    <property>
     <name>javax.jdo.option.ConnectionURL</name>
     <value>jdbc:mysql://192.168.0.102:3306/hive?useSSL=false</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>xys6154@</value>
    </property>
    <property>
     <name>hive.querylog.location</name>
     <value>/root/hive_repo/querylog</value>
    </property>
    <property>
     <name>hive.exec.local.scratchdir</name>
     <value>/root/hive_repo/scratchdir</value>
    </property>
    <property>
     <name>hive.downloaded.resources.dir</name>
     <value>/root/hive_repo/resources</value>
    </property>
    
  6. 修改hadoop的的core-site.xml

    <property>
        <name>hadoop.proxyuser.root.hosts</name>
        <value>*</value>
    </property>
    <property>
        <name>hadoop.proxyuser.root.groups</name>
        <value>*</value>
    </property>
    
  7. 初始化Hive的Metastore

    bin/schematool -dbType mysql -initSchema

    提示报错

    image-20221006160702392

  8. 修改hive-site.xml文件中的第3215行内容有问题

    其实就是把hive.txn.xlock.iow对应的description标签内容删掉,这样就可以了

  9. 初始化完成

    image-20221006161105747

  10. 查看本地的mysql库

    image-20221006161128255

注意点:

因为hive链接的数据库的是我本地安装的mysql。所以本地的mysql需要设置远程访问:

  1. 使用root登录

    mysql -uroot -p

  2. 选择数据库

    use mysql;

  3. 更新域属性,'%'表示允许外部访问

    update user set host='%' where user ='root';

  4. 执行以上语句之后再执行(刷新配置)

    FLUSH PRIVILEGES;

  5. 再执行授权语句

    GRANT ALL PRIVILEGES ON . TO 'root'@'%'WITH GRANT OPTION;

还有一点:我本地安装的是5.x版本的mysql。需要把mysql-5.x.jar上传到hive的lib目录文件下。