2. Hive架构原理:Hive架构组件、Hive执行流程、Hive与Hadoop的关系、元数据存储

好,咱们进入第二章。这一章我打算把Hive的骨架给你拆开看看。说白了,你学会了怎么装、怎么配,但如果不理解它内部是怎么协作的,遇到问题还是会抓瞎。我在带团队的时候,发现很多新人一上来就写SQL,结果跑得慢或者报错,根本不知道从哪排查。嗯,今天咱们就把Hive的架构原理聊透。

2.1 Hive架构组件

Hive的架构,我习惯把它分成四个核心部分。你想想看,一个SQL语句从输入到输出,要经过哪些角色?

  • 用户接口层:包括CLI(命令行)、JDBC/ODBC、Web UI。说白了,这就是你敲SQL的地方。
  • Driver组件:这是Hive的大脑。它负责接收SQL、解析、编译、优化、执行。
  • Metastore:元数据存储。存的是表名、列名、分区、路径这些“关于数据的数据”。
  • 执行引擎:默认是MapReduce,也可以换成Tez或Spark。

我在项目中遇到过一种情况:有人把Hive当成数据库用,频繁做更新删除。结果发现Metastore里存的元数据越来越大,查询越来越慢。后来我强制要求:Hive是分析工具,不是OLTP数据库。这一点你得记牢。

核心要点:Hive本身不存数据,也不负责计算。它只是一个翻译官——把你的SQL翻译成MapReduce任务,交给Hadoop去跑。

2.2 Hive执行流程

一条SQL在Hive里是怎么跑起来的?我一步步拆给你看。

  1. SQL解析:Driver把SQL字符串解析成抽象语法树(AST)。这一步会检查语法对不对。
  2. 语义分析:检查表名、列名是否存在。我记得有一次,同事把表名写错了,结果这一步直接报错,他还以为是Hive挂了。
  3. 逻辑计划生成:把AST转换成逻辑执行计划。说白了,就是“先做什么,后做什么”。
  4. 逻辑计划优化:Hive内置了很多优化规则,比如谓词下推、列裁剪。我建议你多关注这一步,很多性能问题就是优化没做好。
  5. 物理计划生成:把逻辑计划转换成具体的MapReduce任务(或Tez任务)。
  6. 任务执行:提交到Hadoop集群,跑MapReduce。
  7. 结果返回:把结果写回HDFS或者直接输出到控制台。

你可能会问:为什么有时候跑得慢?其实瓶颈往往出在第5步到第6步之间。我曾经优化过一个慢查询,发现是生成了太多MapReduce Job,每个Job都要启动和销毁,光开销就占了70%的时间。后来改成Tez引擎,一个DAG搞定,速度提升了3倍。

个人经验:如果你发现Hive查询特别慢,先别急着调参数。用EXPLAIN命令看看执行计划,很多时候问题出在SQL写法上。

2.3 Hive与Hadoop的关系

这个关系其实很简单,但我发现很多人会搞混。Hive和Hadoop不是竞争关系,而是依赖关系

组件 Hive的角色 Hadoop的角色
数据存储 定义表结构(元数据) HDFS存真实数据
计算引擎 生成执行计划 MapReduce/YARN执行任务
资源管理 不直接管理资源 YARN负责资源调度

说白了,Hive就是个“壳”。它把SQL翻译成MapReduce,然后让Hadoop去干活。没有Hadoop,Hive就是个空架子。反过来,没有Hive,你得手写MapReduce代码,那效率就太低了。

我记得刚入行那会儿,有个同事问我:“Hive是不是比Hadoop快?”我当时就笑了。Hive本身不干活,快慢取决于Hadoop集群的规模和配置。你想想看,一个10台机器的集群和一个100台机器的集群,跑同一个SQL,速度能一样吗?

避坑指南:我曾经见过有人把Hive和Hadoop装在同一台机器上,结果跑大查询时直接把机器搞挂了。记住:Hive是客户端,Hadoop是服务端,最好分开部署。

2.4 元数据存储

元数据是Hive的灵魂。没有元数据,Hive连表名都不知道,更别提跑SQL了。

Hive默认使用Derby作为元数据库,但Derby只支持单会话。我建议你换成MySQL或PostgreSQL,尤其是生产环境。为什么?因为Derby一重启,元数据就丢了,你之前建的表全没了。我吃过这个亏,所以现在不管项目多小,我都用MySQL存元数据。

元数据里存了哪些东西?我列一下:

  • 表信息:表名、所属数据库、创建时间
  • 列信息:列名、数据类型、注释
  • 分区信息:分区字段、分区值、分区路径
  • 存储信息:文件格式(TextFile、ORC、Parquet等)、存储路径
  • SerDe信息:序列化/反序列化方式

你可能会问:元数据存在MySQL里,那Hive怎么知道数据在HDFS的哪个位置?嗯,这就是关键。元数据里存了表的HDFS路径。比如你建了一个表user_info,元数据里会记录它的数据在/user/hive/warehouse/user_info这个目录下。Hive执行查询时,先去Metastore查路径,然后去HDFS读数据。

重要提醒:如果你手动删了HDFS上的数据文件,但没更新Metastore,Hive会认为数据还在。反过来,如果你只删了Metastore里的元数据,HDFS上的文件就成了孤儿。所以,操作时一定要保持一致。

我个人习惯是,每周做一次Metastore的备份。因为元数据一旦损坏,恢复起来非常麻烦。我曾经帮一个客户恢复过元数据,他们误删了MySQL里的hive库,结果所有表都找不到了。最后只能从HDFS上的文件反推表结构,折腾了两天。

好了,这一章的内容就这些。Hive的架构其实不复杂,但理解它之后,你写SQL时会更有底气。下一章咱们开始实战,我会带你搭建一个真正的Hive数据仓库。