Hive入门级教程

Hive是个啥东西

Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类SQL查询功能。说白了就是把HQL转换成Map-Reduce程序运行。

来个小小的图示说明下sql–>mapreduce的过程
在这里插入图片描述

  • Hive处理的数据是存储在HDFS上的,如下图
    在这里插入图片描述
  • Hive分析数据底层的实现是MapReduce
  • 执行程序运行在Yarn上

为啥要使用Hive

对于单纯的执行Map-Reduce程序来说,需要话时间去学习,对开发要求比较高。
提供类SQL语言开发,基本上学过SQL的上手很快。
hive可以支持自定义函数

使用Hive要避免哪些场景

  • Hive无法计算迭代。
  • 不擅长数据挖掘,因为M-R数据流程处理的限制,无法实现效率更高的算法,需要数据挖掘的还是换其他框架吧。
  • 实时项目就不要想用Hive了,因为Hive主要是分析存储在HDFS上的离线文件。
  • Hive调优比较困难,粒度较粗。

Hive原理图

在这里插入图片描述
图中名词解释:

  • 用户接口,CLI(command-line interface)、JDBC/ODBC(jdbc访问hive)、WEBUI(浏览器访问hive)

  • 元数据:Metastore 元数据包括:表名、表所属的数据库(默认是default)、表的拥有者、列/分区字段、表的类型(是否是外部表)、表的数据所在目录等;

  • Hadoop: 使用HDFS进行存储,使用MapReduce进行计算

  • 驱动器:Driver 详解

    • 解析器,将Hive中执行的SQL转为语法树AST,主要用来分析SQL是否有语法错误,一般是第三方工具来完成的。
    • 编译器:将AST翻译成为逻辑执行计划
    • 优化器: 对执行计划进行优化
    • 执行器:把逻辑执行计划换成可运行的物理计划,对Hive来说,也就是执行M-R操作。

    流程说明:
    Hive通过给用户提供的一系列交互接口,接收到用户的指令(SQL),使用自己的Driver,结合元数据(MetaStore),将这些指令翻译成MapReduce,提交到Hadoop中执行,最后,将执行返回的结果输出到用户交互接口。

Hive容易走进的误区

因为Hive支持类SQL的语法操作表,故很多人会把他理解为数据库,其实从数据结构上来看,Hive除了和SQL都可以执行类SQL ,好像其他的并没有太多的相似之处。

对比传统性数据库

  • 存储位置 mysql是存储在DBMS系统中有一套自己的系统,Hive存储在hdfs
  • 数据格式
    mysql 遵循自己的一套数据规范,Hive可以自定义数据格式
  • 查询效率
    mysql因为是结构化和存储数量相对较少以及MySQL有各种优化机制,查询效率非常高,Hive执行的时候没有索引,必须把所有数据都处理一遍因此效率很低
  • 扩展性
    Hive处理的数据存储在HDFS 上,因为HDFS具有很大的扩展性,因此扩展性很强,但是随着数据量的增加执行效率可能会更低。

Hive安装以及配置说明

还是在Windows上搭建的自己测试,真正在公司应该是有专门的运维人员来搭建这些环境的,因此这里只是做一个简单的目录以及配置的说明。
这里以hive比较新的版本3.1.1为例:
官方的下载地址就不吐槽了,慢的要死,推荐大家使用清华大学的镜像网址,虽然我不是清华的。
清华大学免费软件镜像地址
里面基本上常用的软件都会有,下载速度超快。

在这里插入图片描述
新版本的目录和老版本一个很恶心的区别:
老版本有Windows下启动的cmd文件,新版本没有了。如果需要在Windows下启动的话还需要去下载相关cmd文件,本人花了40积分从csdn资源上下载下来了,需要的可以 1446028125 你懂的。

主要修改的配置文件:
在这里插入图片描述
hive-site.xml

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
  <!-- 下面这几个是将mysql作为metastore存储的配置 -->
  <property>
      <name>javax.jdo.option.ConnectionURL</name>
      <!-- 下面的hive是后面创建MariaDB时建立的数据库名 -->
      <value>jdbc:mysql://localhost:3306/hive?serverTimezone=UTC</value>
      <description>JDBC connect string for a JDBC metastore</description>
  </property>
  <property>
      <name>javax.jdo.option.ConnectionDriverName</name>
      <value>com.mysql.jdbc.Driver</value>
      <description>Driver class name for a JDBC metastore</description>
  </property>
  <property>
      <!-- 数据库连接名 -->
      <name>javax.jdo.option.ConnectionUserName</name>
      <value>root</value>
      <description>username to use against metastore database</description>
  </property>
  <property>
      <!-- 数据库连接密码 -->
      <name>javax.jdo.option.ConnectionPassword</name>
      <value>root</value>
      <description>password to use against metastore database</description>
  </property>

    <property>
    <name>hive.exec.local.scratchdir</name>
    <value>D:/study/hive/apache-hive-3.1.2-bin/iotmp/scratch_dir</value>
    <description>Local scratch space for Hive jobs</description>
  </property>
  
  <property>
    <name>hive.downloaded.resources.dir</name>
    <value>D:/study/hive/apache-hive-3.1.2-bin/iotmp/resources_dir/${hive.session.id}_resources</value>
    <description>Temporary local directory for added resources in the remote file system.</description>
  </property>

  
  <property>
        <name>hive.server2.logging.operation.enabled</name>
        <value>false</value>
</property>
</configuration>

hive-env.sh

# hive hsell 启动JVM的堆栈大小
export HADOOP_HEAPSIZE=1024
# hadoop的安装目录
HADOOP_HOME=D:\hadoop\hadoop-2.9.2
# hive的配置目录
export HIVE_CONF_DIR=D:\study\hive\apache-hive-3.1.2-bin\conf
# hive的lib库目录
export HIVE_AUX_JARS_PATH=D:\study\hive\apache-hive-3.1.2-bin\lib

windows下还需要配置Hive相关的环境变量
在这里插入图片描述
Hadoop的安装在Hadoop入门那里会讲到

Mysql中初始化Hive元数据需要的SQL

先来谈一谈为啥Hive的元数据的作用

hive是建立在hadoop之上的数据仓库,一般用于对大型数据集的读写和管理,存在hive里的数据实际上就是存在HDFS上,都是以文件的形式存在,不能进行读写操作,所以我们需要元数据或者说叫schem来对hdfs上的数据进行管理。那元数据表之间有没有什么关联呢?答案是肯定的。hive默认元数据表是存储在derby中的,但是derby是单session的,所以我们一般会修改会mysql

在MySQL中新建数据库hive,导入指定SQL文件
在这里插入图片描述
这里的文件需要根据不同的版本来自行选择。
ps:这一步也可以通过配置使用命令自行初始化数据库,因为我环境本身有点问题,使用命令初始化一直报错,因此我就直接导入sql。

启动Hive

启动之前先把Hadoop启动起来,因为默认Hive执行sql操作的数据存储在HDFS上的。
在这里插入图片描述
在此处打开cmd窗口执行:hive
如果出现这种,基本上没有问题
在这里插入图片描述

Hive语句练习

create database hive_1

我们查看是否已经创建成功了,
在这里插入图片描述
创建一张外部表:

create external table student_ext(Sno int,Sname string,Sex string,Sage int,Sdept string) row format delimited  fields terminated by ',' location '/stu';

-- 这条语句的意思是 和hdfs上的/stu文件夹创建一种关联,里面的文件的内容格式 是以逗号隔开的,然后创表语句中的Sno就对应第一个,Sname就对应第二个字段

我们看下Hive的元数据发生了哪些变化
在这里插入图片描述

同时我们导入一些文本信息,
使用hdfs命令把数据传到hdfs上

hdfs dfs -put C:\Users\Administrator\Desktop\student1.txt /stu;

student1.txt 格式如下:
在这里插入图片描述

我们查看是否创建成功:
在这里插入图片描述
我们尝试来查询一下:
select * from student_ext;
在这里插入图片描述
是不是对于Hive查询的数据存储在HDFS上有了一个初步的认识呢,这里只是一个最简单的创建表的例子。而且也只是创建的一张外部表。其实Hive中表类型一共有4中,后续会继续讲解其他几种类型表的相关语句。

猜你喜欢

转载自blog.csdn.net/abc8125/article/details/109425633