0

0

如何 debug Hive 源码,知其然知其所以然

看不見的法師

看不見的法師

发布时间:2025-09-06 09:13:32

|

971人浏览过

|

来源于php中文网

原创

在最近的出差过程中,客户现场的 hiveserver 长时间不可用,查看 cm 的监控发现,hiveserver 的内存在一特定时刻急剧增加,同时 jvm 开始进行垃圾回收(gc),每次 gc 长达一分钟,导致 hiveserver 在很长一段时间内无法使用。

查看了 HiveServer 日志,发现内存暴涨的时间点上,执行了一个简单的 SQL 查询:

select count(1) from table
,这个表有超过 2 万个分区,并且这个查询被多次执行。

然而,我一直无法解释这样简单的 SQL 查询是如何执行的,以及 MapReduce 的哪个阶段产生了哪些对象,占用了 HiveServer 的内存。

(因此被客户鄙视了,囧!)

这个问题其实有两种解决方案,可以同时进行:

一种方法是将 HiveServer 在那个时刻的内存 dump 下来,分析其中究竟是什么内容;但这样无法看到具体的执行流程;另一种方法是下载 Hive 源码,直接进行 Debug 来跟踪执行过程,弄清楚之后,就可以解释中间的过程了。本文正是为 debug Hive 源码准备的环境。

一、服务器环境准备

我使用的是 VirtualBox,操作系统为 CentOS 7。

配置 hosts:

安装必要的包:

yum install -y which dos2unix

二、Hadoop Standalone 环境搭建

下载一个 Hadoop 发布包,地址是:

https://www.php.cn/link/83c706bcd62987cfd028da72db0f7f2c

下载这个文件:

hadoop-2.7.7.tar.gz

上传到服务器,并解压缩到本地,我的目录是

/my2/hadoop

配置环境变量:

vi /etc/profile

追加:

JAVA_HOME=/usr/local/jdk1.8.0_131
HADOOP_HOME=/my2/hadoop
export PATH=$JAVA_HOME/bin:$HADOOP_HOME/bin:$PATH
export PATH

刷新环境变量:

source /etc/profile

修改配置文件:

(1)修改

etc/hadoop/hadoop-env.sh
文件:

Java 路径为上文构建 JDK 镜像中,Dockerfile 中写的路径:

export JAVA_HOME=/usr/local/jdk1.8

(2)修改

etc/hadoop/core-site.xml
文件:

这里有个写死的项是主机名,我的是

hadoop001
,修改成你自己的:


  
    fs.defaultFS
    hdfs://hadoop001:9000
  
  
    hadoop.tmp.dir
    /usr/local/hadoop/tmp
  
  
    fs.trash.interval
    1440
  

(3)修改

etc/hadoop/hdfs-site.xml
文件:


  
    dfs.replication
    1
  
  
    dfs.permissions
    false
  

(4)修改

etc/hadoop/yarn-site.xml
文件:


  
    yarn.nodemanager.aux-services
    mapreduce_shuffle
  
  
    yarn.log-aggregation-enable
    true
  

(5)修改

etc/hadoop/mapred-site.xml.template
文件:

重命名为

mapred-site.xml
,内容修改如下:


  
    mapreduce.framework.name
    yarn
  

启动 Hadoop:

格式化 HDFS:

chmod -R 775 /my2/hadoop/*
/my2/hadoop/bin/hdfs namenode -format

启动 Standalone 模式:

/my2/hadoop/sbin/start-all.sh

查看是否启动成功:

jps

如何 debug Hive 源码,知其然知其所以然image-20210117203128158

三、编译 Hive 源码

从 Gitee 上克隆 Hive 的代码:

https://www.php.cn/link/fe53ff5f33342773a12c81d85fb0a090

注意克隆之前一定要设置一下 Git 换行符是否自动转换的:

表示检出时 (clone),不自动转换为 CRLF(Windows)格式,以免最终打出来的包,脚本的格式都是 Windows 格式的,无法运行。

企业网站通用源码1.0
企业网站通用源码1.0

企业网站通用源码是以aspcms作为核心进行开发的asp企业网站源码。企业网站通用源码是一套界面设计非常漂亮的企业网站源码,是2016年下半年的又一力作,适合大部分的企业在制作网站是参考或使用,源码亲测完整可用,没有任何功能限制,程序内核使用的是aspcms,如果有不懂的地方或者有不会用的地方可以搜索aspcms的相关技术问题来解决。网站UI虽然不是特别细腻,但是网站整体格调非常立体,尤其是通观全

下载
git config --global core.autocrlf input

克隆到本地:

git clone git@gitee.com:apache/hive.git

切换到 2.1.0 分支:

git checkout rel/release-2.1.0

本地需要先编译一下整个工程,因为有些代码是用 ANTLR 自动生成的,编译之后,会产生对应的类。

这里必须指定 profile 为 hadoop-2 来支持 Hadoop 2.x 版本:

mvn clean package -Phadoop-2 -DskipTests -Pdist

如何 debug Hive 源码,知其然知其所以然image-20210116161131896

编译完之后,在 packaging 包中会生成一个二进制包,这个包可以在服务器上运行的:

如何 debug Hive 源码,知其然知其所以然image-20210117203723039

四、Hive 环境搭建

上传包并且解压缩,重命名解压缩后的目录为

hive

如何 debug Hive 源码,知其然知其所以然image-20210116222020761

使用 Docker 启动 MySQL(使用 Docker 比较方便,你也可以使用你自己的 MySQL):

docker run -d -it --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=debezium -e MYSQL_USER=mysqluser -e MYSQL_PASSWORD=mysqlpw debezium/example-mysql

配置

hive-site.xml

cd /my2/hive/conf
cp hive-default.xml.template hive-site.xml
vi hive-site.xml

打开发现里面每一行都有一个

^M
字符,这是 Windows 换行符导致的,使用
dos2unix
替换即可:

dos2unix hive-site.xml

编辑

hive-site.xml

vi hive-site.xml

按 Esc,输入

/Connection
(搜索 Connection),把搜索到的这几个 key 的值,替换成下面的:


  javax.jdo.option.ConnectionUserName
  root


  javax.jdo.option.ConnectionPassword
  debezium


  javax.jdo.option.ConnectionURL
  jdbc:mysql://192.168.56.10:3306/hive?createDatabaseIfNotExist=true&useSSL=false


  javax.jdo.option.ConnectionDriverName
  com.mysql.jdbc.Driver

复制 MySQL 驱动到 Hive 的 lib 目录下。

初始化 metastore 的数据库:

/my2/hive/bin/schematool -dbType mysql -initSchema

接着

vi hive-site.xml
,搜索
/user.name

把 {system:java.io.tmpdir} 改成 /home/hadoop/hive/tmp/
把 {system:user.name} 改成 {user.name}

启动 Hive 命令行即可:

搜索 Connection

五、导入到 IDEA 中 Debug

然后把源码导入 IDEA 中,等待 IDEA 完成。

这里的 Debug 很简单,我们在服务器上远程 Debug。

首先在服务器上执行:

hive --debug

如何 debug Hive 源码,知其然知其所以然image-20210117204324201

服务器显示在本机的 8000 端口等待连接。

然后我们在 IDEA 中配置一个远程 debug:

如何 debug Hive 源码,知其然知其所以然image-20210117204425904

点击 Debug 按钮,就可以进行 Debug 了。

主要是 Debug 一下

CLIDriver
main
方法,里面有一个
run
方法:

如何 debug Hive 源码,知其然知其所以然image-20210117205731396

追踪到后面的源码,可以发现一直在等待用户的输入,每次输入之后,都会用

processLine
方法处理:

如何 debug Hive 源码,知其然知其所以然image-20210117205824507

processLine
也就是 Hive 执行 SQL 的主要逻辑了,熟读这块代码,便可看到 Hive 的核心逻辑。

具体的逻辑正在研究中,有成果了会发文,敬请期待。

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

841

2023.06.15

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

742

2023.07.05

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

737

2023.07.31

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

397

2023.08.01

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

399

2023.08.02

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

446

2023.08.02

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

430

2023.08.02

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

16926

2023.08.03

Java JVM 原理与性能调优实战
Java JVM 原理与性能调优实战

本专题系统讲解 Java 虚拟机(JVM)的核心工作原理与性能调优方法,包括 JVM 内存结构、对象创建与回收流程、垃圾回收器(Serial、CMS、G1、ZGC)对比分析、常见内存泄漏与性能瓶颈排查,以及 JVM 参数调优与监控工具(jstat、jmap、jvisualvm)的实战使用。通过真实案例,帮助学习者掌握 Java 应用在生产环境中的性能分析与优化能力。

19

2026.01.20

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
尚学堂Mahout视频教程
尚学堂Mahout视频教程

共18课时 | 3.2万人学习

MySQL 教程
MySQL 教程

共48课时 | 1.8万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号