編譯hive源碼導入到eclipse中

軟件版本:

hive1.2.1 ,eclipse4.5,maven3.2 ,JDK1.7

軟件準備:

hive:


環境準備:

(1). 安裝好的Hadoop集羣(僞分佈式亦可);

(2) linux 下maven環境;(這裏需要說下,maven編譯hive,在windows下是不通的,因爲裏面需要bash的支持,所以直接使用linux編譯hive就好)


0. 編譯前,建議把maven的local_reposity 配置下,同時配置源如下(開源中國的maven源,相對國外的源較快):

  1. <mirror>  
  2.         <id>nexus-osc</id>  
  3.         <mirrorOf>central</mirrorOf>  
  4.         <name>Nexus osc</name>  
  5.         <url>http://maven.oschina.net/content/groups/public/</url>  
  6.     </mirror>  
  7.     <mirror>  
  8.         <id>nexus-osc-thirdparty</id>  
  9.         <mirrorOf>thirdparty</mirrorOf>  
  10.         <name>Nexus osc thirdparty</name>  
  11.         <url>http://maven.oschina.net/content/repositories/thirdparty/</url>  
  12.     </mirror>  


1. 編譯Hive,下載hive1.2.1的源碼,並解壓到linux某目錄,按照下面的命令進行編譯(進入hive源碼解壓後路徑):

(1)mvn clean install -DskipTests -Phadoop-2

  1. [INFO] Reactor Summary:  
  2. [INFO]   
  3. [INFO] Hive ............................................... SUCCESS [  4.457 s]  
  4. [INFO] Hive Shims Common .................................. SUCCESS [  5.047 s]  
  5. [INFO] Hive Shims 0.20S ................................... SUCCESS [  2.017 s]  
  6. [INFO] Hive Shims 0.23 .................................... SUCCESS [  7.157 s]  
  7. [INFO] Hive Shims Scheduler ............................... SUCCESS [  1.796 s]  
  8. [INFO] Hive Shims ......................................... SUCCESS [  1.674 s]  
  9. [INFO] Hive Common ........................................ SUCCESS [  5.711 s]  
  10. [INFO] Hive Serde ......................................... SUCCESS [  7.577 s]  
  11. [INFO] Hive Metastore ..................................... SUCCESS [ 18.044 s]  
  12. [INFO] Hive Ant Utilities ................................. SUCCESS [  1.373 s]  
  13. [INFO] Spark Remote Client ................................ SUCCESS [ 10.962 s]  
  14. [INFO] Hive Query Language ................................ SUCCESS [05:12 min]  
  15. [INFO] Hive Service ....................................... SUCCESS [ 42.408 s]  
  16. [INFO] Hive Accumulo Handler .............................. SUCCESS [01:40 min]  
  17. [INFO] Hive JDBC .......................................... SUCCESS [  9.021 s]  
  18. [INFO] Hive Beeline ....................................... SUCCESS [ 12.194 s]  
  19. [INFO] Hive CLI ........................................... SUCCESS [ 12.576 s]  
  20. [INFO] Hive Contrib ....................................... SUCCESS [  3.031 s]  
  21. [INFO] Hive HBase Handler ................................. SUCCESS [01:54 min]  
  22. [INFO] Hive HCatalog ...................................... SUCCESS [ 28.797 s]  
  23. [INFO] Hive HCatalog Core ................................. SUCCESS [  5.609 s]  
  24. [INFO] Hive HCatalog Pig Adapter .......................... SUCCESS [ 23.254 s]  
  25. [INFO] Hive HCatalog Server Extensions .................... SUCCESS [01:15 min]  
  26. [INFO] Hive HCatalog Webhcat Java Client .................. SUCCESS [  2.036 s]  
  27. [INFO] Hive HCatalog Webhcat .............................. SUCCESS [ 49.390 s]  
  28. [INFO] Hive HCatalog Streaming ............................ SUCCESS [  4.387 s]  
  29. [INFO] Hive HWI ........................................... SUCCESS [  1.768 s]  
  30. [INFO] Hive ODBC .......................................... SUCCESS [  1.053 s]  
  31. [INFO] Hive Shims Aggregator .............................. SUCCESS [  0.111 s]  
  32. [INFO] Hive TestUtils ..................................... SUCCESS [  0.550 s]  
  33. [INFO] Hive Packaging ..................................... SUCCESS [  3.195 s]  
  34. [INFO] ------------------------------------------------------------------------  
  35. [INFO] BUILD SUCCESS  
  36. [INFO] ------------------------------------------------------------------------  
  37. [INFO] Total time: 14:31 min  
  38. [INFO] Finished at: 2015-10-15T05:25:11-07:00  
  39. [INFO] Final Memory: 89M/416M  

(2)清空相關輸出:

mvn eclipse:clean

(3)編譯成eclipse工程:

mvn eclipse:eclipse -DdownloadSources -DdownloadJavadocs -Phadoop-2


  1. [INFO] Reactor Summary:  
  2. [INFO]   
  3. [INFO] Hive ............................................... SUCCESS [  7.396 s]  
  4. [INFO] Hive Shims Common .................................. SUCCESS [  3.983 s]  
  5. [INFO] Hive Shims 0.20S ................................... SUCCESS [  2.734 s]  
  6. [INFO] Hive Shims 0.23 .................................... SUCCESS [ 16.801 s]  
  7. [INFO] Hive Shims Scheduler ............................... SUCCESS [  2.143 s]  
  8. [INFO] Hive Shims ......................................... SUCCESS [  1.958 s]  
  9. [INFO] Hive Common ........................................ SUCCESS [  4.495 s]  
  10. [INFO] Hive Serde ......................................... SUCCESS [  6.760 s]  
  11. [INFO] Hive Metastore ..................................... SUCCESS [  3.512 s]  
  12. [INFO] Hive Ant Utilities ................................. SUCCESS [  0.252 s]  
  13. [INFO] Spark Remote Client ................................ SUCCESS [  6.719 s]  
  14. [INFO] Hive Query Language ................................ SUCCESS [  7.988 s]  
  15. [INFO] Hive Service ....................................... SUCCESS [ 55.204 s]  
  16. [INFO] Hive Accumulo Handler .............................. SUCCESS [11:49 min]  
  17. [INFO] Hive JDBC .......................................... SUCCESS [  1.607 s]  
  18. [INFO] Hive Beeline ....................................... SUCCESS [35:22 min]  
  19. [INFO] Hive CLI ........................................... SUCCESS [01:28 min]  
  20. [INFO] Hive Contrib ....................................... SUCCESS [  1.797 s]  
  21. [INFO] Hive HBase Handler ................................. SUCCESS [10:35 min]  
  22. [INFO] Hive HCatalog ...................................... SUCCESS [  5.775 s]  
  23. [INFO] Hive HCatalog Core ................................. SUCCESS [01:23 min]  
  24. [INFO] Hive HCatalog Pig Adapter .......................... SUCCESS [01:10 min]  
  25. [INFO] Hive HCatalog Server Extensions .................... SUCCESS [07:20 min]  
  26. [INFO] Hive HCatalog Webhcat Java Client .................. SUCCESS [  1.968 s]  
  27. [INFO] Hive HCatalog Webhcat .............................. SUCCESS [01:53 min]  
  28. [INFO] Hive HCatalog Streaming ............................ SUCCESS [  2.089 s]  
  29. [INFO] Hive HWI ........................................... SUCCESS [  1.816 s]  
  30. [INFO] Hive ODBC .......................................... SUCCESS [  1.284 s]  
  31. [INFO] Hive Shims Aggregator .............................. SUCCESS [  0.064 s]  
  32. [INFO] Hive TestUtils ..................................... SUCCESS [  2.947 s]  
  33. [INFO] Hive Packaging ..................................... SUCCESS [  2.837 s]  
  34. [INFO] ------------------------------------------------------------------------  
  35. [INFO] BUILD SUCCESS  
  36. [INFO] ------------------------------------------------------------------------  
  37. [INFO] Total time: 01:13 h  
  38. [INFO] Finished at: 2015-10-15T19:53:05-07:00  
  39. [INFO] Final Memory: 68M/306M  

這個過程會比較慢;

編譯後,文件大小大概有:391M左右



2. 編譯後工程導入eclipse中

這裏導入需要分爲兩種情況,分爲導入windows下的eclipse和導入linux下的eclipse中;(因爲一般使用機器都是windows的,所以如果可以使用windows,則最好)

2.1 工程導入windows的eclipse中;

打開eclipse,右鍵-> Import ,選擇編譯後的文件夾(這裏需要把編譯後的文件下載到windows上);即可看到如下的界面:



當然,這裏會有些錯誤,比如jdk/tool.jar找不到等等,這個是因爲編譯的jdk和windows的jdk不一樣,調整下即可。

(1)運行 hive-cli 工程的CliDriver(當然,要先啓動hive相關進行,hive --service metastore & ;  hive --service hiveserver2 &)

         運行後會直接報錯,說 driver “hive-site.xml ”not in Classpath 什麼的錯誤,修改方法:

打開hive-common工程的本地目錄的target/test-classes路徑


修改裏面的core-site.xml 以及hive-site.xml ,這裏面的配置就參考hadoop集羣以及hive的配置即可

然後再次運行CliDriver,發現報下面的錯誤:

  1. Exception in thread "main" java.lang.RuntimeException: org.apache.hadoop.ipc.RemoteException: Server IPC version 9 cannot communicate with client version 4  
  2.     at org.apache.hadoop.hive.ql.session.SessionState.start(SessionState.java:522)  
  3.     at org.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:677)  
  4.     at org.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:621)  
這個是版本不匹配的錯誤,通過打印java的classpath,發現hadoop1的jar包在hadoop2的jar包前面


這樣子肯定是有 問題的,集羣都使用的是hadoop2的版本,但是代碼卻用的hadoop1,這樣報這個錯就沒啥奇怪的了。那問題是出在了哪呢?

通過查看hive-shims-common工程,發現其工程的依賴只有hadoop1,沒有hadoop2,而hive-cli工程也是依賴hive-shims-common工程,這也就解釋了爲什麼Java的classpath裏面hadoop1的jar包在hadoop2前面了。

此路不通!

(2)運行hive-beeline工程的BeeLine

直接運行,進入beeline交互式命令終端,如下圖:


發現是可以連接hive的,比如mr查詢:


但是這個不可以調試,即使用debug模式,仍然不能調試。

所以對於閱讀源碼,查看調用關係來說這種模式也不是很好。

2.2 導入到linux的eclipse工程

   此導入和windows不無差別。


3. 直接新建工程,使用編譯後的hive jar包(此處的jar包不是指自己編譯的,而是官網直接提供的),就apache-hive-1.2.1-bin.tar.gz文件。

3.1 在windows的eclipse中新建hive工程


同時新建一個類,如上圖所示。

這裏還需要注意:

a. 引入編譯後的hive的lib包的所有jar包;

b. 引入MySQL的連接jar包;

c. 引入hadoop的相關jar包


(1)寫一個測試程序,調用CliDriver,出現下面的錯誤:

  1. 2015-10-22 22:25:19,837  INFO [main] (HiveMetaStoreClient.java:376) - Trying to connect to metastore with URI thrift://192.168.0.100:9083  
  2. Exception in thread "main" java.lang.RuntimeException: java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient  
  3.     at org.apache.hadoop.hive.ql.session.SessionState.start(SessionState.java:522)  
  4.     at org.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:662)  
  5.     at test.MainTest.main(MainTest.java:8)  
  6. Caused by: java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient  
  7.     at org.apache.hadoop.hive.metastore.MetaStoreUtils.newInstance(MetaStoreUtils.java:1523)  
  8.     at org.apache.hadoop.hive.metastore.RetryingMetaStoreClient.<init>(RetryingMetaStoreClient.java:86)  
  9.     at org.apache.hadoop.hive.metastore.RetryingMetaStoreClient.getProxy(RetryingMetaStoreClient.java:132)  
  10.     at org.apache.hadoop.hive.metastore.RetryingMetaStoreClient.getProxy(RetryingMetaStoreClient.java:104)  
  11.     at org.apache.hadoop.hive.ql.metadata.Hive.createMetaStoreClient(Hive.java:3005)  
  12.     at org.apache.hadoop.hive.ql.metadata.Hive.getMSC(Hive.java:3024)  
  13.     at org.apache.hadoop.hive.ql.session.SessionState.start(SessionState.java:503)  
  14.     ... 2 more  
  15. Caused by: java.lang.reflect.InvocationTargetException  
  16.     at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)  
  17.     at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)  
  18.     at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)  
  19.     at java.lang.reflect.Constructor.newInstance(Constructor.java:526)  
  20.     at org.apache.hadoop.hive.metastore.MetaStoreUtils.newInstance(MetaStoreUtils.java:1521)  
  21.     ... 8 more  
  22. Caused by: java.lang.NullPointerException  
  23.     at java.lang.ProcessBuilder.start(ProcessBuilder.java:1010)  
  24.     at org.apache.hadoop.util.Shell.runCommand(Shell.java:482)  
  25.     at org.apache.hadoop.util.Shell.run(Shell.java:455)  
  26.     at org.apache.hadoop.util.Shell$ShellCommandExecutor.execute(Shell.java:715)  
  27.     at org.apache.hadoop.util.Shell.execCommand(Shell.java:808)  
  28.     at org.apache.hadoop.util.Shell.execCommand(Shell.java:791)  
  29.     at org.apache.hadoop.security.ShellBasedUnixGroupsMapping.getUnixGroups(ShellBasedUnixGroupsMapping.java:84)  
  30.     at org.apache.hadoop.security.ShellBasedUnixGroupsMapping.getGroups(ShellBasedUnixGroupsMapping.java:52)  
  31.     at org.apache.hadoop.security.JniBasedUnixGroupsMappingWithFallback.getGroups(JniBasedUnixGroupsMappingWithFallback.java:51)  
  32.     at org.apache.hadoop.security.Groups.getGroups(Groups.java:176)  
  33.     at org.apache.hadoop.security.UserGroupInformation.getGroupNames(UserGroupInformation.java:1488)  
  34.     at org.apache.hadoop.hive.metastore.HiveMetaStoreClient.open(HiveMetaStoreClient.java:436)  
  35.     at org.apache.hadoop.hive.metastore.HiveMetaStoreClient.<init>(HiveMetaStoreClient.java:236)  
  36.     at org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient.<init>(SessionHiveMetaStoreClient.java:74)  
  37.     ... 13 more  

通過跟蹤排查,發現是windows中的hadoop沒有配置winutils.exe 所致

也就是最開始的錯誤:

  1. Could not locate executable D:\jars\hadoop2.6\hadoop-2.6.0\bin\winutils.exe in the Hadoop binarie  
(如果只是windows提交mr任務,這個沒有配置,也是可以的,但是在hive源碼裏面有一個檢查,如果是windows提交查詢的話,需要檢查,沒有就會報空指針異常);

這個錯誤可以google之來修改,這裏不說,下面也就沒有再在這條路下面走了。


(2)寫一個調用程序,運行BeeLine,這個沒有測試。


3.2 linux的eclipse新建hive工程:

建立的工程和windows並無二致,如下:

同樣編寫程序調用CliDriver,Debug運行,如下所示(需要注意我在這裏並沒有配置hadoop相關目錄):


做一個查詢,看是否可以啓動debug模式:


這裏看到的確是進入了debug模式。

如何添加源碼?看下圖



4. 總結:

 (1) hive1.2.1目前使用源碼編譯得到的版本,並不支持hadoop2的調試;(就個人所作的工作的結果來看);

 (2)hive1.2.1使用eclipse調試源碼可以使用新建工程的方式,然後導入官網編譯的hive包及hadoop包進行調試,同時需要注意一般需要在linux環境下調試,如果需要在windows下調試,需要安裝winutils.exe ;


分享,成長,快樂

腳踏實地,專注

轉載請註明blog地址:http://blog.csdn.net/fansy1990

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章