
一、Hive 在哪为什么元数据放 MySQL1. Hive 安装在哪里整体部署位置Hive只是一套客户端工具 服务程序不需要集群每台机器都装实验环境一般只装在主节点hadoop1一台虚拟机上。它本身不存储业务数据原始表数据全部存在 HDFS它本身不负责分布式计算只是翻译工具真正计算交给 YARN 调度 MapReduceHive 由几部分程序组成都运行在 hadoop1 本地 JVM 进程CLI/Beeline你敲 HQL 命令的客户端Driver解析 / 编译 / 优化器把 SQL 翻译成 MR 计划Metastore 元数据服务专门管理表结构信息HiveServer2供 JDBC 远程连接的服务。简单一句话 Hive 是单机翻译程序跑在单台虚拟机数据存 HDFS元数据单独存在 MySQL计算交给 YARNMR。2. 什么是 Hive 元数据Metastore 里存什么元数据就是描述数据的数据所有建表、查询必须依赖这些信息库、表、分区、分桶名称每张表字段名、字段类型、分隔符这张表真实数据在 HDFS 上的存储路径表类型内部表 / 外部表、存储格式Text/ORC、权限信息。举例子 执行select * from student;Hive 必须先查元数据student 表有哪些列、数据在 HDFS 哪个文件夹才能去 HDFS 读取文件解析内容。3. 为什么元数据不能放 HDFS必须放 MySQL关系型数据库1HDFS 天生不适合元数据的读写场景HDFS 设计目标大批量、顺序读写大文件高吞吐短板是随机读写极慢、不支持实时修改、没有事务。 而元数据操作特点每次执行 HQL 都要频繁随机查询表结构建表、删分区、改字段需要实时更新、少量修改多个人同时操作 Hive需要并发读写、数据一致。 如果元数据存在 HDFS 文件里多人同时建表会冲突查询表结构卡顿修改元数据无法实时生效。2MySQLRDBMS 关系库刚好匹配元数据需求支持低延迟随机增删改查查一张表结构毫秒级完成完整 ACID 事务多人同时建表 / 删分区不会出现元数据错乱支持多会话并发多个终端、Spark、Impala 可以同时读取同一套元数据结构化表格存储元信息方便索引快速查找。3补充Hive 默认 Derby 的缺陷为什么换成 MySQLHive 自带 Derby 嵌入式数据库只能单用户单会话开两个 Hive 窗口直接报错锁冲突 改用 MySQL支持多人同时操作 Hive。二、完整 HQL 执行流程结合 “SQL 翻译 MR” 这条主线以select word,count(*) from doc group by word;举例完整链路用户在 hadoop1 执行 HQL交给 Hive 的 Driver 组件Driver 调用 Metastore 服务去 MySQL 查询 doc 表元数据字段、HDFS 路径Compiler 编译器拿到元数据做四步翻译语法解析 → 生成抽象语法树 AST语义校验表、字段是否存在生成逻辑执行计划优化分区裁剪、谓词下推翻译成 MapReduce 物理任务计划ExecutionEngine 把 MR 作业提交给 YARN ResourceManagerYARN 分配 Container启动 Map/Reduce Task 读取 HDFS 上 doc 原始数据计算MR 结果写入 HDFS 输出目录Hive 读取 HDFS 结果格式化打印到终端。分层总结三者分工MySQL只存表结构元数据小量结构化描述信息HDFS存储业务原始数据、MR 输出结果海量文件Hive 程序 (hadoop1)翻译 SQL、查询元数据、提交 MR 任务YARNMapReduce分布式实际计算。