偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Hive源碼編譯及閱讀修改調(diào)試

大數(shù)據(jù)
Hive起完全分布式的MR任務(wù)也可追蹤,但是需要修改節(jié)點(diǎn)機(jī)上的MR啟動(dòng)時(shí)Java參數(shù),而且Hive起一個(gè)MR任務(wù)時(shí),只有當(dāng)MR啟動(dòng)后才能知道哪個(gè)節(jié)點(diǎn)機(jī)上啟動(dòng)了該任務(wù),之后才能進(jìn)行Remote debug連接,這在運(yùn)行環(huán)境為完全分布式時(shí)會(huì)比較麻煩。但如果運(yùn)行環(huán)境為偽分布式,那么追蹤可能會(huì)更方便些。

下載編譯

在git上下載合適的master分支,使用maven編譯。執(zhí)行編譯的目的在于,確保過(guò)程中生成的代碼(Thrift)已經(jīng)生成,這樣導(dǎo)入IDEA就不會(huì)出現(xiàn)有些類找不到的情況。

執(zhí)行源碼編譯分發(fā)命令,進(jìn)入源碼根目錄執(zhí)行:

  1. mvn clean package -Phadoop-2 -DskipTests -Pdist 

這里必須指定profile為hadoop-2來(lái)支持hadoop 2.x版本

1、后續(xù)更改完源碼后,還需執(zhí)行該命令來(lái)編譯打包。源碼更改后需評(píng)價(jià)其對(duì)Hive各模塊的影響(改動(dòng)代碼多的話可通過(guò)pom的依賴來(lái)看),如果影響的模塊非常少,可以直接進(jìn)入相應(yīng)的模塊進(jìn)行上述命令的編譯打包,如果影響模塊很多,則直接在Hive源碼根目錄進(jìn)行編譯打包。

2、打完包后,將受影響的包進(jìn)行線上替換,重啟受影響的組件即可應(yīng)用上改后的代碼。如果在CDH環(huán)境,要注意所有YARN的節(jié)點(diǎn)都需進(jìn)行包的替換,因?yàn)镠ive的MR任務(wù)啟動(dòng)后,節(jié)點(diǎn)上Container的啟動(dòng)其核心包是加載的本地jar包,而不是HDFS上的jar包。

導(dǎo)入IDEA進(jìn)行源碼閱讀修改

在Intellij里打開(kāi)編譯后的工程,它是一個(gè)Maven工程,軟件會(huì)自動(dòng)區(qū)分模塊并導(dǎo)入。導(dǎo)入后可以看到源碼,但我們會(huì)發(fā)現(xiàn),很多關(guān)于hadoop的地方標(biāo)紅了,表示不可用,這是為什么呢?

這是因?yàn)榘姹疽蕾嚨脑颍琱ive可編譯為依賴 hadoop1 或 hadoop2,在編譯源碼的時(shí)候就已提示過(guò)讓我們輸入支持哪個(gè),否則不能編譯!

這里也一樣,需要我們選擇其依賴,才能正確的導(dǎo)入maven依賴包!

在Intellij的右側(cè),有個(gè)maven project的??繖冢c(diǎn)擊它可以看到有個(gè) profiles的子項(xiàng),我們可以明顯看到hadoop-2是沒(méi)有勾選的,這里勾選上它,它所指定的相應(yīng)依賴就會(huì)被導(dǎo)入,源碼就不會(huì)標(biāo)紅啦!就可以放心的改源碼啦!

如下圖

開(kāi)啟調(diào)試之旅

調(diào)試前提

調(diào)試代碼時(shí)最好不執(zhí)行完全分布式任務(wù)(會(huì)分配到多臺(tái)節(jié)點(diǎn)機(jī)執(zhí)行的MR任務(wù)),代碼跑動(dòng)控制在當(dāng)前JVM范圍內(nèi)(可以是多線程的),否則代碼跟蹤超級(jí)麻煩。

如果需要執(zhí)行MR任務(wù),最好以local模式執(zhí)行,打開(kāi)命令SET mapreduce.framework.name=local;

有些任務(wù)也不需要起MR,這樣更方便調(diào)試,盡可能不起MR:set hive.exec.mode.local.auto = true;,并調(diào)大hive.exec.mode.local.auto.tasks.max(默認(rèn)4)和hive.exec.mode.local.auto.inputbytes.max(默認(rèn)128M),當(dāng)且僅當(dāng)自動(dòng)開(kāi)啟本地模式設(shè)為true,并且輸入的文件數(shù)量和數(shù)據(jù)量大小分別都小于這兩個(gè)值的時(shí)候,才不會(huì)起MR任務(wù)。

1、Hive起完全分布式的MR任務(wù)也可追蹤,但是需要修改節(jié)點(diǎn)機(jī)上的MR啟動(dòng)時(shí)Java參數(shù),而且Hive起一個(gè)MR任務(wù)時(shí),只有當(dāng)MR啟動(dòng)后才能知道哪個(gè)節(jié)點(diǎn)機(jī)上啟動(dòng)了該任務(wù),之后才能進(jìn)行Remote debug連接,這在運(yùn)行環(huán)境為完全分布式時(shí)會(huì)比較麻煩。但如果運(yùn)行環(huán)境為偽分布式,那么追蹤可能會(huì)更方便些。

2、Hive調(diào)試,實(shí)際運(yùn)行環(huán)境為偽分布式集群環(huán)境或完全分布式集群環(huán)境都可以。

Hive調(diào)試需保證調(diào)試代碼和運(yùn)行環(huán)境的代碼一致,否則調(diào)試會(huì)出現(xiàn)斷點(diǎn)位置對(duì)不上的問(wèn)題,影響我們調(diào)試。

如果是在Kerberos環(huán)境,運(yùn)行Hive命令的用戶需具備Kerberos認(rèn)證,因?yàn)檎{(diào)試跟正常執(zhí)行任務(wù)其實(shí)沒(méi)什么區(qū)別。調(diào)試端(如Windows上的IDEA)不需要認(rèn)證,它只要能連通開(kāi)啟的JVM端口即可。

調(diào)試原理

基于Sun Microsystem 的 Java Platform Debugger Architecture (JPDA) 技術(shù),它由兩個(gè)接口(分別是 JVM Tool Interface 和 JDI)、一個(gè)協(xié)議(Java Debug Wire Protocol)和兩個(gè)用于合并它們的軟件組件(后端和前端)組成,可以遠(yuǎn)程調(diào)試任何基于JVM的程序。

要啟用調(diào)試,只需在軟件的JVM啟動(dòng)時(shí)加載以下參數(shù):

  1. -Xdebug -Xrunjdwp:transport=dt_socket,address=5005,server=y,suspend=n 

  1. -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 

參數(shù)含義:

Hive Cli 調(diào)試

在運(yùn)行環(huán)境開(kāi)啟Hive Cli命令行,執(zhí)行: bin/hive --debug -hiveconf hive.root.logger=DEBUG,console,此時(shí)界面會(huì)顯示 Listening for transport dt_socket at address: 8000,表明遠(yuǎn)程調(diào)試模式已開(kāi)。

然后在IntelliJ里配置遠(yuǎn)程調(diào)試模式,Run -> Debug -> Edit Configurations,然后點(diǎn)左上角 + 號(hào)按鈕,選擇 Remote,配好Host為運(yùn)行Hive Cli命令的主機(jī),Port為8000,然后起個(gè)方便識(shí)別的名字,點(diǎn)擊Debug就可以開(kāi)始調(diào)試源碼了。

一旦這邊遠(yuǎn)程連接上了集群環(huán)境的調(diào)試端口,集群那邊就會(huì)打日志并出現(xiàn)hive >這樣的輸入光標(biāo),在IDEA里打斷點(diǎn),然后在Hive Cli里執(zhí)行HQL語(yǔ)句,我們就可以看到IDEA這邊的斷點(diǎn)信息,然后逐步調(diào)試。

HiveServer2 調(diào)試

以下以CDH集群環(huán)境做說(shuō)明,路徑與你安裝的CDH路徑有關(guān),Apache開(kāi)源環(huán)境找到對(duì)應(yīng)配置文件即可。

修改hiveserver2所在機(jī)器的/opt/cloudera/parcels/CDH/lib/hive/bin/hive-config.sh文件,在最后加上

  1. export HADOOP_OPTS="$HADOOP_OPTS -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005" 
  2. export HADOOP_VERSION="2.6.0-cdh5.5.1" 

其中HADOOP_VERSION由命令hadoop version可得到。

改完配置后在CM里重啟Hiveserver2,這時(shí)在HiveServer2所在機(jī)器上查看5005端口,會(huì)發(fā)現(xiàn)處于監(jiān)聽(tīng)狀態(tài),然后利用Intellij如上面的debug一樣,即可連接上遠(yuǎn)程的hiveserver2。

打好斷點(diǎn),之后在某一節(jié)點(diǎn)上啟動(dòng)beeline,連接上該hiveserver2,執(zhí)行hql,這邊就可以源碼追蹤。

1、注意端口別占用了,否則會(huì)報(bào): JDWP No transports initialized, jvmtiError=AGENT_ERROR_TRANSPORT_INIT

2、如果整個(gè)Hive需要重啟,需把上面更改注釋掉,待Hive重啟完畢后,再把注釋改回來(lái)然后單獨(dú)重啟HiveServer2。這是因?yàn)镠ive MetaStore啟動(dòng)時(shí)也會(huì)用到該腳本,而MetaStore先啟動(dòng),會(huì)進(jìn)入MetaStore的調(diào)試。之后啟動(dòng)HiveServer2時(shí)就會(huì)出現(xiàn)端口占用的情況

Beeline 調(diào)試

以下以CDH集群環(huán)境做說(shuō)明,自己的安裝環(huán)境尋找相應(yīng)配置即可

修改需要運(yùn)行beeline的機(jī)器上的beeline腳本的執(zhí)行腳本,我的位置為:/opt/cloudera/parcels/CDH/lib/hive/bin/ext/beeline.sh,在腳本最后的export HADOOP_CLIENT_OPTS后加上 -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005。

如下:

改完后,在該機(jī)器上執(zhí)行beeline即可進(jìn)入監(jiān)聽(tīng)狀態(tài),IDEA進(jìn)行遠(yuǎn)程連接即可

責(zé)任編輯:武曉燕 來(lái)源: oschina博客
相關(guān)推薦

2013-05-28 10:52:07

Android開(kāi)發(fā)移動(dòng)開(kāi)發(fā)移動(dòng)應(yīng)用

2011-03-08 10:18:18

Visual StudMongoDB

2021-10-17 19:52:40

Python:源碼編譯器

2022-06-05 23:31:28

ClionMySQL數(shù)據(jù)

2013-12-24 10:05:04

memcached

2015-11-11 15:19:13

Linux編譯調(diào)試

2018-11-16 16:35:19

Java源碼編程語(yǔ)言

2012-02-14 14:05:59

JavaSpring

2017-04-05 16:40:45

2022-10-08 08:01:17

Spring源碼服務(wù)

2017-03-16 11:39:33

Openstack源碼姿勢(shì)

2011-09-13 17:44:00

Eclipse And

2018-03-28 16:10:23

閱讀源碼境界

2021-08-02 09:50:47

Vetur源碼SMART

2017-04-13 19:26:21

2021-12-20 07:58:59

GitHub源碼代碼

2014-07-29 09:44:58

jQuery源碼

2021-03-13 14:08:00

Hadoop 源碼HDFS

2023-07-10 07:40:14

2022-07-31 19:57:26

react項(xiàng)目VSCode
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)