總網頁瀏覽量

顯示具有 hadoop 標籤的文章。 顯示所有文章
顯示具有 hadoop 標籤的文章。 顯示所有文章

2014年5月2日 星期五

安裝hadoop 單機模式(cdh4.3.0) 未完成

因為電腦配備不夠好所以
改安裝偽分布模式


1.首先安裝jdk 6
2.安裝ssh
3.下載hadoop-2.0.0 cdh4 cloudera


格式化hdfs時候
遇到unable to load native hadoop library for your platform問題
是因為lib/native沒有.so檔案
所以要自個重新編譯一次原始碼

之前我安裝hadoop1.1.2是因為官方已經有附上.so檔案了

前奏
step1:

$ sudo apt-get install g++ autoconf automake libtool make cmake zlib1g-dev pkg-config libssl-dev


安装protobuf过程
protoc --version查看protobuf版本是2.4.1版
所以sudo apt-get autoremove libprotoc7 卸載
接著wget https://protobuf.googlecode.com/files/protobuf-2.5.0.tar.gz 


tar xvf protobuf-2.5.0.tar.gz
cd protobuf-2.5.0
依序執行命令安裝protoc
./configure  --prefix=/usr                 #因為ubuntu預設Lib會裝在/usr/local/lib之下  即使安裝完畢也無法使用protoc指令   所以必須加上 prefix=/usr
make
make check
make install
(如果出現permission denied ,那麼就sudo make install)
("cannot install ............. to a directory not ending in"那麼就打上make clean
重新編譯一次)

protoc--version
確認版本libprotoc 2.5.0


安裝maven
我安裝3.2.1版  下載
apache-maven-3.2.1.bin.tar.gz
解壓縮至/usr/local/apache-maven-3.2.1.bin

環境變數在自己帳號家目錄之下以及root帳號家目錄之下的.bashrc設定
export M2_HOME=/usr/local/apache-maven-3.2.1.bin
export PATH=${M2_HOME}/bin

查看maven版本
mvn -version
編譯遇上問題  protobuf出現錯誤
解決方法如下
https://issues.apache.org/jira/browse/HADOOP-9346
 <dependency>
         <groupId>com.google.protobuf</groupId>
         <artifactId>protobuf-java</artifactId>
拿掉      <version>2.4.0a</version>
加上       <version>2.5.0</version>
       </dependency>
       <dependency>
         <groupId>commons-daemon</groupId>

之後可以編譯了
去hadoop的src目錄之下
編譯指令是mvn compile -Pnative
但過程有出現exception  應該是網路的問題
接著會進入很多個test run要等一陣子
可以休息一下 出去逛個街再回來



格式化過程出現:

[WARN]..........  should be specified as a URI in configuration files. Please update hdfs configuration.


主要是hdfs.site.xml的dfs.name.dir路徑表示方式已經跟舊版不一樣
解決辦法:
<property>

<name>dfs.name.dir</name>

<value> file:/home/useraccount/hadoopfolder/dfs/name</value>

<final>ture</final>

<description>The directories where the namenode stores its persistent matadata.</description>

</property>

啟動hadoop遇到

Class org.apache.hadoop.thriftfs.NamenodePlugin not found


主要是因為hdfs.site.xml我用了官方預設的設定
將namenode與datanode的plugin標籤註解就OK
(我拿etc/hadoop-mapreduce1-pseduo之下的配置檔案
直接套用  結果出現上面bug)


格式化後重啟hadoop遇到
java.io.IOException: Incompatible clusterIDs
然後datanode沒有起來
解法:格式化之前先將 dfs.data.dir的目錄之下所有檔案清空



secondarynamenode出現
“Inconsistent checkpoint fields”的Exception
是因為格式化之前沒有清掉hadoop.tmp.dir目錄下的資料
  此异常即是配置hadoop.tmp.dir参数引起的,在hdfs-site.xml中增加此参数,重新启动集群即可。


若遇到
 java.io.IOException: Failed on local exception: java.io.EOFException; Host Details : local host is: "*******"; destination host is: OOOOOO;
請檢查一下
/etc/hosts

我原本寫
127.0.0.1 localhost之後又寫127.0.0.1 machinename
將後面那個拿掉之後重新格式化、清空dfs.data.dir與hadoop.tmp.dir之嘔
重啟hadoop此exception隨風而逝

不過關閉hadoop仍會出現此exception

2013年10月7日 星期一

Clinet端寫入Buffer

每個put操作都是遠端程序呼叫(Remote procedure call,RPC),將資料從client端傳輸至server並返回。

如果資料傳輸速度1ms那麼表示每秒可以處理1000次往返。

採用buffer方式傳送資料可以減少電腦執行RPC


Hbase Client端預設不使用緩衝區(buffer),
啟用buffer方法如下:
table.setAutoFlush(false);
將autoflush設定為false
如此一來可以將資料寫入client端的buffer
如果要強迫將資料寫入hbase時,呼叫
void flushCommits() throws IOException

刷新buffer兩種方式:
1.Explict flush(明確刷新):
直接在程式中呼叫flushCommets()

2.Implict flush(隱含刷新)
當呼叫put()或者setWriteBufferSize()會觸發flushCommits()
HTable的close() method也會觸發刷新



Configuration conf = HBaseConfiguration.create();

 HBaseHelper help = HBaseHelper.getHelper(conf);
 help.dropTable("usertable");
 help.createTable("usertable", "cf1","cf2","cf3");

    HTable table = new HTable(conf,"usertable");
    System.out.println("Auto Flush:"+table.isAutoFlush());
    table.setAutoFlush(false);
    KeyValue kv = new KeyValue(Bytes.toBytes("RK1"),Bytes.toBytes("cf1"),Bytes.toBytes("qual"),Bytes.toBytes("value"));
   
    Put put1 = new Put(Bytes.toBytes("RK1"));
    put1.add(kv);
    table.put(put1);
   
    Put put2 =new Put(Bytes.toBytes("RK2"));
    put2.add(Bytes.toBytes("cf1"),Bytes.toBytes("quali1"),Bytes.toBytes("val2"));
    table.put(put2);
   
    Get get =new Get(Bytes.toBytes("RK1"));
    Result result = table.get(get);
    System.out.println("FirstResult"+result);
   
    table.flushCommits();
    Result res2 =table.get(get);
    System.out.println(res2);
   
    table.close();


注意客戶端程式不可以中途中斷
否則緩衝區的資料可不會自己跑去Hbase

hbase program雜記&KeyValue類別

Configuration conf =HBaseConfiguration.create();
這行程式碼背後運作是使用當前java類別路徑,加載hbase-default.xml,hbase-site.xml組態檔。


HBase可以對每個columnfamily儲存多個版本,每個版本用timestamp,並用降冪順序來儲存他們。timestamp型態是long,單位是毫秒,紀錄的時間是從1970年1月1日開始到今天的時間。
所以必須確保server擁有正確的時間且彼此是同步的

當有資料匯入Hbase,若不在Client端指定時間,則會以server時間為準。

例子:
先匯入rowkey為rk1, columnfamily1為cf1的一筆資料
put 'usertable','rk1','cf1','vlaue1'
0 row(s) in 0.2300 seconds

再匯入同樣columnfamily與rowkey的資料,value不一樣
put 'usertable','rk1','cf1','ddddd'
0 row(s) in 0.0100 seconds


打上scan table只會列出最新版本的資料
scan 'usertable'

ROW  COLUMN+CELL
 rk1 column=cf1:, timestamp=1381154563122, value=ddddd
1 row(s) in 0.0260 seconds

指定列出版本數就會列出過去曾經匯入的紀錄
scan 'usertable',{VERSIONS => 3}

ROW  COLUMN+CELL
 rk1 column=cf1:, timestamp=1381154563122, value=ddddd
 rk1 column=cf1:, timestamp=1381154533794, value=vlaue1
1 row(s) in 0.0220 seconds


scan 'usertable',{VERSIONS => 2}

ROW  COLUMN+CELL
 rk1 column=cf1:, timestamp=1381154563122, value=ddddd
 rk1 column=cf1:, timestamp=1381154533794, value=vlaue1
1 row(s) in 0.0230 seconds


KeyValue類別是很重要的API
Hbase Client很常用
用來包裝"資料"以及"特定儲存單元的位置",位置可以是rowkey,column family名稱,column qualifier以及timestamp,KeyValue提供大量constructor供各位使用。長相大致這樣:KeyValue(byte[] row,int offset,int rowlength);
在Hbase0.97板之後KeyValue改名為Cell

KeyValue提供大量implement Comparator的內部class。

KeyValue裡面的method可以用來比較部分已儲存的資料以及確定其類型....and so on.





2013年10月4日 星期五

在windows上跑Hbase書上範例程式

本文適合想在(或只能在)windows上練習hbase程式的觀眾


"HBase技術手冊"這本書程式都是零散的片段,
不親自跑他的程式還真不知道作者在講什麼
那種感覺就像看一本沒有圖片、沒有地圖的旅遊書籍
裡面詳細介紹紫禁城
看完書之後立刻把你丟到紫禁城的太和殿
城內沒有路標情況下,你仍然不會知道怎樣走到乾清宮

步驟:


1.參考下面連結文章在windows裝上Hbase0.94.4
(別裝0.97因為API跟書上的有出入)

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

http://yehyenping.blogspot.tw/2013/09/windowshbaseeclipse.html


裝完之後打開run hbase起來


2. check out Hbase範例程式,匯入eclipse有裝hbase的workspace
https://github.com/larsgeorge/hbase-book


3.將範例程式碼package複製貼上到src/main/java底下去跑就可以了


PutExample.java這個範例跑完
可以打開hbase shell
下指令查看是否有建立table以及table已經有存放row了


2013年9月19日 星期四

Run YCSB on Windows7 with Eclipse 在windows 7 上跑YCSB

終於讓筆者給弄出來了

這樣不用linux也能在windows上跑hbase、YCSB啦
(各位如果能在linux上裝eclipse跑就在linux上面跑吧,因為hbase跟YCSB原本就是要在linux上跑的嘛!!!!)


這篇文章所說的YCSB以及HBase都在Windows上運作,只用Eclipse這個工具啟動他們。

因為YCSB原本是用來測試Hbase0.94.4,筆者另外在自己windows電腦安裝hbase0.94.4,安裝方法其實跟筆者之前安裝hbase0.97差不多。

這樣可以當練習專用的hbase。

其實Hbase0.96之後的API有大幅更動,所以想翻閱聖經本對照source code學習hbase會有困難度,因為課本裡面很多API在Hbase0.96已經消失了........= =

那麼咱正式進入安裝的步驟吧!!!!!
=================================================================
前提:用Eclipse啟動Hbase0.94.4,並建立名稱為usertable的表格,這個表格有三個columnfamily。
(You must run Hbase0.94.4 with Eclipse on Windows,and create a table named 'usertable'.

create 'usertabble','f1',f2','f3'
(不一定要三個columnfamily)


1. 用SVN check out YCSB 0.1.4
2. Import Existing Maven Project,匯入完畢專案架構如下圖,root是所有專案的根目錄。將root專案編譯表示也將其他專案編譯的意思。


3.設定環境變數(configurate variable)

a.將hbase-site.xml換成你正在使用的hbase裡面的hbase-site.xml檔案
我使用的是hbase0.94.4,而且都在hbase-default.xml設定參數,所以我將hbase-default.xml複製到YCSB的hbase-binding的conf之下,然後將檔案改名為hbase-site.xml。

b.在hbase-binding的pom.xml設定採用的hbase與hadoop版本
筆者採用hbase 0.94.4版    hadoop 1.0.4版

c. 設定root目錄之下的pom.xml ,如圖所示。
設定這邊是為了統一hbase-bind專案底下的jar包都採用slf4j-api-1.6.4、slf4j-log4j12-1.6.4。不這樣做的話會出現錯誤訊息告知你的slf4j的jar包太舊。


4.編譯專案,我這次在cmd編譯的,eclipse沒試過。
mvn package -DskipTests

如果編譯出現如下問題
at
org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java

從網路聽說mvn.bat檔案之中加上以下這行
set MAVEN_OPTS=-Xmx512m -Xms128m -Xss10m
改變JVM的記憶體配置會過。筆者也過了

上圖是cygwin的錯誤結果,筆者未設定JVM記憶體配置之前在cmd也曾發生同樣錯誤,


這個錯誤訊息在app4u是說:
"This is due to different incompatible versions of a library. The jar file that contains org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext()Z is not present on your classpath. However there is a different version of the same jar on the classpath."
網站如下:
http://solutions.apps4u.co/en/class/org.codehaus.plexus.archiver.AbstractArchiver$1/method/hasNext/()Z/error/java.lang.NoSuchMethodException/

我依照這網址的方法照做,但是問題依然存在。

5.執行YCSB

a.如圖所示


b.這邊workloads是相關參數設定檔案,其他jar包必須加入classpath,如圖所示,否則YCSB會抗議。
上圖是筆者原本安裝的classpath配置。
其實jar檔案只留下hbase-binding跟hadoop-core即可(感謝120的留言提醒),但是記得要在root的pom.xml加上這麼一段。

    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>1.6.4</version>
    </dependency>
     <dependency>  
     <!-- 以下是我自己加上 -->
        <groupId>org.slf4j</groupId>  
        <artifactId>slf4j-log4j12</artifactId>  
        <version>1.6.4</version>  
      </dependency>

要確認slf4j版本有沒有正確配置,請各位看倌打開root目錄下的pom.xml  選擇Dependency Hierachy,在右上角搜尋slf,請對照圖中使用的slf4j-api以及slf4j-log4j12的版本
所有的jar檔案採用的slf4j的jar檔案必須都採用同樣版本編譯。

c.Arguments設定:




 6.大功告成







參考網站:
http://cloudfront.blogspot.tw/2013/02/how-to-benchmark-hbase-using-ycsb.html#.UjhVwsZHIZ4
(PS:網站掛點小密技或者有些網站在某些地方會被擋住,各位可以將網址貼到wayback machine搜尋,如此一來就可以搭時光機回去看網站內容)

2013年9月10日 星期二

maven build錯誤解決辦法

1.如果在執行hbase或者執行maven,遇到與jar檔案有關的bug時候,那麼就重新build一次,要build之前可以去.m2/repository/org下所對應的資料夾砍掉再重新build一次。
例如:
出現jruby-complete-1.6.8.jar檔案的bug
那麼就去
C:\OOXXX\.m2\repository\org\jruby\jruby-complete
將1.6.8資料夾刪掉之後再重新build


2.如果在eclipse或者cmd上maven build錯誤,可以嘗試著在cygwin之下做maven build。




===============================================================




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

2013年8月23日 星期五

下jps指令Datanode沒出現

下jps指令
沒有出現Datanode

查看log
是因為沒找到hdfs底下某樣檔案
而且又是權限問題

解法:
將hdfs資料全刪掉,重新格式化一次hadoop

Format hadoop出現錯誤cannot remove current directory

cannot remove current directory
因為我將haoop放在根目錄之下
可能是沒有權限刪除檔案的關係


手動刪除之後再格式化就得了

2013年7月17日 星期三

安裝HBase

版本問題:
"據說"跟hadoop1.1.2匹配的是hbase0.95.0,hadoop1.0.?與hbase0.94.7匹配
一切依照下載後的hbase lib目錄下的hadoop-core-x.x.x.jar版本編號

依照過去安裝NS2+MOVE+SUMO經驗
最好還是別總是用最新版本的系統
否則會有不相容的問題

1.下載hbase-0.96.cdh4.3.0版本(配合hadoop 2.0.0 cdh 4.30)
2.解壓縮
3.設定hbase.site.xml
4.(依照白皮書所做)
修改/etc/security/limits.conf
增加
hadoop(使用者帳號)   -   nofile 32768

在/etc/pam.d/common-session
最後一行增加
session required pam_limits.so




孜孜科(待續



在Hbase無法啟動並警告說無法找到安裝的java時候
編輯conf/hbase-env.sh檔案,刪除JAVA_HOME這行註解符號
並將此行所指定的Java路徑修改為你所安裝的java路徑

Error:JAVA_HOME is not set and java could not be found


啟動hbase之後查看master node log

INFO org.apache.hadoop.hbase.catalog.CatalogTracker: Failed verification of .META.,,1 at address=.......................................; org.apache.hadoop.hbase.NotServingRegionException:


主要是因為conf/hdfs-site.xml裡面的xceivers至少要4096
我寫1024這樣是不夠的

2013年7月2日 星期二

eclipse啟動DHFS

4.从CMD进入到src\contrib\eclipse-plugin目录,执行以下命令:eclipse.home=D:/eclipse/需要指定你eclipse的安装目录version=0.20.2-cdh3u3 是你的hadoop版本 ant -Declipse.home=D:/eclipse/ -Dversion=0.20.2-cdh3u3 jar 会在build\contrib\eclipse-plugin生成jar文件,但这时还不可以用。否则会出现错误: An internal error occurred during: "Map/Reduce location status updater". org/codehaus/jackson/map/JsonMappingException An internal error occurred during: "Connecting to DFS myhadoop". org/apache/hadoop/thirdparty/guava/common/collect/LinkedListMultimap 5.还要从{hadoop根目录}/lib下,找到jackson-core-asl-1.5.2.jar,jackson-mapper-asl-1.5.2.jar,guava-r09-jarjar.jar把他们都解压出来放入刚生成的hadoop-eclipse-plugin-0.20.2-cdh3u3.jar classes目录下(可以通过winrar直接拖进去) 6.最后,把hadoop-eclipse-plugin-0.20.2-cdh3u3.jar放进eclipse的dropin目录,重启eclipse就可以了。 PS:本来想把这些包拷贝进lib目录下,然后改MANIFEST.MF,发现打死不可以。。不知道为什么 Filed under: Hadoop, Java Tagged: CDH3u3, eclipse

hadoop eclipse plugin 1.1.2

據說舊版的(0.x.x)hadoop有附送eclise-plugin.jar
不過從1.X.X板之後就沒了
每個eclipse不一定跟hadoop相容
所以開發者就自己必須更改相關參數自建jar啦

hadoop(1.1.2)的eclipse-plugin放在hadoop家目錄下的src/contrib/路徑中
如果直接將eclipse-plugin資料夾複製到eclipse的plugin之下
eclipse仍然不能使用hadoop外掛套件



首先確認ubuntu已經安裝ant
本人很懶
所以直接用
sudo apt-get install ant
安裝ant

設定過程請參閱
中國blog


之後
進入haoop/src/contrib/eclipse-plugin目錄打上ant

最後在hadoop/build/contib/eclipse-plugin目錄生會看到打包好的hadoop-eclipse-plugin-1.1.2.jar

將這個檔案丟到eclipse的plugins資料夾裡即可


打開eclipse之後,卻出現Unsupported major.minor version 51.0錯誤
點開log訊息意思是說
有些jar是用jdk1.6.0_27編譯而成
有些是用jdk1.7.25編譯而成

查看eclipse-plugin-1.1.2.jar包裡面所有的MANIFEST.MF文件
裡面有些jar採用jdk1.5 jdk1.4編譯而成
沒道理jdk1.5 jdk1.4沒有出現錯誤訊息
而jdk1.6卻給我出現錯誤訊息
所以我猜應該不是eclipse採用的jdk版本與ubuntu系統採用jdk版本不一樣


後來發現
用root帳號打上java -version
root採用的是ubuntu內建的openjdk(版本是1.6.0_27)
版本號碼跟eclipse出現的error log完全一樣
所以我猜應該是
在利用ant打包時候某個時段採用了以root身分採用內建的1.6.0_27打包jar
root跟使用者帳號採用的jdk版本不一樣,編譯出來的jar不被eclipse接納

解決方法:
用root帳號在terminal打上update-alternatives --config java
出現以下畫面


選擇自己安裝的jdk




最後再次使用ant打包eclipse-plugin
(以hadoop帳號執行)


終於,
千呼萬喚始出來......................






2013年7月1日 星期一

跑MapReduce測試Hadoop

使用 Hadoop 內建的 WordCount 程式來跑看看 Hadoop 的 Map/Reduece。


在hadoop home目錄之下建立wordcount_folder
 mkdir wordcount_folder

進入wordcount_folder
cd wordcount_folder/

建立檔案input_file1,input_file2並輸入文字
echo "hello world" >> input_file1
echo "8181 hadoop" >> input_file2
(我這裡登入root才能建立文字檔案)

 回 hadoop 主目錄,輸入 $bin/hadoop dfs -put ./wordcount_folder input 指令,將剛剛建立的兩個文字檔當作 Map/Reduce 的輸入檔案,此指令是將檔案放到HDFS上。
 bin/hadoop dfs -put ./wordcount_folder input
(這邊用root帳號無法操做,必須回到hadoop帳號,因為我將檔案放在根目錄之下)

使用 hadoop-examples-1.1.2.jar 的wordcount method 來計算輸入檔案的內的每一個字的出現次數
 bin/hadoop jar hadoop-examples-1.1.2.jar wordcount input output




打開Browser進入Hadoop管理介面
查看執行結果


VirtualBox 既有虛擬硬碟vdi,創造新的虛擬機器 &網路設定

切記不可以直接複製vdi
否則會因為uuid相同而衝到

必須利用VBoxManage.exe這個工具複製vdi
才可以,因為會自動更新uuid
VBoxManage.exe放在
    "c:\Program Files\Oracle\VirtualBox\VBoxManage.exe"


1.
打開cmd
去VirtualBox資料夾底下
在cmd螢幕上打
    VBoxManage.exe  clonevdi <既有的vdi檔案路徑>  <新的vdi檔案路徑>

2.使用VirtualBox選擇新增,將vdi掛載進去
  新增時,切記選使用已存在的硬碟檔案,
否則系統會產生新的vdi檔案,就必須重灌系統



如果更新網卡IP後
仍然無法對外連線
出現network is unreachable
那麼
sudo su
rm /etc/udev/rules.d/70-persistent-net.rules
reboot

因為新的VM的MAC跟舊的一樣
如果只更動網卡IP
則70-persistent-net.rules裡面資料仍是舊的








2013年6月29日 星期六

Hadoop安裝(初步完成) hadoop 1.1.2版

共有三台VM機器,一台Master,兩台Slave
所有過程都由名稱為hadoop的帳號完成
以確保建立的資料擁有者一致

Ubuntu 12.04 LTS版本  32bit(如果是64bit 很有可能遇到unable to load hadoop native lib 要重新去抓hadoop原始碼重新編譯成jar包)
JDK6
hadoop 1.1.2


前言

安裝hadoop 步驟很繁瑣


安裝前

關閉防火牆
 sudo ufw disable,關閉ufw

第一步安裝JDK6

(過程寫在另外文章  標題是寫安裝jdk7  不過最好安裝jdk6)

(有些文章在.bashrc
加上export HADOOP_HOME = /usr/local/hadoop
主要目的是之後要加上
export $HADOOP_HOME/bin
想要使用bin之下的.sh檔案
)

第二步安裝ssh-server並設定不用密碼可登入ssh
(過程寫在另外文章)
hadoop使用ssh來實現cluster中各node的登錄認證



第三步新增網卡 static
(過程寫在另外文章)



第四步安裝hadoop
安裝穩定版本
1.1.X - current stable version, 1.1 release

下載hadoop
hadoop-1.1.2.tar.gz
放在home目錄

解壓縮
tar zxvf hadoop-1.1.2.tar.gz
更改資料夾名稱,好方便管理
mv hadoop-1.1.2 hadoop
將資料夾搬到/usr/local/之下
mv hadoop /usr/local/   (使用者安裝程式都放這裡)


第五步:
1.
在/usr/local/底下新增一個存放紀錄hadoop運作過程的file
(待確認這資料夾功能)
sudo mkdir hadoopDir
因為建立之後檔案擁有者是root,所以要更改檔案擁有者
sudo chown -R hadoop:hadoop hadoopDir
(sudo chown -R 帳號名稱:帳號名稱  資料夾名稱,-R是連同裡面檔案通通變更擁有者)


2.
在/opt底下新增一個存放hadoop備份資料的資料夾
sudo mkdir hadoopDir
sudo chown -R hadoop:hadoop hadoopDir
(sudo chown -R 帳號名稱:帳號名稱  資料夾名稱,-R是連同裡面檔案通通變更擁有者)



第六步:修改部署檔案

1. 修改家目錄之下的.bashrc
在export PATH=.....這行添加上 :/usr/local/hadoop/bin
這樣終端機可以恣意使用usr/local/hadoop/bin的指令惹

2.修改/usr/local/hadoop/conf/hadoop-env.sh(Hadoop運行時所用到的環境變數)
加入java路徑
         找到#export JAVA_HOME=........,改上java的路徑
         改後結果應為:
         export JAVA_HOME=/usr/lib/jvm/jdk7

3.修改/usr/local/hadoop/conf/core-site.xml: Hadoop核心的組態設定,例如HDFS和MapReduce共通的I/O設定


 <configuration>
     <property>  
        <name>fs.default.name</name>  
        <value>hdfs://HadoopNameNode1:9000</value>    (HadoopNameNode1主機名稱,9000是port碼)
     </property>  
 <property>
    <name>hadoop.tmp.dir</name>
    <value>/usr/local/hadoopDir/hadoop-${user.name}</value>
  </property>
(暫存資料夾)
     </configuration>


4.
hdfs-site.xml: HDFS背景服務的組態設定:namenode,datanodes,secondary namenode

<configuration>

<property>
<name>dfs.name.dir</name>
<value></value>
</property>

<property>
<name>dfs.data.dir</name>
<value></value>
</property>

<property>
<name>fs.checkpoint.dir</name>
<value></value>  #默认是3份
</property>


</configuration>

5.mapred-site.xml: MapReduce的背景服務的組態設定:jobtracker,tasktrackers

<configuration>  
          <property>  
            <name>mapred.job.tracker</name>  
            <value>HadoopNameNode1:9001</value>(HadoopNameNode1是主機名稱,9001是埠號)  
          </property>  
          <property>  
            <name>mapred.local.dir</name>
 <value>/usr/local/hadoopDir/mapred/local,
/opt/hadoopDir/mapred/local</value></property>

          <property>  
            <name>mapred.system.dir</name>
            <value>/usr/local/hadoopDir/mapred/system,
/opt/hadoopDir/mapred/system</value>
          </property>


        </configuration>

6.master:一行代表一個運行namenode的主機清單,可以設定多個
(表示secondary namenode)
將localhost改為linux自己的主機名稱


7.slaves:一行代表一個運行datanode和tasktracker的主機清單
將localhost拿掉(如果NameNode也想兼任DataNode的話就改成主機名字)
加上DataNode主機名稱
HadoopDataNode1
HadoopDataNode2



第七步:建立其他的node
因為ssh公鑰匙同一把
且hadoop環境設定一致
所以採用複製方式建立node

複製HadoopNameNode1虛擬硬碟
建立HadoopDataNode1與HadoopDataNode2
(筆者使用VirtualBox所以複製時必須更替uuid)
建立之後網卡設定跟HadoopNameNode1衝突
所以更改HadoopDataNode1與HadoopDataNode2的網卡設定
ssh測試看看互相能否登入
以及確保ping的到8.8.8.8

第八步:

hadoop namenode -format
格式化

(好像只有NameNode需要format而已)

















第九步:
NameNode啟動hadoop
指令:start-all.sh
之後會依序啟動NameNode與DataNode


第十步:驗證
1.分別在NameNode與DataNode打上jps
(可以在NameNode使用ssh登入DataNode後再打jps)
查看啟動什麼服務







2.
在NameNode打上
hadoop dfsadmin -report
看看有多少個datanode在運行



3.
在NameNode主機打開browser
打上localhost:50070/dfshealth.jsp
進入hadoop管理介面


4.
在NameNode主機打上
localhost:50030/jobtracker.jsp
進入mapreduce網頁管理介面