
如果你准备在 Ubuntu 上搭一套 Hive 环境我猜你多半已经被各种“版本不兼容”“驱动找不到”“元数据初始化失败”折腾过了。我之前在 Ubuntu 22.04 虚拟机里装 Hive 3.1.2 时整整卡了一个下午最后查出来的根因是 MySQL 8.0 的认证插件和 Hive 3.1.2 自带的 MySQL 驱动包版本不匹配。这篇文章把我完整的安装过程、配置参数、踩坑记录和排查方法都写出来附带 MySQL 的安装方式和驱动包获取渠道照着一步步做基本上一个小时内能把 Hive 跑起来。我会尽量写得像是我在你旁边操作一样每一步命令都给出为什么这么做的解释遇到报错也知道从哪里下手。1. 环境准备与版本选型1.1 为什么选 Hive 3.1.2目前 Hive 的主流稳定版本是 2.x 和 3.x。Hive 2.3.x 对 Hadoop 2.x 兼容性最好但如果你用的是 Hadoop 3.x我更推荐直接上 Hive 3.1.2。原因有三点Hive 3.1.2 对 Hadoop 3.x 的ResourceManager 高可用、HDFS 纠删码等新特性支持更好不会出现奇怪的 RPC 协议不兼容。Hive 3.x 默认使用Tez作为执行引擎比 Hive 2.x 默认的 MapReduce 跑得快不少对于学习练手来说体感差距非常明显。现在网上的教程、issue 讨论大多集中在 Hive 2.x 和 Hive 3.1.2遇到问题更容易搜到解决方案。当然Hive 3.1.2 对 JDK 版本有要求建议用 JDK 1.8别一上来就装 JDK 11 或 17后面编译 UDF 或者跑某些内置函数时容易踩坑。我之前用 JDK 11 跑 Hive 3.1.2启动时虽然能起来但执行hive --service metastore时偶尔报UnsupportedClassVersionError这类问题排查起来很浪费时间。1.2 组件版本对照与下载地址我在这台 Ubuntu 22.04 上最终确认的版本组合如下组件版本说明Ubuntu22.04 LTS20.04 也可以操作完全一致JDK1.8.0_202Oracle JDK 或 OpenJDK 8不要用更高版本Hadoop3.3.6伪分布式模式即可Hive3.1.2主装对象MySQL8.0.37apt 安装作为 Hive 元数据库MySQL JDBC 驱动mysql-connector-java-8.0.30.jar关键不能太低Hive 安装包从 Apache 官网下载比较慢建议直接找国内镜像源下载速度能快很多。我用的是清华镜像的地址直接在终端用wget拉取# 请根据实际情况替换成可用的镜像地址 wget https://mirrors.tuna.tsinghua.edu.cn/apache/hive/hive-3.1.2/apache-hive-3.1.2-bin.tar.gz如果镜像地址变了可以去 Apache 官网的 archive 目录找历史版本。Hive 安装包解压后大约 500MB 左右下载时注意磁盘空间。1.3 JDK 安装与环境变量配置JDK 安装不是重点但环境变量配置要小心。网上很多教程让你直接改/etc/profile我建议在用户级配置文件~/.bashrc里做避免影响到系统其他服务。sudo apt update sudo apt install -y openjdk-8-jdk # 查看 Java 安装路径 java -version readlink -f $(which java) # 通常输出/usr/lib/jvm/java-8-openjdk-amd64/bin/java然后把下面这段加到~/.bashrc末尾export JAVA_HOME/usr/lib/jvm/java-8-openjdk-amd64 export PATH$PATH:$JAVA_HOME/bin执行source ~/.bashrc后用java -version和echo $JAVA_HOME验证。这里有个容易忽略的点如果之前装过其他版本 JDK一定要确认which java指向的是你配置的路径。我用update-alternatives --config java检查过好多次每次都能发现默认 JDK 被改掉的坑。1.4 Hadoop 伪分布式安装要点Hive 本身只负责把 SQL 翻译成 MapReduce/Tez 任务真正干活的是 Hadoop。所以哪怕你只是本地学习也必须有 Hadoop 环境。Hadoop 我用的伪分布式模式配置不算复杂但有几个关键配置要确认。首先是core-site.xmlconfiguration property namefs.defaultFS/name valuehdfs://localhost:9000/value /property property namehadoop.tmp.dir/name value/home/ubuntu/hadoop_tmp/value /property /configuration再是hdfs-site.xmlconfiguration property namedfs.replication/name value1/value /property property namedfs.namenode.name.dir/name value/home/ubuntu/hadoop_data/namenode/value /property property namedfs.datanode.data.dir/name value/home/ubuntu/hadoop_data/datanode/value /property /configuration为什么要把默认的/tmp/hadoop-${user}改掉因为系统重启后/tmp下的文件可能被清空而 NameNode 的格式化信息一旦丢了HDFS 整个就起不来了。我吃过这个亏后来所有数据目录都放到/home下面。接下来是mapred-site.xml和yarn-site.xmlHive 3.x 可以走 MapReduce 也可以走 Tez。如果不打算单独装 Tez就保持 MapReduce 作为执行引擎!-- mapred-site.xml -- configuration property namemapreduce.framework.name/name valueyarn/value /property /configuration !-- yarn-site.xml -- configuration property nameyarn.nodemanager.aux-services/name valuemapreduce_shuffle/value /property /configuration启动 HDFS 和 YARN 时我习惯用start-dfs.sh和start-yarn.sh分开启动这样如果某个进程挂了日志更好定位。执行完jps可以看到如下进程NameNode DataNode SecondaryNameNode ResourceManager NodeManager出现这五个进程说明 Hadoop 环境已经就绪。Hive 的安装依赖这些基础服务别嫌麻烦。2. MySQL 安装与初始化配置2.1 通过 apt 安装 MySQL 8.0Hive 需要用数据库来存元数据默认自带的是 Derby但那玩意儿只能用于最简单的测试生产环境几乎没人用。我建议直接用 MySQL 8.0把元数据库独立出来后续想看表结构、清理 session 都很方便。Ubuntu 22.04 的 apt 源里直接有 MySQL 8.0不需要额外添加仓库sudo apt update sudo apt install -y mysql-server mysql-client安装完成后MySQL 服务会自动启动。检查一下监听状态sudo systemctl status mysql sudo ss -tlnp | grep 3306这里的ss命令输出里有127.0.0.1:3306说明 MySQL 只监听了本机地址。因为 Hive 也在本机所以不需要改成0.0.0.0。如果后续想远程连 MySQL才需要改bind-address。2.2 MySQL root 密码配置与认证插件处理刚装完的 MySQL root 用户默认使用auth_socket插件认证也就是说在终端里执行sudo mysql可以直接进入不需要密码。我们要把它改成 Hive 能用的caching_sha2_password或mysql_native_password。sudo mysql进入 MySQL 命令行后执行ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY YourStrongPassword; FLUSH PRIVILEGES; EXIT;这里有个关键点Hive 3.1.2 自带的hive-site.xml默认连接 MySQL 时如果驱动版本太老会报Unable to load authentication plugin caching_sha2_password。所以我在 MySQL 8.0 里直接指定了mysql_native_password插件避免后续 Hive 初始化时报错。如果你坚持想用caching_sha2_password也可以但必须同时确保 MySQL 驱动mysql-connector-java的版本在 8.0.18 以上。我在 5.1.49 版本驱动上踩过这个坑报错信息完全摸不着头脑查了半天才定位到是认证插件版本不匹配。2.3 创建 Hive 专用数据库与账号这一步很重要不要用 root 账号跑 Hive后面出了问题不好控制权限。按下面的 SQL 在 MySQL 里创建独立账号CREATE DATABASE IF NOT EXISTS hive_metastore DEFAULT CHARACTER SET utf8mb4; CREATE USER IF NOT EXISTS hivelocalhost IDENTIFIED BY HivePass123; GRANT ALL PRIVILEGES ON hive_metastore.* TO hivelocalhost; FLUSH PRIVILEGES;为什么要用utf8mb4因为 Hive 元数据里可能存中文注释、分区字符等如果用了utf8遇到生僻字或某些特殊符号比如 Emoji会报Incorrect string value。utf8mb4是 MySQL 8.0 的默认字符集直接用它最稳妥。创建好之后用mysql -u hive -p验证账号能正常登录。这一步别跳过很多人的问题不是 Hive 配置错误而是 MySQL 账号本身没建对。3. Hive 安装包准备与核心配置3.1 解压安装与环境变量配置下载好的 Hive 包解压到/opt目录下sudo tar -zxvf apache-hive-3.1.2-bin.tar.gz -C /opt sudo mv /opt/apache-hive-3.1.2-bin /opt/hive sudo chown -R $USER:$USER /opt/hive把环境变量加到~/.bashrcexport HIVE_HOME/opt/hive export PATH$PATH:$HIVE_HOME/bin然后执行source ~/.bashrc。这里有一个很多人容易忽略的细节Hive 3.1.2 自带了一个旧的guava版本和 Hadoop 3.x 自带的guava版本冲突启动的时候会报NoSuchMethodError或者ClassNotFoundException。解决方法很简单直接用新版覆盖旧的# 先删掉 Hive 自带的旧版本 rm -rf /opt/hive/lib/guava-19.0.jar # 复制 Hadoop 自带的 guava版本通常在 27.0 以上 cp /opt/hadoop/share/hadoop/common/lib/guava-27.0-jre.jar /opt/hive/lib/具体文件名要以你 Hadoop 实际的 guava 版本为准用ls /opt/hadoop/share/hadoop/common/lib/ | grep guava查一下。3.2 hive-site.xml 核心参数详解Hive 装完后默认去$HIVE_HOME/conf目录找配置文件但目录里只有hive-default.xml.template模板文件。我建议不要直接改模板而是复制一份自定义配置cd /opt/hive/conf cp hive-default.xml.template hive-site.xml cp hive-env.sh.template hive-env.sh cp hive-log4j2.properties.template hive-log4j2.properties然后编辑hive-site.xml把以下几项配置到你的环境对应值。这个文件非常大搜索定位即可不用全看property namejavax.jdo.option.ConnectionURL/name valuejdbc:mysql://localhost:3306/hive_metastore?useSSLfalseamp;serverTimezoneAsia/Shanghaiamp;characterEncodingutf8mb4/value /property property namejavax.jdo.option.ConnectionDriverName/name valuecom.mysql.cj.jdbc.Driver/value /property property namejavax.jdo.option.ConnectionUserName/name valuehive/value /property property namejavax.jdo.option.ConnectionPassword/name valueHivePass123/value /property property namehive.metastore.warehouse.dir/name value/user/hive/warehouse/value /property property namehive.metastore.schema.verification/name valuefalse/value /property property namedatanucleus.schema.autoCreateAll/name valuetrue/value /property逐行解释一下ConnectionURL连接 MySQL 的 JDBC URL。useSSLfalse是因为本地连接不需要加密serverTimezoneAsia/Shanghai可以避免时区报错characterEncodingutf8mb4保证中文元数据不乱码。注意 XML 里的符号要写成amp;否则解析 XML 会报错。ConnectionDriverName这里填com.mysql.cj.jdbc.DriverMySQL 8.0 驱动用这个名字。如果你用的是 5.x 老驱动才写成com.mysql.jdbc.Driver。hive.metastore.warehouse.dirHive 表数据在 HDFS 上的存储根目录。这个目录最好和 Hadoop 的dfs.defaultFS一致否则会跑到file:///上。hive.metastore.schema.verification3.x 默认是true会严格检查元数据库 schema 版本第一次初始化时容易因为版本号对不上报错。先设为false等初始化成功后再改回true也可以。datanucleus.schema.autoCreateAll让 Hive 在初始化时自动建表。这个参数只在第一次初始化时有意义后面可以注释掉。3.3 MySQL Connector/J 驱动包放置Hive 连接 MySQL 必须有 JDBC 驱动包位置放在/opt/hive/lib目录下。驱动版本很关键我用的是mysql-connector-java-8.0.30.jar下载地址可以从 MySQL 官网或 Maven 中央仓库拿到。用 wget 拉取驱动包cd /opt/hive/lib wget https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.30/mysql-connector-java-8.0.30.jar下载完成后记得检查文件大小一般 2.5MB 左右。如果下载的是 0KB 或者文件特别小说明下载失败别急着继续。为什么非要 8.x 的驱动因为 MySQL 8.0 默认使用caching_sha2_password认证而 5.1.x 老驱动不支持这种新认证方式。如果你的 MySQL 用户是用mysql_native_password创建的用 5.1.49 老驱动也能跑通但总归不推荐。用 8.0.30 驱动最省心。4. Hive 元数据初始化与启动验证4.1 使用 schematool 初始化元数据库配置完hive-site.xml和驱动包之后先不要急着启动 Hive需要先初始化元数据库。Hive 3.x 提供了专门的命令/opt/hive/bin/schematool -dbType mysql -initSchema执行后终端会输出一堆日志只要最后出现schemaTool completed就说明初始化成功。这时候去 MySQL 里查一下会看到hive_metastore库里自动建了很多表SHOW TABLES FROM hive_metastore;应该能看到TBLS、SDS、COLUMNS_V2、DATABASE_PARAMS等表。看到这些表说明 Hive 已经把元数据的物理结构建好了接下来可以正常使用。如果初始化报了Exception in thread main MetaException先检查驱动包和 MySQL 账号。最常见的错误是Access denied for user hivelocalhost这种情况基本是 MySQL 账号密码错了或者没给对应库授权。4.2 启动 Hive CLI 并测试建表元数据库初始化成功之后直接输入hive就可以进入交互式命令行hive进入 Hive CLI 后依次执行以下语句CREATE DATABASE testdb; USE testdb; CREATE TABLE employee ( id INT, name STRING, salary FLOAT ) ROW FORMAT DELIMITED FIELDS TERMINATED BY \t; SHOW TABLES;如果建表成功说明 Hive 本身没问题。这时候你再回到 MySQL 里查一下SELECT * FROM hive_metastore.TBLS;能看到刚才创建的employee表记录说明 Hive 和 MySQL 的联动正常。Hive CLI 启动速度可能有点慢第一次加载要几十秒。如果超过两分钟没反应打开/opt/hive/conf/hive-log4j2.properties看看日志路径然后查看日志文件通常会在日志里看到具体的错误信息。4.3 HiveServer2 与 beeline 的启动验证CLI 能跑通之后建议再顺手把 HiveServer2 启动起来这样之后用 JDBC 连 Hive 更方便。后台启动命令hive --service hiveServer2 启动后确认端口 10000 在监听ss -tlnp | grep 10000然后用 beeline 客户端连接/opt/hive/bin/beeline -u jdbc:hive2://localhost:10000 -n hive这里如果报Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient大概率是 HiveServer2 启动时没有正确读到 Metastore 配置。检查hive-site.xml里hive.metastore.uris是否设置property namehive.metastore.uris/name valuethrift://localhost:9083/value /property使用 HiveServer2 有两种模式嵌入式 Metastore 和独立 Metastore。如果只是本机测试嵌入式就够了hive.metastore.uris可以不配。但如果你打算用 beeline 远程连接建议单独启动 metastore 服务hive --service metastore 然后再启动 hiveServer2这样两个服务各自独立排查问题更方便。5. 常见问题与排查技巧5.1 连接 MySQL 失败的典型报错这个是我遇到最多的一类问题汇总成表格方便对照报错关键信息原因解决办法Access denied for user hivelocalhostMySQL 账号密码错误或账号权限不足用正确密码重新授权检查GRANT语句Unable to load authentication plugin caching_sha2_passwordMySQL 8.0 默认认证插件与驱动不匹配将用户改为mysql_native_password或升级驱动到 8.0.xCommunications link failureMySQL 服务没启动或连接地址端口不对systemctl status mysql确认端口是 3306Unknown database hive_metastore数据库未创建执行CREATE DATABASE hive_metastore排查技巧先用命令行测试 MySQL 连接本身是否正常mysql -u hive -p -h localhost -P 3306 hive_metastoreMySQL 客户端能连上Hive 却连不上那问题一定出在 Hive 的 JDBC URL 或驱动包上。这种问题不要盯着 Hive 堆栈看往下层查会更快。5.2 初始化失败与权限问题schematool -initSchema报错时日志往往滚一大屏我建议直接搜索Caused by/opt/hive/bin/schematool -dbType mysql -initSchema 21 | grep Caused by看Caused by后面的异常定位根因。我遇到的几次情况分别是Permission deniedHive 写入/tmp/hive目录失败。因为 Hive 默认会把临时文件写到/tmp/hive如果/tmp没有写权限就会报Permission denied。解决办法是创建目录并授权sudo mkdir -p /tmp/hive sudo chown -R $USER:$USER /tmp/hiveSchema version mismatchhive-site.xml里hive.metastore.schema.verification设为true但 schema 版本和 Hive 3.1.2 不一致。先把该参数改成false再初始化。字符集不兼容初始化时如果发现 MySQL 里已经存在部分表但缺列通常是数据库字符集不一致。把所有hive_metastore库下表的字符集统一成utf8mb4或者直接删库重建。5.3 Java 内存溢出与 GC 问题Hive 跑 MR 任务时如果数据量稍微大一点容易报java.lang.OutOfMemoryError: Java heap space。这其实是 Hadoop 的 MapReduce 容器内存设置太小和 Hive 本身关系不大。我一般会调整 YARN 和 MapReduce 的内存配置!-- yarn-site.xml -- property nameyarn.nodemanager.resource.memory-mb/name value8192/value /property property nameyarn.scheduler.maximum-allocation-mb/name value4096/value /property !-- mapred-site.xml -- property namemapreduce.map.memory.mb/name value1024/value /property property namemapreduce.reduce.memory.mb/name value2048/value /property另外还要注意 Hive CLI 自身的内存。修改$HIVE_HOME/conf/hive-env.shexport HADOOP_HEAPSIZE2048 export HIVE_CLIENT_HEAPSIZE2048改完之后重启 HiveServer2 才会生效。5.4 beeline 无法连接 HiveServer2beeline 连接失败最常见的原因是 HiveServer2 启动时读取不到hive-site.xml。如果你是在某个目录下手动启动的 HiveServer2而配置文件不在$HIVE_HOME/conf下就会读不到。解决办法是在启动命令里显式指定配置路径hive --service hiveServer2 --hiveconf hive.server2.thrift.port10000或者直接用绝对路径方式/opt/hive/bin/hiveserver2还有个小坑HiveServer2 启动过程中会自动连接 Metastore如果 Metastore 没有启动它会在日志里反复重试。这时可以先用hive --service metastore 把 Metastore 单独启动再来启动 HiveServer2。5.5 guava 版本冲突的排查Hive 启动时如果遇到java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument之类的错误基本就是guava版本冲突了。Hive 3.1.2 自带的 guava 是 19.0而 Hadoop 3.x 用的是 27.0两者 API 有差异运行时类加载器加载到了旧版本就会报错。解决方案上面已经提到就是复制 Hadoop 的 guava 到 Hive 的 lib 目录同时把 Hive 自带的旧 guava 删掉。如果你不确定具体文件名可以用ls -l /opt/hive/lib/guava-*.jar查看。5.6 表名修改与常见 SQL 操作补充装好了 Hive有人可能会顺手搜“hive 修改表名 sql 语句”这里补充一个常见操作。Hive 修改表名和 MySQL 不太一样语法是ALTER TABLE old_table_name RENAME TO new_table_name;和 MySQL 的RENAME TABLE不同Hive 用ALTER TABLE ... RENAME TO而且在执行时不会自动更新元数据里的分区信息如果表有分区改名后可能需要用MSCK REPAIR TABLE修复元数据MSCK REPAIR TABLE new_table_name;这个命令会把 HDFS 上已有的分区信息同步到 Metastore省去手动添加分区的麻烦。6. 安装包获取与后续扩展思路6.1 安装包获取渠道整理整个过程中需要的安装包和驱动我按来源整理了一下资源获取方式备注Hive 3.1.2Apache 官网 archive 或国内镜像下载bin.tar.gz版本Hadoop 3.3.6Apache 官网或国内镜像伪分布式部署MySQL 8.0Ubuntu apt 源直接安装不是自己编译MySQL Connector/JMaven 中央仓库下载jar包JDK 8apt 源或 Oracle 官网版本不能高于 1.8如果你在下载 Hive 时发现 Apache 官网访问慢用镜像源解决。国内常见的镜像源都能用但注意下载后核对文件完整性md5sum apache-hive-3.1.2-bin.tar.gz也可以对比官方发布的.md5文件确认包没损坏。之前我遇到过一次 Hive 启动直接抛ClassNotFoundException查了半天最后发现是 tar 包解压时文件缺失重下一遍才解决。6.2 后续还能怎么扩展装完这套基础环境之后我的实际体会是Hive 3.1.2 本身还有不少可以折腾的空间比如把执行引擎从 MapReduce 换成 Tez跑个 TPC-DS 基准测试对比性能差异。给 HiveServer2 加上 LDAP 或自定义认证了解生产环境下的权限控制方式。把 Metastore 拆成独立服务并配置高可用模拟真实集群的部署模式。接入 SparkSQL对比同一份数据在 Hive 和 Spark 下的运行速度。这些扩展方向都能让这套环境发挥更大价值也不至于让安装过程白费。不过建议先把基础跑通再逐步深入。我在实际部署中最后悔的一件事就是最开始没把 MySQL 驱动版本和认证插件搞清楚导致初始化反复失败。如果你也遇到类似问题先回到 MySQL 连接这一层把mysql -u hive -p是否能登录验证清楚再回头看 Hive 配置能省掉一大半排查时间。另外所有环境变量改完之后记得source ~/.bashrc别在子 shell 里查了半天发现配置没生效。这套环境搭好后Hive 建表、跑 SQL、甚至后续接调度工具都能顺畅进行值得你花一个小时认真装一遍。