Hive原始碼閱讀之路

張三的成長之路發表於2020-11-08

前言:讓學習成為一種習慣

工作已經兩年多了,各種各樣的大資料框架也使用過,各種官網也翻了很多,但是對於框架的底層原始碼從未細細的瞭解過,有一位大佬對我說如果你遇到瓶頸就去看看原始碼,看看別人的程式碼怎麼寫,看看別人的思想,然後總結歸納,與自己的思想相結合,於是我就有了閱讀原始碼的計劃,說實話這個計劃我糾結了很久,一直未付出實踐,糾結Flink,Spark,Hive,Hadoop原始碼我究竟該從那一方面下手,經過我苦苦思考,最終將目光放在了ApacheHive之上,Hive身為主流的資料倉儲框架,可以說已經很成熟了,並且應用廣泛,而且相容Spark,Flink,所以我決定先從Hive原始碼開始,原始碼閱讀不是說你看這人家的原始碼全部讀一遍就是閱讀原始碼,這樣無非是浪費時間,首先定義重點,我們如何閱讀Hive原始碼,應該從那裡下手,應該閱讀那幾部分的原始碼,廢話不多說,我們開始

環境準備

我推薦系統Linux或者Mac作為主系統,測試過win但是沒有成功,準備以下環境

  1. JDK這是必備的,個人目前主要是使用JDK8;
  2. Hadoop單機環境,沒必要叢集環境,因為我們只是為了閱讀原始碼,不是為了去執行計算;
  3. Spark環境,這個隨自己,主要是我自己本身就有這個環境,如果是新環境Hadoop+Hive就夠了;
  4. Maven這個是必須的;

Hive原始碼下載

  1. CDH原始碼
    原始碼下載戳我
  2. 社群原始碼
    原始碼下載戳我
    (我沒有用過CDH的原始碼除錯,但是因為目前公司使用的是CDH環境,所以是有嘗試的想法)

Hive原始碼目錄

以上就是HIe原始碼

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

編譯原始碼

  1. 編譯命令:mvn clean package -DskipTests -Phadoop-2 -Pdist
    mvn clean install -DskipTests -Phadoop-2 -Pdist
    (二選一,注意依賴的Hadoop版本)
    在這裡插入圖片描述
  2. 編譯完成後匯入IDEA

配置Hive本地除錯

  1. 配置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
  2. 初始化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的應該都沒問題)
  3. 啟動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版本的希望可以指點一下小弟,感謝閱讀

相關文章