zoukankan      html  css  js  c++  java
  • 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只适合批处理

  • 相关阅读:
    Atitit.随时间变色特效 ---包厢管理系统的规划
    Atitit.request http乱码的设计防止 检测与解决最近实践p825 attilax总结.doc
    Atitit.request http乱码的设计防止 检测与解决最近实践p825 attilax总结.doc
    atitit.薄伽梵歌overview  attilax 读后感
    Atitit。 《吠陀》 《梨俱吠陀》overview 经读后感  是印度上古时期一些文献的总称
    Atitit。 《吠陀》 《梨俱吠陀》overview 经读后感  是印度上古时期一些文献的总称
    atitit.薄伽梵歌overview  attilax 读后感
    Atitit 《摩奴法典》overivew 读后感 不是由国王 颁布的,而是 僧侣编制
    Atitit 《摩奴法典》overivew 读后感 不是由国王 颁布的,而是 僧侣编制
    Atitit.执行cli cmd的原理与调试
  • 原文地址:https://www.cnblogs.com/ypsy/p/9972184.html
Copyright © 2011-2022 走看看