總網頁瀏覽量

2014年11月2日 星期日

Location計算方法

1. 日誌之外列 location另外算法
讀取到中斷的列不重讀

int oldonelinesize =0;
bool isForwardPart =true;
遇到</log> 讓 isForwardPart=true;  這是考慮到像上次那樣破碎日誌

if(isFullProcessLog ==false && onelinelog.length >  oldonelinesize)
{
//紀錄虛線完整的行是多少字元
 oldonelinesize = onelinelog.length;
}

//該行為虛線且沒有讀取完整
if(isFullProcessLog ==false  && onelinelog.length < oldonelinelogsize)
{
//該行前半部分,不算換行字元
if(isForwardPart==true)
{
location=location+onelinelog.length
isForwardPart=false;

}
//非前半部分,算上換行字元
if(isForwardPart==false)
{
location=location+onelinelog.length+newline
isForwardPart=true;
}

}
else
{
_location=_location+oneline.length+newline
}

2.
有些LogType是以
<!--------------------------->隔開
所以應該要在判斷破裂tag加上 && isProcessFullLog==true



總之虛線行只要是破裂的就不要重讀了
這樣計算方式主要建立在log沒破裂的時候
如果Log有破裂狀況會導致計算location歪掉


另外INIManager要改為非static

2014年7月4日 星期五

解法

sql hbase hive cassandra都印 在report上印出節點數目
http://stackoverflow.com/questions/141993/best-way-to-compare-2-xml-documents-in-java

Document sqlReport ;


節點名稱不同是否equal???


for(int i =0;i<sqlnodeList.length;i++)
{
   sqlnode = sqlnodelist.item(i);

  bool hbase =compare(sqlnode,hbasenodelist)
bool cass = compare(sqlnode,cassnodelist)
}


for(int j =0;j<hbasenodelist.length;j++]){

if(sqlnode.equal(hbasenode[j]))
{
hbaseflag = true;
hbasenodelist.remove(sqlnode)
sqlReport.add(sqlnode);

}

}


if(hbaseflag==false)
{

sqlnode.changeNodeNameAs(hbase);
sqlReport.add(sqlnode)

}

loop最後hbase剩下來的是sql沒有的node
for(剩下hbaseNodlist)
{
所有節點名稱改為<sql>
}


}


}




sqlval=xml2string(sqlxmlDoc);




result[1]=sqlval;
result[2]=hbaseval;
result[3]=cassval;

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年12月20日 星期五

更改命名空間後編譯不過的問題 vs c#

更改命名空間的做法網路上很多教學
這篇記錄更改命名空間後編譯不過的問題

改變命名空間後
要在solution點右鍵選property
設定debug地方只勾選要編譯成DLL的專案
才會編譯成功

2013年10月30日 星期三

C# 序列化 反序列化binaryformatter

序列化目前就筆者所知有三種
一種序列化為binary型式
一種序列化為xml型式
另一種序列化為json型式

其中json型式沒有支援輸出檔案,要自己做
本篇用binaryformat序列化法


    [Serializable]
    class MessageEvent: ISerializable
    {

        public MessageEvent(SerializationInfo info, StreamingContext context) {
          message= (string)info.GetValue("message", typeof(string));
          timestamp = (long)info.GetValue("timestamp", typeof(long));//typeof型態要符合變數型態,否則會報TargetInvocationException
          property = (string)info.GetValue("property", typeof(string));    

        }

         
        public void GetObjectData(SerializationInfo info, StreamingContext context)
        {
info.AddValue("label",variable);
info.AddValue("label",variable);
info.AddValue("label",variable);
   
        }

     
    }



序列化:
            MessageEvent mesEvent= new MessageEvent("hello earth",100L,"new");
            string FILE_DIRECTORY = "D:\\SerializeFile\\";
            DateTime saveNow = DateTime.Now;
            String fileTimestamp = saveNow.ToString(("yyyyMMddHHmmssfff"));
            BinaryFormatter serializer = new BinaryFormatter();
            FileStream file = new   FileStream(FILE_DIRECTORY+fileTimestamp+".txt", FileMode.Create);
            serializer.Serialize(file, mesEvent);
            file.Close();



反序列化:


        public static void DeserializeFile() {
            while (true)
            {
                string[] filesnames = Directory.GetFiles(FILE_DIRECTORY);
                foreach (string filename in filesnames)
                {
                if(File.Exists(filename)){
                 
                    MessageEvent resultMesEvent = null;
                    FileStream file = null;

                    try
                    {


                        BinaryFormatter serializer = new BinaryFormatter();
                        file = new FileStream(filename,FileMode.Open);
                        resultMesEvent = (MessageEvent)serializer.Deserialize(file);
                     
                        Console.WriteLine("Serialize Success");
                    }
                    catch (TargetInvocationException ex) {

                        Console.WriteLine("please check serialized obj construct");
                 
                    }
                    catch (System.IO.IOException ioe)
                    {

                        Console.WriteLine(ioe);

                    }
                    finally {
                        file.Close();
                        File.Delete(filename);//file.Close之後才delete
                     
                         }

                }
             
             
                }

            }
        }
    

C# 列印日期(顯示毫秒)

   DateTime saveNow = DateTime.Now;
            System.Console.WriteLine("step 1: " + saveNow.ToString("yyyy/MM/dd tt hh:mm:ss.fffff"));
            String str = saveNow.ToString(("yyyyMMddHHmmssfff"));
       

2013年10月14日 星期一

Run Flume with Eclipse on Windows

本文是在windows用eclipse啟動flume agent

1.
首先去官方網站下載
flume原始碼,我下載的是flume 1.4版
以existing maven project之姿,匯入eclipse

2.
找到flume-parent
maven編譯之,參數設定如下






4.
修改log4j.properties的設定

flume.root.logger=DEBUG,console
#flume.root.logger=INFO,LOGFILE


5.
找到flume-ng-node的Application.java
run as java application
參數設定如下







6.接著會看到console一直跑下面結果,啟動成功




mvn package -DskipTests -Drat.numUnapprovedLicenses=100

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帳號執行)


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