ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Hive 3.1.2 安装配置实战:基于 MySQL 元数据库的完整指南

Hive 3.1.2 安装配置实战:基于 MySQL 元数据库的完整指南 1. 先说清楚Hive 到底是干嘛的以及为什么非要用 MySQL在讲安装步骤之前我得先花点时间把 Hive 的本质讲透。因为大多数新手装 Hive 装到一半就放弃根本原因不是命令敲错而是压根不知道自己在装什么、为什么这么装。Hive 的本质就是一个翻译官。它把你想写的 SQL 语句翻译成 MapReduce 或 Spark 任务丢给底层的 Hadoop 集群去执行。也就是说Hive 本身不存数据数据在 HDFS 上Hive 只是帮你把 SQL 变成分布式计算任务顺便把“哪张表对应哪个 HDFS 目录、表有哪些字段、字段是什么类型”这类元数据信息记录下来。这些元数据存哪里默认存在 Hive 自带的 Derby 数据库里但 Derby 性能差、不支持并发生产环境几乎没人用所以大家都换成 MySQL。这次教程选择 Hive 3.1.2是因为这个版本是目前社区使用最广、稳定性最好的 3.x 版本之一。很多公司的老集群还在用它网上能搜到的排错经验也最丰富遇到问题基本都有现成的解决方案。如果你以后要装 Hive 4.x流程也基本一致只是个别配置项有变化。还有一点必须提前说明Hive 依赖于 Hadoop 环境不是独立运行的程序。所以本篇教程默认你已经在 Ubuntu 上装好了 Hadoop并且能正常启动 HDFS 和 YARN。如果你还没装 Hadoop建议先去把 Hadoop 2.x 或 3.x 搭好再回来折腾 Hive。我见过太多人跳过了 Hadoop 直接装 Hive然后一脸疑惑地问为什么启动报错这类问题基本都是环境没准备好。这篇教程适合谁适合已经在 Ubuntu 上装过 Hadoop、但是卡在 Hive 安装这一步的初学者也适合第一次接触大数据组件、想完整走一遍环境搭建流程的在校学生。我会把每个步骤“为什么要这么做”也一并讲清楚而不是只丢给你一串命令。2. 安装前的三个关键决策2.1 版本匹配Hive 与 Hadoop、JDK 的兼容关系很多人在装 Hive 时报错查了半天发现是版本不兼容。这里我直接给你一张对照表省得自己查组件推荐版本说明Ubuntu18.04 / 20.04 / 22.04我实测 20.04 和 22.04 都没问题JDK1.88u202 及以后Hive 3.x 不支持 Java 11 及以上切记Hadoop2.7 ~ 3.3我本次使用 3.1.3与 Hive 3.1.2 配合良好MySQL5.7 / 8.0推荐 8.0但驱动要用 8.0 专用驱动别用老版本Hive3.1.2本篇主角这里特别强调一下 JDK 的问题。Hive 3.1.2 官方文档里写的是支持 Java 8 和 Java 11但我实际测下来 Java 11 在启动时偶尔会出现莫名的反射报错排查起来非常痛苦。所以别纠结直接用 Java 8 最稳妥。Hadoop 和 Hive 的版本匹配也值得注意。Hive 3.1.2 源码编译时是基于 Hadoop 2.7.7 的但它对 Hadoop 3.x 的兼容性也做得很好。我身边有人用 Hadoop 3.3.4 Hive 3.1.2 跑了半年没出问题也有人用 Hadoop 2.7.7 配 Hive 3.1.2 照样稳。重点是 Guava 版本要处理对这个坑我后面单独讲。2.2 元数据库选型Derby 与 MySQL 的本质区别Hive 默认内嵌的 Derby 数据库适合刚入门时快速体验一下 Hive 的 CLI。但只要你稍微用多一点Derby 的问题就暴露了不支持并发访问多个客户端同时连 Hive 时会直接报错每次启动 Hive 都在当前目录生成一个 metastore_db 目录换个目录启动就找不到之前的元数据性能差表的数量一多查询元数据明显变慢所以生产环境和正规的学习环境无一例外都选 MySQL。MySQL 作为独立的外部元数据库需要手动配置 metastore 连接信息Hive 启动时通过 JDBC 连接 MySQL读写所有表结构、分区信息、列类型等元数据。这也是本教程把 MySQL 安装方法一并讲清楚的原因——它是 Hive 的半个底座。顺带提一句MySQL 在这里的架构定位Hive 客户端CLI 或 JDBC 驱动访问 HiveServer2HiveServer2 再通过 Metastore 服务读写 MySQL 中的元数据。所以 MySQL 本身要允许远程连接并且要建好对应的数据库和账号。2.3 安装包下载方案官网直接下还是用镜像加速Hive 的安装包官方下载地址在 Apache 镜像站但国内访问速度有时候不稳定。我推荐直接用清华镜像或华为云镜像速度快还不容易断。MySQL 的安装更特殊一点现在推荐直接用 MySQL 官方的 APT 仓库安装而不是自己去下载 .deb 包因为 APT 仓库会自动帮你处理依赖关系省掉很多麻烦。下载 Hive 时一定要下载apache-hive-3.1.2-bin.tar.gz这个二进制版本包千万不要下源码包src.tar.gz。源码包需要自己编译过程麻烦不说还容易因为依赖版本问题失败。MySQL 则基于 8.0 版本安装完成后记住 root 初始密码后面会用到。3. MySQL 安装配置全流程3.1 通过官方 APT 仓库安装 MySQL 8.0这一节是给还没装 MySQL 的读者准备的。如果你机器上已经有能用的 MySQL 5.7 或 8.0可以直接跳到 3.3 节看如何建库授权不必重新装一遍。先把仓库加进来# 下载 MySQL APT 仓库配置包 wget https://dev.mysql.com/get/mysql-apt-config_0.8.24-1_all.deb # 安装仓库配置包过程中会弹出图形界面直接选择 OK 即可 sudo dpkg -i mysql-apt-config_0.8.24-1_all.deb # 更新软件源 sudo apt update安装完仓库配置包后MySQL 8.0 的安装就变得非常简单sudo apt install mysql-server安装过程中会弹窗要求设置 root 密码。这里要提醒一句MySQL 8.0 的默认认证插件是 caching_sha2_password你设置的密码复杂度必须满足要求否则会提示密码太弱。建议直接设置一个大小写字母加数字的组合密码避免后续节外生枝。安装完成后验证一下 MySQL 服务状态systemctl status mysql如果输出显示 active (running)说明 MySQL 已经起来了。如果没起来执行sudo systemctl start mysql手动启动然后设置开机自启sudo systemctl enable mysql3.2 初始化安全设置与远程连接授权刚装好的 MySQL 其实还处于“裸奔”状态需要做基本的安全加固。执行sudo mysql_secure_installation按照提示依次操作设置密码强度校验策略、移除匿名用户、禁止 root 远程登录、删除 test 数据库、重新加载权限表。这些选项全部选 YES 就行没有坑。接下来最关键的一步创建 Hive 专用的数据库和账号。这一步很多人会忽略直接用 root 账号去连 Hive 的 metastore这在小规模测试环境勉强能跑但存在两个问题一是权限边界不清晰二是如果 MySQL root 使用 caching_sha2_password 认证插件Hive 连接时可能需要额外处理 SSL 或密码插件兼容。建议直接建独立账号。-- 登录 MySQL mysql -u root -p -- 创建 Hive 元数据库 CREATE DATABASE hive_metastore CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; -- 创建专用账号允许任意主机连接 CREATE USER hive% IDENTIFIED BY Hive123456; -- 授权 GRANT ALL PRIVILEGES ON hive_metastore.* TO hive%; FLUSH PRIVILEGES;注意字符集一定用 utf8mb4不要用默认的 latin1。如果建库时用了 latin1后面 Hive 表名或注释里有中文时查出来全是乱码排查起来很折腾。MySQL 8.0 默认绑定地址是 127.0.0.1也就是只允许本机连接。如果你的 Hive 和 MySQL 不在同一台机器需要修改配置文件允许外部访问sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf找到bind-address 127.0.0.1改成bind-address 0.0.0.0保存后重启sudo systemctl restart mysql3.3 下载 MySQL JDBC 驱动并放置到 Hive 目录这一步是连接 MySQL 和 Hive 的桥梁漏掉必出错。Hive 3.1.2 与 MySQL 8.0 连接需要mysql-connector-java8.x 版本的驱动包。注意 8.x 驱动和 5.x 驱动的类名不同8.x 是com.mysql.cj.jdbc.Driver5.x 是com.mysql.jdbc.Driver用错了连不上。下载方式# 下载 8.0.26 版本驱动其他 8.x 版本也行 wget https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.26/mysql-connector-java-8.0.26.jar # 放到 Hive 的 lib 目录等 Hive 解压之后执行或者先建好目录 mkdir -p /opt/hive/lib cp mysql-connector-java-8.0.26.jar /opt/hive/lib/如果你是通过 APT 仓库装的 MySQL有时候系统会自带一个 Java 连接器包但版本通常是 5.1.x和 MySQL 8.0 连接有兼容性问题。所以别图省事一定要手动下载 8.x 驱动。4. Hive 3.1.2 安装配置完整实操4.1 下载解压与环境变量配置我习惯把软件统一安装到/opt目录下这样目录结构清晰也方便多版本切换。执行以下命令# 进入 /opt 目录 cd /opt # 下载 Hive 3.1.2 二进制包用清华镜像加速 wget https://mirrors.tuna.tsinghua.edu.cn/apache/hive/hive-3.1.2/apache-hive-3.1.2-bin.tar.gz # 解压 tar -zxvf apache-hive-3.1.2-bin.tar.gz # 重命名方便后续配置纯个人习惯可跳过 mv apache-hive-3.1.2-bin hive-3.1.2解压后验证一下目录结构ls /opt/hive-3.1.2你会看到 bin、conf、lib、scripts 等目录。其中 bin 目录存放 Hive 的可执行脚本conf 目录存放配置文件lib 目录存放依赖 jar 包。接下来配置环境变量。编辑~/.bashrc或其他你常用的 shell 配置文件vim ~/.bashrc在文件末尾追加export HIVE_HOME/opt/hive-3.1.2 export PATH$PATH:$HIVE_HOME/bin执行source ~/.bashrc使配置生效然后验证hive --version能输出版本信息就说明环境变量没问题。4.2 创建 hive-site.xml 并填写核心配置Hive 安装包默认没有hive-site.xml文件只有hive-default.xml.template模板。我们的做法是把模板复制一份基于它来修改。但这里有个很坑的地方默认模板里的配置项非常多直接拿去用会有很多 item 为空的配置项加起来有三四百行看着就头大。我的做法是直接新建一个干净的hive-site.xml只写必要的核心配置项这样排错时一眼能看到底不容易被无关配置干扰。等以后需要调优时再往里面加配置项。cd /opt/hive-3.1.2/conf touch hive-site.xml vim hive-site.xml填入以下内容?xml version1.0 encodingUTF-8? configuration property namejavax.jdo.option.ConnectionURL/name valuejdbc:mysql://localhost:3306/hive_metastore?createDatabaseIfNotExisttrueamp;useSSLfalseamp;serverTimezoneAsia/Shanghai/value description连接 MySQL 的 JDBC 地址/description /property property namejavax.jdo.option.ConnectionDriverName/name valuecom.mysql.cj.jdbc.Driver/value descriptionMySQL 8.0 驱动类名/description /property property namejavax.jdo.option.ConnectionUserName/name valuehive/value /property property namejavax.jdo.option.ConnectionPassword/name valueHive123456/value /property property namehive.metastore.warehouse.dir/name value/user/hive/warehouse/value description数据仓库目录在 HDFS 上/description /property property namehive.metastore.schema.verification/name valuefalse/value /property property namedatanucleus.schema.autoCreateAll/name valuetrue/value /property /configuration关于配置项有几点要解释一下javax.jdo.option.ConnectionURL中的serverTimezoneAsia/Shanghai必须加。MySQL 8.0 和 JDBC 驱动对时区敏感不加的话连接时可能报The server time zone value CST is unrecognized错误。如果你在国内服务器时区就是北京时间填Asia/Shanghai没问题。hive.metastore.schema.verification和datanucleus.schema.autoCreateAll这两个配置项是配套使用的。前者设为 false 表示跳过 JDO schema 版本校验后者设为 true 表示让 Hive 自动在 MySQL 中创建元数据表。初始化完成后建议把autoCreateAll改为 false 或直接删掉避免每次启动都检查表结构拖慢启动速度。4.3 处理 Guava 版本冲突这是 Hive 安装中踩坑率最高的一步必须单独拿出来讲。Hadoop 3.x 自带的 Guava 版本通常是 27.0而 Hive 3.1.2 自带的是 19.0。两个版本不一致会导致 Hive 启动时报java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument解决方法很简单保留高版本的 Guava删掉低版本的。具体操作# 查看 Hadoop 的 Guava 版本 ls /opt/hadoop-3.1.3/share/hadoop/common/lib/ | grep guava # 查看 Hive 的 Guava 版本 ls /opt/hive-3.1.2/lib/ | grep guava删掉 Hive lib 目录下版本较低的那个然后拷贝 Hadoop 高版本进来# 示例Hadoop 是 guava-27.0-jre.jarHive 是 guava-19.0.jar rm /opt/hive-3.1.2/lib/guava-19.0.jar cp /opt/hadoop-3.1.3/share/hadoop/common/lib/guava-27.0-jre.jar /opt/hive-3.1.2/lib/这里要特别提醒删除之前想清楚别把 Hive lib 里唯一一个 guava 给删没了。操作之前先确认 Hadoop 那边有高版本可以拷贝过来。4.4 初始化元数据库 schema配置文件写好了驱动包也放到位了现在执行初始化。这一步会在 MySQL 的hive_metastore数据库里创建大量元数据表version、tbls、cols 等。/opt/hive-3.1.2/bin/schematool -dbType mysql -initSchema执行过程会刷一堆日志看到schemaTool completed字样就说明成功了。这时候去 MySQL 里看一眼USE hive_metastore; SHOW TABLES;能看到几十张以BUCKETING_COLS、CDS、COLUMNS_V2等命名的表说明 schema 初始化成功。如果初始化报错最常遇到的问题是连接 MySQL 失败。排查步骤先确认 MySQL 服务在跑systemctl status mysql再确认 JDBC 驱动是否真的放在了 Hive 的 lib 目录下然后检查 ConnectionURL 里填的用户名密码是否正确。还有一点容易被忽略如果 MySQL 8.0 的认证插件是 caching_sha2_password而你的连接池特别老可能要在ConnectionURL里追加allowPublicKeyRetrievaltrue参数。4.5 启动 Hive 并验证功能元数据初始化完成后理论上就可以启动 Hive 了。先保证 Hadoop 集群在运行start-dfs.sh start-yarn.sh然后直接启动 Hive CLIhive进入hive交互界面后执行以下语句验证CREATE DATABASE test_db; USE test_db; CREATE TABLE test_table (id INT, name STRING); INSERT INTO test_table VALUES (1, hive); SELECT * FROM test_table;执行INSERT INTO时你可能会看到一堆 MapReduce 日志这说明 Hive 确实在把 SQL 翻译成了分布式任务。如果一切正常最后一条SELECT会返回一行数据1 hive。这里额外多说一句Hive 3.x 之后推荐用 Beeline 连接 HiveServer2 使用因为 Hive CLI 在新版本里已经标记为 deprecated。但初学阶段先用hive命令体验整个过程最直观后面再切到 Beeline 也不迟。启动 HiveServer2 的命令nohup /opt/hive-3.1.2/bin/hive --service metastore nohup /opt/hive-3.1.2/bin/hive --service hiveserver2 然后用 Beeline 连接/opt/hive-3.1.2/bin/beeline -u jdbc:hive2://localhost:10000 -n hive_user如果你的 Ubuntu 配置里没有 hive_user 这个系统账号可以随便填一个存在的用户名默认 HiveServer2 不做严格认证。5. 常见报错与排查技巧5.1 连接类问题MySQL 连不上、时区报错、权限拒绝这一类是装 Hive 时遇到频率最高的问题我直接整理成速查表报错信息原因解决办法Communications link failureMySQL 没启动或 bind-address 限制确认 MySQL 服务状态改绑定地址为 0.0.0.0The server time zone value CST is unrecognizedJDBC 时区未配置ConnectionURL 加serverTimezoneAsia/ShanghaiAccess denied for user hivelocalhost密码错误或账号权限不足检查用户名密码执行 GRANT ALL 后 FLUSH PRIVILEGESPublic Key Retrieval is not allowedMySQL 8.0 caching_sha2_password 插件ConnectionURL 加allowPublicKeyRetrievaltrue和useSSLfalse最后那个 Public Key Retrieval 问题是我自己安装时踩到过最莫名其妙的一个坑。因为我的 MySQL 8.0 默认用 caching_sha2_password 认证而 JDBC 驱动出于安全策略拒绝无加密地获取公钥导致连接失败。当时以为是密码错排查了很久才发现要加这个参数。5.2 Guava 版本冲突、JDO 初始化失败等典型错误除了连接问题初始化阶段和启动阶段还有几个高频报错Guava NoSuchMethodError这个我在 4.3 已经讲过属于 Hadoop 与 Hive 依赖版本冲突解决方式就是统一版本。这个报错的诡异之处在于有时候刚开始是好的跑了几个小时后突然报错也是 Guava 版本问题导致的。所以一次配好后不要轻易升级或降级任何组件。metaStore schema 初始化失败报错信息里通常会包含 exception 详情可能是 MySQL 权限不足也可能是javax.jdo.option.ConnectionURL里符号没有转义。在 XML 配置里必须写成amp;很多人在这里看漏了。Permission denied: userxxx, accessEXECUTE这个不是 Hive 本身的问题是 HDFS 权限不够。Hive 默认以当前 Linux 用户的身份访问 HDFS而这个用户在 HDFS 上没有user/hive/warehouse目录的读写权限。解决方式hdfs dfs -mkdir -p /user/hive/warehouse hdfs dfs -chmod -R 750 /user/hive/warehouse sudo -u hdfs hdfs dfs -chown hive /user/hive/warehouse注意把命令里的hive换成你的实际用户名。5.3 WSL 环境下装 Hive 的特殊注意事项这次热词里有大量 WSL 相关的搜索说明很多读者其实是在 Windows 的 WSL 里跑 Ubuntu。如果你是在 WSL 下安装有几个额外的坑要提醒WSL 默认不直接支持 systemd所以systemctl status mysql这类命令可能不能直接生效。解决方式是使用service mysql start来启动 MySQL效果一样。WSL 的文件系统 I/O 性能比原生 Linux 慢启动 Hadoop 和 Hive 时可能需要多等一会儿。初始化 schema 时如果超时可以重新执行一次通常第二次就能成功。还有一个比较大的坑WSL 的 IP 会随着每次重启变化。如果你在 Windows 宿主机上用 Navicat 之类工具连接 WSL 里的 MySQLIP 变了就连不上。建议用localhost而不是具体 IP 连接或者开启 WSL 的 localhost 转发特性。实际上 WSL2 默认就支持 localhost 转发Windows 宿主机上直接连 localhost 3306 就能访问 WSL 里的 MySQL。6. 装完之后怎么验证环境没问题Hive 装好后不只是能建表就万事大吉。我建议按下面的顺序做一轮完整的冒烟测试确保环境真的可用测试一Hive 命令行基本操作-- 创建一个业务表 CREATE TABLE employee ( id INT, name STRING, salary DOUBLE ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ; -- 加载本地数据 LOAD DATA LOCAL INPATH /tmp/employee.txt INTO TABLE employee; -- 查询验证 SELECT COUNT(*) FROM employee;这一步验证的是 Hive 到 HDFS 的读写链路。如果 LOAD 报错检查/tmp/employee.txt是否存在、格式是否符合FIELDS TERMINATED BY指定的分隔符。测试二HiveServer2 连接beeline -u jdbc:hive2://localhost:10000/default -n your_name执行SHOW DATABASES;如果返回default和其他你建的库说明 HiveServer2 正常。这里容易遇到端口不通的问题可以用ss -tlnp | grep 10000确认服务是否在监听。测试三常用 Hive SQL 语法练习装完之后顺手把热词里提到的两个常用功能试一遍一个是修改表名一个是行转列和列转行。因为这两个操作是日常最常用的刚装好环境正好用它们验证-- 修改表名 ALTER TABLE employee RENAME TO emp; -- 行转列collect_list concat SELECT dept, CONCAT_WS(,, COLLECT_LIST(name)) AS emp_names FROM emp GROUP BY dept; -- 列转行lateral view explode SELECT dept, single_name FROM emp LATERAL VIEW EXPLODE(SPLIT(emp_names, ,)) t AS single_name;跑通这三个示例说明你的 Hive 安装基本没有大问题了。测试四YARN 资源验证在 Hive 执行INSERT或SELECT COUNT(*)时去 YARN 的 Web UI默认 8088 端口看是否有 Application 在运行。如果能看到作业状态从 RUNNING 变成 SUCCEEDED说明整个 Hadoop Hive 链路是通的。7. 一些经验之谈目录规划、快照备份和后置运维最后这部分聊聊那些“教程之外”的东西。这些经验是我踩了好几次坑之后总结出来的虽然不直接影响安装成败但能让你后续用得更顺。关于目录规划不要把所有东西都丢在/opt一个目录下更不要图方便直接把 Hadoop 和 Hive 解压到 home 目录。我建议统一放在/opt/module/下面比如/opt/module/hadoop-3.1.3、/opt/module/hive-3.1.2。再在/opt/module下建一个data目录存放下载的安装包和驱动这样后续清理起来非常方便。关于快照备份如果你用的是 VMware 虚拟机或云主机在 MySQL 安装完成、Hive 初始化成功这两个节点各打一个快照。为什么因为后续配置调优可能把环境搞坏有快照可以秒回滚不用从零开始装。我在刚学 Hive 的时期最多一天恢复了三次快照。避免重复工作这是最低成本的保险。关于 Hive 的日常运维Hive 说到底是跑在 Hadoop 之上的所以日常维护的重点不是 Hive 本身而是底层的 HDFS 空间和 YARN 资源。你要经常留意 HDFS 使用率hdfs dfsadmin -report如果 HDFS 空间不足表的数据写入就会异常报错。另外 Hive 的元数据备份其实就是备份 MySQL 里的hive_metastore库建议写个 crontab 定时任务每天凌晨用 mysqldump 备份一次mysqldump -u hive -pHive123456 hive_metastore /backup/hive_metastore_$(date %Y%m%d).sql数据量小的时候元数据备份恢复是一件特别省心的事情。万一误删了表找到对应日期的备份文件把库恢复回去就能找回所有元数据。最后再分享一个小技巧Hive 启动时日志输出的地方其实藏得很深。当你启动失败但又没看到具体报错时先去/tmp/hive/目录下看日志。Hive 会把运行日志写到/tmp/当前用户名/hive.log里这才是排查问题的第一手材料。很多新手卡住的时候看半天命令行日志也没找到关键错误其实真正的 exception 都沉在 hive.log 里。装完这套环境你等于打通了大数据离线计算的第一道关卡。后面不管是玩 Spark SQL、Hive 调优还是数据仓库建模都是在今天装好的这套基础上延展。耐心把每一步做扎实这个环境至少够你折腾大半年。
返回列表