在最近的出差过程中,客户现场的 hiveserver 长时间不可用,查看 cm 的监控发现,hiveserver 的内存在一特定时刻急剧增加,同时 jvm 开始进行垃圾回收(gc),每次 gc 长达一分钟,导致 hiveserver 在很长一段时间内无法使用。
查看了 HiveServer 日志,发现内存暴涨的时间点上,执行了一个简单的 SQL 查询:
select count(1) from table
然而,我一直无法解释这样简单的 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
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop001:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop/tmp</value>
</property>
<property>
<name>fs.trash.interval</name>
<value>1440</value>
</property>
</configuration>(3)修改
etc/hadoop/hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
</configuration>(4)修改
etc/hadoop/yarn-site.xml
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
</configuration>(5)修改
etc/hadoop/mapred-site.xml.template
重命名为
mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>启动 Hadoop:
格式化 HDFS:
chmod -R 775 /my2/hadoop/* /my2/hadoop/bin/hdfs namenode -format
启动 Standalone 模式:
/my2/hadoop/sbin/start-all.sh
查看是否启动成功:
jps
image-20210117203128158
三、编译 Hive 源码
从 Gitee 上克隆 Hive 的代码:
https://www.php.cn/link/fe53ff5f33342773a12c81d85fb0a090
注意克隆之前一定要设置一下 Git 换行符是否自动转换的:
表示检出时 (clone),不自动转换为 CRLF(Windows)格式,以免最终打出来的包,脚本的格式都是 Windows 格式的,无法运行。
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
image-20210116161131896
编译完之后,在 packaging 包中会生成一个二进制包,这个包可以在服务器上运行的:
image-20210117203723039
四、Hive 环境搭建
上传包并且解压缩,重命名解压缩后的目录为
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
dos2unix
dos2unix hive-site.xml
编辑
hive-site.xml
vi hive-site.xml
按 Esc,输入
/Connection
<property> <name>javax.jdo.option.ConnectionUserName</name> <value>root</value> </property> <property> <name>javax.jdo.option.ConnectionPassword</name> <value>debezium</value> </property> <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://192.168.56.10:3306/hive?createDatabaseIfNotExist=true&useSSL=false</value> </property> <property> <name>javax.jdo.option.ConnectionDriverName</name> <value>com.mysql.jdbc.Driver</value> </property>
复制 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
image-20210117204324201
服务器显示在本机的 8000 端口等待连接。
然后我们在 IDEA 中配置一个远程 debug:
image-20210117204425904
点击 Debug 按钮,就可以进行 Debug 了。
主要是 Debug 一下
CLIDriver
main
run
image-20210117205731396
追踪到后面的源码,可以发现一直在等待用户的输入,每次输入之后,都会用
processLine
image-20210117205824507
processLine
具体的逻辑正在研究中,有成果了会发文,敬请期待。
以上就是如何 debug Hive 源码,知其然知其所以然的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号