• 什么是Hive
  • Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能,构建在分布式HDFS系统运行的数据库
  • 应用场景
  • 大数据集的批处理作用,做离线的数据分析
  • 日志分析
  • 多维度数据分析
  • 海量结构化数据离线分析
  • 统计网站一个时间段内的pv、uv
  • 优缺点
  • 优点
  • 可扩展:为超大数据集设计了计算/扩展能力(MR作为计算引擎,HDFS作为存储系统)
  • 延展性:Hive支持用户自定义函数,用户可以根据自己的需求来实现自己的函数
  • 容错:良好的容错性,节点出现问题SQL仍可完成执行
  • 简单容易上手:提供了类SQL查询语言支持HQL
  • 提供统一的元数据管理
  • 执行延迟较高:处理大数据,对于处理小数据没有优势,因为 Hive 的执行延迟比较高
  • 缺点
  • Hive的HQL表达能力有限[由于 Hive 采用了 SQL 的查询语言 HQL,因此很容易将 Hive 理解为数据库]
  • Hive的效率比较低[数据挖掘方面不擅长,由于MapReduce数据处理流程的限制,效率更高的算法却无法实现]
  • Hive可控性差
  • Hive的HQL表达能力有限,比如不支持UPDATE、非等值连接、DELETE、INSERT单条等。
  • 由于Hive自动生成MapReduce作业,HQL调优困难
  • 架构
  • 用户接口
  • 包括命令行(CLI)、客户端(Client)和Web图形化界面(WebGUI)。最常用的是CLI。
  • 元数据存储
  • 通常是Hive的元数据存储在关系数据库如mysql、derby中。
  • 解释器
  • 对输入的HiveQL语句进行词法分析和语法分析,并生成词法分析树
  • 编译器
  • 编译器接收AST作为输入,并将其转换为中间代码表示(Intermediate Representation,IR)。编译器首先对AST进行语法分析和语义检查,以确保查询语句的语法正确且符合语义规则
  • 优化器
  • 根据查询的特性和数据分布情况,对查询计划进行优化,以减少计算成本和提高查询性能。优化器会生成多个可能的执行计划,并选择最优的计划。
  • 执行器
  • 根据查询计划生成MapReduce作业,提交到Hadoop进行计算
  • 存储位置
  • 建立在 Hadoop 之上的,所有 Hive 的数据都是存储在 HDFS 中的。而数据库则可以将数据保存在块设备或者本地文件系统
  • 工作原理
  • Hive的工作原理简单的说就是一个查询引擎,接收到一个SQL,而后面做的事情包括: 词法分析/语法分析 使用antlr将SQL语句解析成抽象语法树(AST),再将AST转换成逻辑计划[也就是将sql语句转换为MapReduce任务],最后执行计划
  • 数据存储
  • HDFS模型[Hive的数据库对应HDFS的一个目录]
  • Table: 内部表与RDBMS的Table在概念上是类似。每一个Table在Hive中都有一个相应的目录存储数据
  • External Table:在创建表的时候可以指定external关键字创建外部表,外部表对应的文件存储在location指定的目录下,向该目录添加新文件的同时,该表也会读取到该文件(当然文件格式必须跟表定义的一致),删除外部表的同时并不会删除location指定目录下的文件,删除的仅仅是一个链接
  • Partition: 分区
  • Bucket : 将表的列通过Hash算法进一步分解成不同的文件存储。它对指定列计算hash,根据hash值切分数据,目的是为了并行,每一个Bucket对应一个文件,将数据被分成块并存储在集群中的不同节点上。这些块被称为也可以成为桶
  • HDFS是Hadoop的分布式文件系统,用于存储和管理大规模数据集
  • 数据交换
  • 命令行模式
  • Web模式
  • 远程服务: 通过 JDBC 等访问来连接 Hive ,这是开发人员最需要的方式
  • 数据交换作用:指将Hive中的数据与其他系统或数据源进行交互和分析处理
  • 支持的计算引擎
  • MapReduce
  • Spark
  • Tez
  • 常踩的坑
  • 字符匹配问题:当字段是字符串型时,where语句=0(int)型来匹配会拉不到数据
  • Llap巨坑:关键是几个空间参数的配置,只要配错了,就会出现各种奇怪的问题,Llap:可以将数据预取、缓存到基于yarn运行的守护进程中,降低和减少系统IO和与HDFS DataNode的交互,提高查询效率
  • Spark应用创建表时,指定的schema版本为1.2.0,而hive的schema版本为2.3.0,版本不兼容导致。在hvie-site.xml中hive.metastore.schema.verification参数设置为false即可解决。
  • hive表中新增字段或者修改字段时,需要使用cascade方式,否则新增字段,回刷数据还是存在为null的情况 、或者删除分区,重新建表,才能解决回刷数据的问题