總網頁瀏覽量

2013年9月7日 星期六

windows 7+hbase (0.97)+eclipse (Juno) 在windows 7上用Eclipse跑hbase


壹、所需系統環境配置與軟體
一、JDK1.6

二、Eclipse(Kepler或Juno皆可])

三、安裝maven3.05以及eclipse套件也要plugin maven
(安裝辦法請參考其他網友的blog)


四、安裝JRuby(事後證明不必安裝)
據說是為了下hbase shell指令,因為hbase shell是採用JRuby執行
(但是筆者自己安裝時候沒下載JRuby依然可以用eclipse啟動hbase shell,大概是因為我用maven build時maven已經幫忙下載JRuby的jar檔案了,如下圖)

五、安裝cygwin並且設定環境變數
(安裝方式請參考其他網站,官網有安裝檔案可以一鍵next按到底)
據網友表示這是為了能夠下達start指令啟動hbase
若在eclipse或者命令提示字元maven build有錯時,可以嘗試在cygwin底下build程式。
去pom.xml所在目錄下達指令:mvn clean install -DskipTests
筆者在某些場合windows無法編譯過,所以只好用cygwin編譯了
貳、安裝篇
一、安裝Hbase
1.用svn抓hbase原始碼
位址如下  (位址可能會有變化,請留意)
http://svn.apache.org/repos/asf/hbase/trunk




本案是例載到0.97版的


2. Import "Existing Maven Project"
       a.選擇Hbase source code根目錄,全部打鉤匯入,否則import檔案不全會有錯誤。


b.如果是第一次安裝Maven,在Import時可能會多一個build-helper-maven-plugin,那麼按下一步


c.安裝maven plugin的畫面


d.開始安裝maven plugin,筆者第一次安裝約莫等了十幾分鐘



e.裝完之後的專案架構如下圖。
( i ).    hbase專案是根目錄,裡面已經放一堆.sh檔案、ruby檔案(.rb)、設定hbase-site.xml、regionservers。
(ii)      因為筆者Import進來之後,maven已經自動幫我將source code加進來。所以就不執行Maven generate-sources。如果讀者Import之後裡面沒有src/main/java、src/test/java,也就是沒有.java檔案的話或者懷疑.m2/reposity目錄下少了某些jar檔案,就執行Maven generate-sources,之後執行maven build


3.設定環境變數(設定參數)

( i ). 設定hbase-default.xml
(或者hbase-site.xml,在hbase-site.xml添加參數的話會改寫(override)hbase-default.xml的設定,筆者直接更動hbase-default.xml)
 
必須更動的參數,否則會有bug:
<property>  
  <name>hbase.defaults.for.version.skip</name>
    <value>true</value>
</property>
這個參數必須直接在hbase-default.xml設定


<property>     <name>hbase.rootdir</name>
    <value>file:///D:/Hbase_rootdir</value>
 </property>



另一種安裝順序

1.用SVN抓hbase source code
2.去cygwin編譯Hbase  下指令mvn clean install -DskipTests,這時maven會幫我們將需要的jar檔案下載進.m2/repository/org底下。
3.去Eclipse Import Existing Maven Project(Import 方法一樣)
4.若出現跳脫字元的bug,去程式碼多加一個斜線吧
5.設定環境參數(跟上面設定一樣)




叁、執行篇

一、在eclipse啟動Hbase

1.Run Configuration→新增Java Application→指定Project以及要執行的類別

2. 設定要傳進類別的指令:start

註記:ClassPath、Environment、JRE等項目不必做設定



3. 按下Run
( i ).  如果是第一次在電腦Run可能會出現下圖,關於windows防火牆封鎖的訊息,可以按"取消"沒關係。(紅色的錯誤訊息跟防火牆無關)


(ii).   成功啟動的畫面
   
成功啟動hbase之後,會在hbase.rootdir指定的目錄下產生hbase資料庫檔案,如此一來相當於在windows上建一個hbase。




成功啟動hbase我們可以在瀏覽器打上localhost:60010,可以看hbase的狀態。顯示Master、RegionServer、Table、Task......等訊息。




二、進入hbase shell

1. Run Configuration→新增Java Application→指定Project與Main class



2. 設定要傳給Main的參數,因為hbase shell是靠JRuby運作,所以這邊Program arguments與VM arguments的參數都是指定JRuby的檔案或函式庫

註記:ClassPath、Environment、JRE等項目不必做設定


3. 按下Run
成功啟動進入hbase shell,可以在畫面上打字下指令。
綠色字體是使用者在上面打hbase shell指令。
如果沒有在hbase-default.xml設定hbase.rootdir的話,啟動hbase shell之後下list指令就會一直跑出紅色字體(unable to open socket to .....)

三、Hbase stop
Hbase必須執行stop
最好不可以用terminate方式(按下紅色方形圖案)停止hbase,否則下次會無法正常啟動hbase


肆、注意事項(筆者碰壁筆記):
一、version的問題
Q:如果出現如下訊息file seems to be for and old version of Hbase  (0.97.0-SNAPSHOT),如下圖:

A:必須去hbase-common\src\main\resources\hbase-default.xml
將hbase.defaults.for.version.skip屬性的value改為true



2.在eclipse啟動hbase出現如下錯誤訊息
Q:
Will not attempt to authenticate using SASL 
Unable to open socket to 0:0:0:0:0:0:0:1/0:0:0:0:0:0:0:1:2181

錯誤訊息(1):

INFO zookeeper.ClientCnxn: Opening socket connection to server 0:0:0:0:0:0:0:1/0:0:0:0:0:0:0:1:2181. Will not attempt to authenticate using SASL (無法定位登入配置)
ERROR zookeeper.ClientCnxnSocketNIO: Unable to open socket to 0:0:0:0:0:0:0:1/0:0:0:0:0:0:0:1:2181
WARN zookeeper.ClientCnxn: Session 0x141085eb0250001 for server null, unexpected error, closing socket connection and attempting reconnect
java.net.SocketException: Address family not supported by protocol family: connect
at sun.nio.ch.Net.connect(Native Method)
at sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:532)
at org.apache.zookeeper.ClientCnxnSocketNIO.registerAndConnect(ClientCnxnSocketNIO.java:266)
at org.apache.zookeeper.ClientCnxnSocketNIO.connect(ClientCnxnSocketNIO.java:276)
at org.apache.zookeeper.ClientCnxn$SendThread.startConnect(ClientCnxn.java:958)
at org.apache.zookeeper.ClientCnxn$SendThread.run(ClientCnxn.java:993)
regionserver.HRegionServer$PeriodicMemstoreFlusher: RS:0;YYP-PC:52645.periodicFlusher exiting
INFO regionserver.Leases: RS:0;YYP-PC:52645.leaseChecker closing leases
INFO regionserver.Leases: RS:0;YYP-PC:52645.leaseChecker closed leases

錯誤訊息(2):

INFO regionserver.HRegionServer$PeriodicMemstoreFlusher: RS:0;YYP-PC:52645.periodicFlusher exiting
INFO regionserver.Leases: RS:0;YYP-PC:52645.leaseChecker closing leases
INFO regionserver.Leases: RS:0;YYP-PC:52645.leaseChecker closed leases
INFO zookeeper.ClientCnxn: Opening socket connection to server 127.0.0.1/127.0.0.1:2181. Will not attempt to authenticate using SASL (無法定位登入配置)
WARN zookeeper.ClientCnxn: Session 0x141085eb0250001 for server null, unexpected error, closing socket connection and attempting reconnect
java.net.ConnectException: Connection refused: no further information
at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)
at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:599)
at org.apache.zookeeper.ClientCnxnSocketNIO.doTransport(ClientCnxnSocketNIO.java:350)
at org.apache.zookeeper.ClientCnxn$SendThread.run(ClientCnxn.java:1068)


錯誤訊息(3):

ERROR handler.CreateTableHandler: Error trying to create the table hbase:namespace
java.io.IOException: Target file:/C:/Users/YYP/AppData/Local/Temp/hbase-YYP/hbase/data/hbase/namespace/namespace is a directory
at org.apache.hadoop.fs.FileUtil.checkDest(FileUtil.java:359)
at org.apache.hadoop.fs.FileUtil.checkDest(FileUtil.java:361)
at org.apache.hadoop.fs.FileUtil.copy(FileUtil.java:211)
at org.apache.hadoop.fs.FileUtil.copy(FileUtil.java:163)
at org.apache.hadoop.fs.RawLocalFileSystem.rename(RawLocalFileSystem.java:292)
at org.apache.hadoop.fs.ChecksumFileSystem.rename(ChecksumFileSystem.java:425)
at org.apache.hadoop.hbase.master.handler.CreateTableHandler.handleCreateTable(CreateTableHandler.java:216)
at org.apache.hadoop.hbase.master.handler.CreateTableHandler.process(CreateTableHandler.java:155)
at org.apache.hadoop.hbase.executor.EventHandler.run(EventHandler.java:131)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
at java.lang.Thread.run(Thread.java:662)






A:
在hbase-default.xml更改hbase.rootdir屬性
改成絕對路徑(相對路徑還沒測過)
file:///D:/HbaseZ_rootdir
再重新啟動hbase

註記一:
a.
這問題若沒解決雖然可以進入hbase shell
但是下list指令之後會一直出現
"unable to open socket to 0:0:0:0:0:0:0:1/0:0:0:0:0:0:0:1:2181"訊息

b.曾經根據網路解決方案,試過修改system32/drivers/etc/hosts的IP與主機對應名稱,但此方法對我這案例無效,問題依然存在。

c.如果原始碼已經用maven build過後,電腦主機名稱最好別隨意更改。
如果執意要改電腦名稱,那就改名之後,再用maven build一次,筆者沒試過,不保證會成功。

d.這bug跟似乎防火牆無關,筆者在自家裡試過也出現同樣問題。


註記二:
筆者為了解決bug,曾經更動的地方
1. system32/drivers/etc/hosts
    網路上有說如果遇到unable to open socket to 0.0:0.0.0的bug,可以更改hosts的內容。但是筆者依照網路上所說更動,問題依然存在。最後是設定hbase.rootdir給定絕對路徑問題就解決了,如果用本文方法無法解決那就用網路上的方法更動hosts吧。  

2.zookeeper.quorum,依照預設值localhost。
("hbase.zookeeper.quorum must read 127.0.0.1 because for some reason localhost does not seem to resolve properly on Cygwin"但本案例並非在Cygwin跑hbase所以就不更動啦。依照預設值localhost)




3.regionservers設定檔,維持localhost

附錄:
A.貼上可以成功啟動並執行hbase shell時候的ClassPath配置


B.貼上可以正常執行hbase-server的maven jar檔案配置





Zookeeper設定


我們可以設定zookeeper的檔案存放目錄。
在hbase-default.xml設置 
<property>
<name>hbase.zookeeper.property.dataDir</name>
    <value>D:/zookeeper</value>
</property>
這邊路徑不可以寫成file:///D:/zookeeper





參考網站
http://www.cnblogs.com/shitouer/archive/2012/10/24/2736923.html
http://michaelmorello.blogspot.tw/2012/06/hbase-096-eclipse-maven.html

4 則留言:

  1. 如果是用java7會出現:Missing artifact jdk.tools:jdk.tools:jar:1.6

    記得在pom檔中加入下面這段程式碼

    jdk.tools
    jdk.tools
    system
    ${JAVA_HOME}/../lib/tools.jar


    参考:http://stackoverflow.com/questions/11118070/buiding-hadoop-with-eclipse-maven-missing-artifact-jdk-toolsjdk-toolsjar1

    回覆刪除
  2. 如果你要測試寫道你的本機hbase,可以利用hbase-examples中的org.apache.hadoop.hbase.thrift.DemoClient作簡單的測試。 参數直接下"localhost 9090"但是會直接彈一個錯誤出來給你,查證後原來是thrift的服務器並沒有打開。所以我們再到org.apache.hadoop.hbase.thrift.ThriftServer参數為start來啟動thriftServer這樣就可以做簡單的測試了。
    参考:http://blog.csdn.net/ghychina/article/details/7393045

    回覆刪除
    回覆
    1. 太感謝你的回覆,一開始我個人筆電用java7,這幾天在其他論壇聽說用java7去執行hadoop跟hbase會有問題所以就改用java6!!

      刪除
  3. The import org.apache.hadoop.hbase.tmpl cannot be resolved
    卡住了

    回覆刪除