前言:让学习成为一种习惯
工作已经两年多了,各种各样的大数据框架也使用过,各种官网也翻了很多,但是对于框架的底层源码从未细细的了解过,有一位大佬对我说如果你遇到瓶颈就去看看源码,看看别人的代码怎么写,看看别人的思想,然后总结归纳,与自己的思想相结合,于是我就有了阅读源码的计划,说实话这个计划我纠结了很久,一直未付出实践,纠结Flink,Spark,Hive,Hadoop源码我究竟该从那一方面下手,经过我苦苦思考,最终将目光放在了ApacheHive之上,Hive身为主流的数据仓库框架,可以说已经很成熟了,并且应用广泛,而且兼容Spark,Flink,所以我决定先从Hive源码开始,源码阅读不是说你看这人家的源码全部读一遍就是阅读源码,这样无非是浪费时间,首先定义重点,我们如何阅读Hive源码,应该从那里下手,应该阅读那几部分的源码,废话不多说,我们开始
环境准备
我推荐系统Linux或者Mac作为主系统,测试过win但是没有成功,准备以下环境
- JDK这是必备的,个人目前主要是使用JDK8;
- Hadoop单机环境,没必要集群环境,因为我们只是为了阅读源码,不是为了去执行计算;
- Spark环境,这个随自己,主要是我自己本身就有这个环境,如果是新环境Hadoop+Hive就够了;
- Maven这个是必须的;
Hive源码下载
Hive源码目录
hive三个最重要的组件:
serde: 这个组件是 hive内置的一些序列化解析类,此组件允许用户自己开发自定义序列化、反序列化文件解析器
MetaStore: hive的元数据服务器,用来存放数据仓库中所有表和分区的信息,hive元数据建表sql、升级sql脚本都存放在此目录下
ql: 此组件用于解析sql生成执行计划(hive核心包,熟读此包,可了解hive执行流程核心)
其他组件
cli: hive命令的入口,用于处理命令行提交作业
service: 此组件所有对外api接口的服务端(通过thrift实现),可用于其他客户端与hive交互,比如jdbc。
common: hive基础代码库,hive各个组件信息的传递也是有此包HiveConf类来管理。
ant: 此组件包含一些ant任务需要的基础代码
bin: 此组件包涵hive里的所有脚本,包括hivecli的脚本
beeline: HiveServer2提供的一个新的命令行工具Beeline
hcatalog: 是apache开源的对于表和底层数据管理统一服务平台,HCatalog底层依赖于Hive Metastore
findbugs: Findbugs是一个在java程序中查找bug的程序,它查找bug模式的实例,也就是可能出错的代码实例,注意Findbugs是检查java字节码,也就是*.class文件。
hwi: hive web页面的接口
shims: shims相关类是用来兼容不同的hadoop和hive版本
llap: 是基于tez的一种近实时查询方案
hive辅助组件
conf: 此目录包涵hive配置文件hive-default.xml、hive-site.xml
data: hive测试所用数据
lib: hive运行期间依赖的jar
更多详细信息可以到官网看 ApacheHive
编译源码
- 编译命令:mvn clean package -DskipTests -Phadoop-2 -Pdist
mvn clean install -DskipTests -Phadoop-2 -Pdist
(二选一,注意依赖的Hadoop版本)
- 编译完成后导入IDEA
配置Hive本地调试
- 配置Hadoop位置
进入/opt/software/apache-hive-1.2.2-src/packaging/target/apache-hive-1.2.2-bin/apache-hive-1.2.2-bin/conf
目录复制目录下的hive-env.sh.template为hive-env.sh(cp命令拷贝一份就行)
添加Hadoop所在目录:export HADOOP_HOME=/opt/environment_variable/hadoop-2.6.0 - 初始化Hive元数据信息
进入/opt/software/apache-hive-1.2.2-src/packaging/target/apache-hive-1.2.2-bin/apache-hive-1.2.2-bin
运行命令bin/schematool -dbType derby -initSchema(这里为了方便使用的是derby,也可设置为MySQL)
看到结果,说明成功;(图都丢了,所以没办法,这个装过Hive的应该都没问题) - 启动HiveDebug
hive --debug --hiveconf hive.root.logger=DEBUG,console
出现Listening即为成功
./hive --debug --hiveconf ^Cve.root.logger=DEBUG,console
Listening for transport dt_socket at address: 8000
配置IDEA-DEBUG(注意端口和Host)
开始Debug,配置成功图片一张,入口类选择了CLi,想看一下具体的源码执行流程
这里说一下,我没有解决代码报红,因为爆红也不影响Debug,但是有时间的最好解决一下,因为如果不解决会很坑的,本次文章就到这里拉,如果觉得作者的文章不错,点个赞吧,开始我的源码阅读之旅,之后每周都会更新一篇源码阅读心得,在说一下如果有那位大佬测试了CDH版本的希望可以指点一下小弟,感谢阅读
转载:https://blog.csdn.net/Z_baiqiang/article/details/109558917