• Hive (数据仓库)简介


    一:什么是Hive(数据仓库)?     

      1、Hive 由 Facebook 实现并开源
      2、是基于 Hadoop 的一个数据仓库工具
      3、可以将结构化的数据映射为一张数据库表
      4、并提供 HQL(Hive SQL)查询功能
      5、底层数据是存储在 HDFS 上
      6、Hive的本质是将 SQL 语句转换为 MapReduce 任务运行
      7、使不熟悉 MapReduce 的用户很方便地利用 HQL 处理和计算 HDFS 上的结构化的数据,适用于离线的批量数据计算。
      8、底层支持多种不同的执行引擎(Hive on MapReduce、Hive on Tez、Hive on Spark)支
      9、持多种不同的压缩格式、存储格式以及自定义函数(压缩:GZIP、LZO、Snappy、BZIP2..  ; 存储:TextFile、SequenceFile、RCFile、ORC、Parquet ;     UDF:自定义函数)
    所以说 Hive 是基于 Hadoop 的一个数据仓库工具,实质就是一款基于 HDFS 的 MapReduce 计算框架,对存储在 HDFS 中的数据进行分析和管理

    二:为什么使用 Hive以及Hive的优点

    直接使用 MapReduce 所面临的问题:
      1、人员学习成本太高
      2、项目周期要求太短
      3、MapReduce实现复杂查询逻辑开发难度太大
    为什么要使用 Hive:
      1、更友好的接口:操作接口采用类 SQL 的语法,提供快速开发的能力
      2、更低的学习成本:避免了写 MapReduce,减少开发人员的学习成本
      3、更好的扩展性:可自由扩展集群规模而无需重启服务,还支持用户自定义函数
    (1)简单容易上手:提供了类SQL查询语言HQL
    (2)可扩展:为超大数据集设计了计算/扩展能力(MR作为计算引擎,HDFS作为存储系统)一般情
    况下不需要重启服务Hive可以自由的扩展集群的规模。
    (3)提供统一的元数据管理
    (4)延展性:Hive支持用户自定义函数,用户可以根据自己的需求来实现自己的函数

    三:Hive 的应用场景

    Hive 的最佳使用场合是大数据集的批处理作业,例如,网络日志分析。
    (1)日志分析:大部分互联网公司使用hive进行日志分析,文本分析 包括百度、淘宝等。
    1)统计网站一个时间段内的pv、uv
    2)多维度数据分析
    (2)海量结构化数据离线分析

    1、用户接口: shell/CLI, jdbc/odbc, webui Command Line Interface
      CLI,Shell 终端命令行(Command Line Interface),采用交互形式使用 Hive 命令行与 Hive 进行交互,最常用(学习,调试,生产)
      JDBC/ODBC,是 Hive 的基于 JDBC 操作提供的客户端,用户(开发员,运维人员)通过 这连接至 Hive server 服务
      Web UI,通过浏览器访问 Hive
    2、跨语言服务 : thrift server 提供了一种能力,让用户可以使用多种不同的语言来操纵hive
      Thrift 是 Facebook 开发的一个软件框架,可以用来进行可扩展且跨语言的服务的开发, Hive 集成了该服务,能让不同的编程语言调用 Hive 的接口
    3、底层的Driver: 驱动器Driver,编译器Compiler,优化器Optimizer,执行器Executor
      Driver 组件完成 HQL 查询语句从词法分析,语法分析,编译,优化,以及生成逻辑执行 计划的生成。生成的逻辑执行计划存储在 HDFS 中,并随后由
    MapReduce 调用执行
      Hive 的核心是驱动引擎, 驱动引擎由四部分组成:
        (1) 解释器:解释器的作用是将 HiveSQL 语句转换为抽象语法树(AST)
        (2) 编译器:编译器是将语法树编译为逻辑执行计划
        (3) 优化器:优化器是对逻辑执行计划进行优化
        (4) 执行器:执行器是调用底层的运行框架执行逻辑执行计划
    4、元数据存储系统 : RDBMS MySQL
      元数据,通俗的讲,就是存储在 Hive 中的数据的描述信息。
      Hive 中的元数据通常包括:表的名字,表的列和分区及其属性,表的属性(内部表和 外部表),表的数据所在目录
      Metastore 默认存在自带的 Derby 数据库中。缺点就是不适合多用户操作,并且数据存 储目录不固定。数据库跟着 Hive 走,极度不方便管理
      解决方案:通常存我们自己创建的 MySQL 库(本地 或 远程)
      Hive 和 MySQL 之间通过 MetaStore 服务交互
    执行流程
      HiveQL 通过命令行或者客户端提交,经过 Compiler 编译器,运用 MetaStore 中的元数 据进行类型检测和语法分析,生成一个逻辑方案(Logical Plan),然后
    通过的优化处理,产生 一个 MapReduce 任务。

    五:Hive工作原理

    1 Execute Query
    Hive接口,如命令行或Web UI发送查询驱动程序(任何数据库驱动程序,如JDBC,ODBC等)来执行。
    2 Get Plan
    在驱动程序帮助下查询编译器,分析查询检查语法和查询计划或查询的要求。
    3 Get Metadata
    编译器发送元数据请求到Metastore(任何数据库)。
    4 Send Metadata
    Metastore发送元数据,以编译器的响应。
    5 Send Plan
    编译器检查要求,并重新发送计划给驱动程序。到此为止,查询解析和编译完成。
    6 Execute Plan
    驱动程序发送的执行计划到执行引擎。
    7 Execute Job
    在内部,执行作业的过程是一个MapReduce工作。执行引擎发送作业给JobTracker,

    在名称节点并把它分配作业到TaskTracker,这是在数据节点。在这里,查询执行MapReduce工作。    

    7.1 Metadata Ops
    与此同时,在执行时,执行引擎可以通过Metastore执行元数据操作。
    8 Fetch Result
    执行引擎接收来自数据节点的结果。
    9 Send Results
    执行引擎发送这些结果值给驱动程序。
    10 Send Results
    驱动程序将结果发送给Hive接口。

    六:Hive(数据仓库)和数据库的异同

    (1)查询语言。由于 SQL 被广泛的应用在数据仓库中,因此专门针对Hive的特性设计了类SQL的查询语言HQL。熟悉SQL开发的开发者可以很方便的使用Hive进行开发。
    (2)数据存储位置。Hive是建立在Hadoop之上的,所有Hive的数据都是存储在HDFS中的。而数据库则可以将数据保存在块设备或者本地文件系统中。
    (3)数据格式。Hive中没有定义专门的数据格式,数据格式可以由用户指定,用户定义数据格式需要指定三个属性:列分隔符(通常为空格、” ”、”x001″)、行分隔符(” ”)以及读取文件数据的方法(Hive中默认有三个文件格式TextFile,SequenceFile以及RCFile)。由于在加载数据的过程中,不需要从用户数据格式到Hive定义的数据格式的转换,因此,
    Hive在加载的过程中不会对数据本身进行任何修改,而只是将数据内容复制或者移动到相应的HDFS目录中。
    而在数据库中,不同的数据库有不同的存储引擎,定义了自己的数据格式。所有数据都会按照一定的组织存储,因此,数据库加载数据的过程会比较耗时。
    (4)数据更新。由于Hive是针对数据仓库应用设计的,而数据仓库的内容是读多写少的。因此,Hive中不支持对数据的改写和添加,所有的数据都是在加载的时候中确定好的。而数据库中的数据通常是需要经常进行修改的,因此可以使用INSERT INTO ... VALUES添加数据,使用UPDATE ... SET修改数据。
    (5)索引。之前已经说过,Hive在加载数据的过程中不会对数据进行任何处理,甚至不会对数据进行扫描,因此也没有对数据中的某些Key建立索引。Hive要访问数据中满足条件的特定值时,需要暴力扫描整个数据,因此访问延迟较高。由于MapReduce的引入, Hive可以并行访问数据,因此即使没有索引,对于大数据量的访问,Hive仍然可以体现出优势。数据库中,通常会针对一个或者几个列建立索引,因此对于少量的特定条件的数据的访问,数据库可以有很高的效率,较低的延迟。由于数据的访问延迟较高,决定了Hive不适合在线数据查询。
    (6)执行。Hive中大多数查询的执行是通过Hadoop提供的MapReduce来实现的(类似select * from tbl的查询不需要MapReduce)。而数据库通常有自己的执行引擎。
    (7)执行延迟。之前提到,Hive在查询数据的时候,由于没有索引,需要扫描整个表,因此延迟较高。另外一个导致Hive执行延迟高的因素是MapReduce框架。由于MapReduce本身具有较高的延迟,因此在利用MapReduce执行Hive查询时,也会有较高的延迟。相对的,数据库的执行延迟较低。当然,这个低是有条件的,即数据规模较小,当数据规模大到超过数据库的处理能力的时候,Hive的并行计算显然能体现出优势。
    (8)可扩展性。由于Hive是建立在Hadoop之上的,因此Hive的可扩展性是和Hadoop的可扩展性是一致的(世界上最大的Hadoop集群在Yahoo!,2009年的规模在4000台节点左右)。而数据库由于ACID语义的严格限制,扩展行非常有限。目前最先进的并行数据库Oracle在理论上的扩展能力也只有100台左右。
    (9)数据规模。由于Hive建立在集群上并可以利用MapReduce进行并行计算,因此可以支持很大规模的数据;对应的,数据库可以支持的数据规模较小。

    七:Hive的数据类型及文件格式

      Hive 提供了基本数据类型和复杂数据类型
    基本数据类型:
    整型
    TINYINT — 微整型,只占用1个字节,只能存储0-255的整数。
    SMALLINT– 小整型,占用2个字节,存储范围–32768 到 32767。
    INT– 整型,占用4个字节,存储范围-2147483648到2147483647。
    BIGINT– 长整型,占用8个字节,存储范围-2^63到2^63-1。
    布尔型
    BOOLEAN — TRUE/FALSE
    浮点型
    FLOAT– 单精度浮点数。
    DOUBLE– 双精度浮点数。
    字符串型
    STRING– 不设定长度。
    复杂数据类型
    Structs:一组由任意数据类型组成的结构。比如,定义一个字段C的类型为STRUCT {a INT; b STRING},则可以使用a和C.b来获取其中的元素值;
    Maps:和Java中的Map相同,即存储K-V对的。
    Arrays:数组。
     hive的文件格式
    TEXTFILE //文本,默认值
    SEQUENCEFILE // 二进制序列文件
    RCFILE //列式存储格式文件 Hive0.6以后开始支持
    ORC //列式存储格式文件,比RCFILE有更高的压缩比和读写效率,Hive0.11以后开始支持
    PARQUET //列出存储格式文件,Hive0.13以后开始支持

    八: Hive的数据组织

    1、Hive 的存储结构包括数据库、表、视图、分区和表数据等。数据库,表,分区等等都对 应 HDFS
    上的一个目录。表数据对应 HDFS 对应目录下的文件。
    2、Hive 中所有的数据都存储在 HDFS 中,没有专门的数据存储格式,因为 Hive 是读模式 (Schema
    On Read),可支持 TextFile,SequenceFile,RCFile 或者自定义格式等
    3、 只需要在创建表的时候告诉 Hive 数据中的列分隔符和行分隔符,Hive 就可以解析数据
      Hive 的默认列分隔符:控制符 Ctrl + A,x01 Hive 的
      Hive 的默认行分隔符:换行符 
    4、Hive 中包含以下数据模型:
      database:在 HDFS 中表现为${hive.metastore.warehouse.dir}目录下一个文件夹
      table:在 HDFS 中表现所属 database 目录下一个文件夹
      external table:与 table 类似,不过其数据存放位置可以指定任意 HDFS 目录路径
      partition:在 HDFS 中表现为 table 目录下的子目录
      bucket:在 HDFS 中表现为同一个表目录或者分区目录下根据某个字段的值进行 hash 散 列之后的
    多个文件
      view:与传统数据库类似,只读,基于基本表创建
    5、Hive 的元数据存储在 RDBMS 中,除元数据外的其它所有数据都基于 HDFS 存储。默认情
    况下,Hive 元数据保存在内嵌的 Derby 数据库中,只能允许一个会话连接,只适合简单的
    测试。实际生产环境中不适用,为了支持多用户会话,则需要一个独立的元数据库,使用 MySQL 作
    为元数据库,Hive 内部对 MySQL 提供了很好的支持。
    6、Hive 中的表分为内部表、外部表、分区表和 Bucket 表
    内部表和外部表的区别:
      删除内部表,删除表元数据和数据
      删除外部表,删除元数据,不删除数据
    内部表和外部表的使用选择:
      大多数情况,他们的区别不明显,如果数据的所有处理都在 Hive 中进行,那么倾向于 选择内部表,但是如果
    Hive 和其他工具要针对相同的数据集进行处理,外部表更合适。
      使用外部表访问存储在 HDFS 上的初始数据,然后通过 Hive 转换数据并存到内部表中
      使用外部表的场景是针对一个数据集有多个不同的 Schema
      通过外部表和内部表的区别和使用选择的对比可以看出来,hive 其实仅仅只是对存储在 HDFS 上的数据提供了
    一种新的抽象。而不是管理存储在 HDFS 上的数据。所以不管创建内部 表还是外部表,都可以对 hive 表的数据存
    储目录中的数据进行增删操作。
    分区表和分桶表的区别: 
      Hive 数据表可以根据某些字段进行分区操作,细化数据管理,可以让部分查询更快。同 时表和分区也可以进
    一步被划分为 Buckets,分桶表的原理和 MapReduce 编程中的 HashPartitioner 的原理类似。
      分区和分桶都是细化数据管理,但是分区表是手动添加区分,由于 Hive 是读模式,所 以对添加进分区的数据
    不做模式校验,分桶表中的数据是按照某些分桶字段进行 hash 散列 形成的多个文件,所以数据的准确性也高很多

    讲了这么多都是它的好处,那它的缺点呢?

    九:Hive的缺点

    1、data shuffle时网络瓶颈,Reduce要等Map结束才能开始,不能高效利用网络带宽
    2、一般一个SQL都会解析成多个MR job,Hadoop每次Job输出都直接写HDFS,性能差
    3、每次执行Job都要启动Task,花费很多时间,无法做到实时
    4、由于把SQL转化成MapReduce job时,map,shuffle和reduce所负责执行的SQL功能不
    同。那么就有Map->MapReduce或者MapReduce->Reduce这样的需求。。
    这样可以降低写HDFS的次数,从而提高性能。很明显,由于架构上的天然涉及,Hive只适合批处理

  • 相关阅读:
    注意力机制在CV领域的应用之SEnet
    知识蒸馏技术原理
    batchsize如何影响模型的性能
    docker网络 macvlan
    docker pull使用 代理
    auditd重启失败
    3.Golang的包导入
    2.golang应用目录结构和GOPATH概念
    使用git版本管理时的免密问题
    1.go语言目录结构
  • 原文地址:https://www.cnblogs.com/ypsy/p/9972184.html
Copyright © 2020-2023  润新知