首页 / 资讯中心 / 文章详情

Hive快速入门:从零搭建安装部署环境,跑通建表查询全流程

Hive快速入门:从零搭建安装部署环境,跑通建表查询全流程 ★ FEATURED ARTICLE
排查了不少 Hive 入门教程之后你会发现一个规律真正劝退新手的往往不是 Hive 的 SQL而是安装部署阶段那一堆版本组合和环境变量。尤其当你按一篇老教程装完启动时却报出各种底层的 Java 依赖错误心态很难不崩。这一篇是 “Hive 快速入门系列” 的第二部分目标很明确用最短路径把 Hive 装起来跑通建库、建表、导入数据、查询这四条核心链路。全篇我会先讲清楚部署形态怎么选再给出一套可以直接照抄的安装步骤最后把平时最容易踩的坑集中列出来。无论你是在自己电脑上学习还是准备在一台测试服务器上搭环境这篇都适用。1. 开工之前先把 Hive 的定位和部署思路理清楚1.1 Hive 到底是什么适合哪类场景Hive 本质上是一个数据仓库工具它把 SQL 翻译成 MapReduce、Tez 或 Spark 作业然后在 Hadoop 集群上执行。对于刚接触大数据的朋友可以把它理解成一个“翻译官”你只负责写 SQL真正在 HDFS 上跑计算的脏活累活由底层引擎完成。这个特点决定了 Hive 适合的场景主要是离线 ETL、大规模数据统计分析以及那些不想写 Java 代码又想用 Hadoop 的团队。它不适合用来做实时查询一条 SQL 跑几秒甚至几分钟都很正常。入门阶段你不需要关注底层的运算引擎只需要把 Hive 当作一个“数据库”去操作即可而安装部署的最终目标就是让你能在命令行里敲出hive命令并执行 SQL。1.2 部署形态怎么选本地模式还是伪分布式Hive 的部署形态大体上有三种内嵌模式元数据保存在 Hive 自带的 Derby 数据库中无需单独安装数据库。本地模式元数据保存在独立的 MySQL 等数据库中但 Hive 服务和数据库在同一台机器上。完全分布式元数据库、Hive、Hadoop 分布在不同机器上。对于快速入门很多人会争论到底该用 Derby 还是 MySQL。我的建议是第一遍跑通流程直接用 Derby 就够了。它会少一个 MySQL 安装和 JDBC 驱动的步骤让你最快见到hive提示符。但你要意识到Derby 只适合单会话测试如果你同时开多个 hive 客户端很容易报锁表错误。所以如果条件允许建议学完这篇之后尽快迁移到 MySQL 元数据库。Hadoop 这边也不建议一开始就搞完整分布式集群。一台机器上部署伪分布式模式NameNode、DataNode、SecondaryNameNode 都在同一个进程组里足够学习 Hive 表与 HDFS 文件的关系了。本篇的默认路径就是“单机伪分布式 Hadoop Hive 内嵌 Derby”这也是最不容易把人劝退的组合。1.3 安装思路用最快路径建立起一个能跑能查的环境整体安装顺序可以用一句话概括先有 Java再有 Hadoop最后才能让 Hive 在上面跑。Hive 本身只是一个客户端工具它依赖 Hadoop 的 HDFS 存储和计算框架所以你的机器上必须先有 Hadoop 环境。别想着跳过 Hadoop 直接装 Hive哪怕最终你用本地文件系统临时顶替Hive 内部的存储目录也会通过 Hadoop 的接口访问。因此在正式解压 Hive 之前我要先帮你把 Java 和 Hadoop 的准备步骤走一遍。2. 环境准备先把 Java 和 Hadoop 这两个地基打好2.1 版本选型别在版本搭配上翻车Hive 安装部署失败的最高频原因就是 Java、Hadoop、Hive 三者版本不匹配。很多教程直接给出一个下载链接但链接过期后新手往往会自己去找最新版结果版本跨度太大启动时报错。目前我实测比较稳的搭配是JDK 8Hadoop 3.2.xHive 3.1.x如果你用的是 JDK 11 或更高版本Hive 3.1 的某些反射相关代码会报InaccessibleObjectException处理起来比较麻烦。所以入门阶段别追求新版JDK 8 是最省心的。Hadoop 3.2.x 与 Hive 3.1.x 的兼容性也经过了大量生产环境验证后续你如果切换 Tez 或 Spark 引擎也不会有太大的适配问题。2.2 安装 JDK 与 Hadoop三步完成基本环境第一步安装 JDK。我自己习惯把 JDK 装到/opt/java下面方便配置环境变量。tar -zxf jdk-8u202-linux-x64.tar.gz -C /opt/java/然后编辑/etc/profile追加内容export JAVA_HOME/opt/java/jdk1.8.0_202 export PATH$JAVA_HOME/bin:$PATH第二步安装 Hadoop。下载 Hadoop 3.2.x 的二进制包后解压tar -zxf hadoop-3.2.4.tar.gz -C /opt/ mv /opt/hadoop-3.2.4 /opt/hadoop接着配置/opt/hadoop/etc/hadoop/hadoop-env.sh里的JAVA_HOMEexport JAVA_HOME/opt/java/jdk1.8.0_202第三步配置 HDFS 相关文件。如果你的部署目标是伪分布式需要修改core-site.xml和hdfs-site.xml。core-site.xml添加configuration property namefs.defaultFS/name valuehdfs://localhost:9000/value /property property namehadoop.tmp.dir/name value/opt/hadoop/tmp/value /property /configurationhdfs-site.xml添加configuration property namedfs.replication/name value1/value /property property namedfs.namenode.name.dir/name valuefile:///opt/hadoop/tmp/name/value /property property namedfs.datanode.data.dir/name valuefile:///opt/hadoop/tmp/data/value /property /configuration注意hadoop.tmp.dir一定不要放在系统临时目录里否则每次重启系统进程数据会被清理掉NameNode 格式化后又会引起一连串麻烦。2.3 验证 Hadoop 与 HDFS 是否可用启动之前先格式化 NameNodehdfs namenode -format格式化只执行一次就好重复格式化会导致集群数据不一致。然后启动 HDFSstart-dfs.sh用jps检查进程如果能看到NameNode、DataNode、SecondaryNameNode三个进程说明 HDFS 已经起来了。接着在 HDFS 上创建 Hive 需要使用的目录hdfs dfs -mkdir -p /user/hive/warehouse hdfs dfs -mkdir -p /tmp hdfs dfs -chmod -R 750 /user/hive/warehouse hdfs dfs -chmod -R 750 /tmp这一步很多人会漏掉。其实 Hive 默认会自己创建 warehouse 目录但提前创建并设置好权限能避免后续因为当前用户没有写权限而报Permission denied。3. Hive 安装部署一步步把它跑起来3.1 下载解压与环境变量配置下载 hive 3.1.2 的二进制包解压到/opt下tar -zxf apache-hive-3.1.2-bin.tar.gz -C /opt/ mv /opt/apache-hive-3.1.2-bin /opt/hive然后编辑/etc/profile配置 Hive 环境变量export HIVE_HOME/opt/hive export PATH$HIVE_HOME/bin:$PATH接下来修改/opt/hive/conf/hive-env.sh。这个文件默认不存在需要从模板复制一份cp /opt/hive/conf/hive-env.sh.template /opt/hive/conf/hive-env.sh然后追加export JAVA_HOME/opt/java/jdk1.8.0_202 export HADOOP_HOME/opt/hadoop export HIVE_HOME/opt/hive这里我踩过一个很常见的坑只配了HIVE_HOME忘记了HADOOP_HOME导致 Hive 启动时找不到 Hadoop 的 classpath报错信息却指向 JVM 参数很误导人。3.2 初始化内嵌 Derby 元数据库Hive 默认的元数据库配置在hive-site.xml里但这个文件同样不是自带的需要手动创建。在/opt/hive/conf目录下新建hive-site.xml填入以下内容configuration property namejavax.jdo.option.ConnectionURL/name valuejdbc:derby:;databaseName/opt/hive/metastore_db;createtrue/value /property property namejavax.jdo.option.ConnectionDriverName/name valueorg.apache.derby.jdbc.EmbeddedDriver/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 /configuration然后执行初始化命令cd /opt/hive bin/schematool -initSchema -dbType derby看到Initialization script completed字样就说明元数据库初始化成功。此时/opt/hive目录下应该会生成metastore_db和derby.log。如果初始化过程中卡住或者表创建不完整多半是 Derby 的连接 URL 路径有问题检查databaseName指向的目录是否可写。3.3 启动 Hive CLI 并验证版本第一次启动 Hive直接执行hive正常情况下你会看到一堆日志输出最后进入hive交互式命令行。先敲一条最简单的命令验证show databases;能看到默认的default数据库说明 Hive 核心链路已经通了。这时候你再看 HDFS 里的/user/hive/warehouse会发现它被自动挂载成了 Hive 的表存储根目录。后续你在 Hive 里创建的每一个数据库都会在这个目录下形成一个子目录。3.4 从 HDFS 视角理解 Hive 的存储结构很多人学了 Hive 之后还是搞不清表和数据到底存到哪里。其实 Hive 本身不存数据它只维护一份“表结构 数据路径”的元数据真正的数据文件全在 HDFS 上。比如你在default库里创建一张表student数据在 HDFS 上的路径就是/user/hive/warehouse/student。如果创建了一个demo数据库再在库中建表路径就是/user/hive/warehouse/demo.db/table_name。这个视角很重要。因为以后你写LOAD DATA INPATH本质上是把 HDFS 上的文件移动到表目录里写LOAD DATA LOCAL INPATH则是把 Linux 本地文件上传到表目录里。理解了这个映射关系排查数据加载问题就会轻松很多。4. 基本操作实战建库、建表、导入和查询4.1 用 beeline 还是 hive CLIHive 3.x 官方推荐使用 beeline它是一个基于 HiveServer2 的 JDBC 客户端。使用时需要先把 HiveServer2 服务启动起来hive --service metastore hive --service hiveserver2 然后通过 beeline 连接beeline -u jdbc:hive2://localhost:10000/default -n hadoopbeeline 更接近真实生产环境的使用方式但启动服务的过程对新手来说又多了一层干扰。所以这篇快速入门里我建议先用旧的hiveCLI 把 SQL 跑通。等熟悉了基本操作再尝试 HiveServer2 beeline。两种工具的 SQL 体系完全一致不存在学一遍就浪费的问题。4.2 数据库与内部表第一次建表就避开几个坑先创建一个自己的数据库避免所有测试表都堆在default库里CREATE DATABASE IF NOT EXISTS demo; USE demo;然后创建一张内部表CREATE TABLE IF NOT EXISTS student( id INT, name STRING, score FLOAT ) ROW FORMAT DELIMITED FIELDS TERMINATED BY \t STORED AS TEXTFILE;这里有几个要点需要专门说明一下。内部表managed table的特点是Hive 拥有表的完全生命周期当你DROP TABLE时表目录里的数据会一并删除。所以测试数据可以随便建但生产环境里的重要数据表尽量考虑后面要讲的外部表。FIELDS TERMINATED BY \t表示数据文件中的列分隔符为制表符。如果你导入的是 CSV把这里改成,就行。改这一项之前一定要确认源文件的分隔符到底是什么否则后面查询出来的字段会全部串位。STORED AS TEXTFILE是最普通的文本文件格式入门阶段用它足够。后续如果数据量大、查询性能有要求再考虑 ORC 或 Parquet。4.3 加载本地文件和 HDFS 文件查询验证我习惯先手工制造一个测试数据文件用来验证整个链路。准备一个student.txt内容如下1001 张三 88.5 1002 李四 93.0 1003 王五 77.5把文件放到 Linux 本机某个目录然后执行LOAD DATA LOCAL INPATH /tmp/student.txt INTO TABLE student;执行成功后再用SELECT验证SELECT * FROM student; SELECT name, score FROM student WHERE score 80 ORDER BY score DESC;到这里你会发现Hive 的操作体验和 MySQL 非常接近。但有一个概念需要扭转过来Hive 的查询会触发一个 MapReduce/YARN 作业响应速度并不快这是大数据离线分析工具的正常表现不是装错了。接着我们看看怎样加载 HDFS 上的文件。先把文件传到 HDFShdfs dfs -put /tmp/student.txt /tmp/student_hdfs.txt然后在 Hive 里执行LOAD DATA INPATH /tmp/student_hdfs.txt INTO TABLE student;注意这个INPATH操作会把 HDFS 上的文件从/tmp移动到表目录等于 HDFS 上的原文件会消失。很多人第一次都会惊讶这件事其实这正是 Hive 的语义加载数据就是“移动数据”。如果不想移动原始文件共享原始文件给多个表应该用外部表。4.4 外部表场景补充什么时候用 EXTERNAL外部表与内部表最大的区别就是 Hive 不会管理 HDFS 中的数据文件。创建外部表时你需要指定一个LOCATION表 DROP 后数据文件依然保留。继续用学生数据举个例子CREATE EXTERNAL TABLE IF NOT EXISTS student_ext( id INT, name STRING, score FLOAT ) ROW FORMAT DELIMITED FIELDS TERMINATED BY \t STORED AS TEXTFILE LOCATION /user/hive/external/student;然后把数据文件直接放到 HDFS 的/user/hive/external/student目录下Hive 就能直接查hdfs dfs -mkdir -p /user/hive/external/student hdfs dfs -put /tmp/student.txt /user/hive/external/student/外部表的适用场景非常明确当数据文件不属于 Hive 独享或者你希望删除表时保留底层数据就必须用外部表。比如日志文件、数据团队共享的公共数据集都属于典型的 external 场景。入门阶段把这个区别记住比记住几十条 SQL 语法更有价值。5. 常见问题与排查技巧实录5.1 启动闪退或日志不输出很多人执行hive命令后终端没有任何输出就直接回到 shell 提示符。这种情况优先检查/tmp/root/hive.log或$HIVE_HOME/logs/hive.log。最常见原因是元数据库初始化时 Derby 的文件锁没有释放。注意Derby 单机模式不支持多个会话同时访问如果同时开了多个hiveCLI第二个客户端就会报锁表错误。解决办法是等第一个退出后再启动或者直接切到 MySQL 元数据库。如果日志里有类似ClassNotFound或NoSuchMethodError的信息通常是依赖版本冲突。Hive 自带的 lib 目录里有guava包Hadoop 的 lib 目录里也有guava两者的版本必须保持一致。常见做法是把 Hive 里的guava-*.jar换成 Hadoop 内置的版本。这个坑在你混用不同 Hadoop 版本时尤其容易出现。5.2 NameNode 或 DataNode 起不来这套组合安装里Hadoop 的进程问题占了至少半数。我见过太多新手在格式化 NameNode 之后因为 DataNode 的clusterID不一致导致 DataNode 进程反复退出。解决办法是先停掉所有 Hadoop 进程删除 HDFS 数据目录里的name和data目录然后重新格式化 NameNodestop-dfs.sh rm -rf /opt/hadoop/tmp/name /opt/hadoop/tmp/data hdfs namenode -format start-dfs.sh需要注意这样做会清掉 HDFS 里的所有测试数据。如果只是入门可以接受如果已经有有价值的数据千万不要轻易重格式化。5.3 常见问题速查表现象可能原因快速处理方式hive命令找不到HIVE_HOME 或 PATH 未配置执行echo $HIVE_HOME检查并重新 source 配置文件schematool初始化报错依赖包冲突或 Derby 目录不可写检查/opt/hive属主重新执行初始化前删除旧metastore_dbPermission deniedHDFS warehouse 目录权限不足执行hdfs dfs -chmod -R 750 /user/hive/warehouseInvalid URL或连接异常hive-site.xml 中 JDBC 参数错误确认ConnectionURL里的databaseName是绝对路径查询结果全为 NULL建表分隔符与文件实际分隔符不一致用cat -A检查文件是否包含^I制表符堆内存溢出Hive 默认堆内存太小在hive-env.sh中设置export HADOOP_HEAPSIZE2048这张表里的每一项我都曾在实际环境里遇到过。尤其是“查询结果全为 NULL”这个问题看起来像是数据没导入成功实际上只是分隔符不匹配。Hive 把整行内容都当作一个字段自然就无法解析出列值了。5.4 一点关于生产环境的额外建议如果你用这套流程只是为了学习和实验Derby 完全够用。但假如你打算继续深入 Hive 的权限管理、多客户端并发操作或者做一些基本性能测试请尽早把元数据库迁移到 MySQL。迁移本身并不复杂核心就是改变hive-site.xml里的连接配置加上 MySQL 的 JDBC 驱动然后重新执行schematool。这一步看似多装了东西却能让 Hive 的功能真正完整起来。我给不少零基础的同学做技术预研时都会让他们先用 Derby 跑通一次“建表-导入-查询”全流程。获得了正反馈之后再回头去理解元数据、HiveServer2、部署架构这些概念比一上来就先把集群搭得严丝合缝要有效得多。安装部署这件事成功跑通一次比读十篇原理文章都重要。先有一个能用再说别的这才是最快的学习路径。最后分享一个小技巧整个过程里多拍“快照”少复制粘贴。如果你用的是虚拟机或云主机在 Java、Hadoop、Hive 每个阶段部署完成并验证通过后都打一个快照。这样后面实验搞坏了直接回滚到上一个可用状态不用重头开始。这比任何排错技巧都节省时间。
阅读完成 · 觉得有帮助?
咨询建站