clean이 추가된 hbase 파일 

http://svn.apache.org/viewvc/hbase/branches/0.95/bin/hbase?view=diff&r1=1478963&r2=1478964&pathrev=1478964


+  if [ $# -ne 1 -o "$matches" = "" ]; then
+    echo "Usage: hbase clean (--cleanZk|--cleanHdfs|--cleanAll)"
+    echo "Options: "
+    echo "        --cleanZk   cleans hbase related data from zookeeper."
+    echo "        --cleanHdfs cleans hbase related data from hdfs."
+    echo "        --cleanAll  cleans hbase related data from both zookeeper and hdfs."
+    exit 1;
+  fi


추가된 clean-up 파일
http://svn.apache.org/viewvc/hbase/trunk/bin/hbase-cleanup.sh?view=markup

Posted by '김용환'
,

[hbase] ACID in HBase

nosql 2013. 4. 29. 18:30


Hbase진형에서 ACID 관련 질문시, 3개의 문서를 공유해준다. (users@


1. ACID-semantics 

Hbase문서 - Hbase에서 간단하게 usage에 대한 설명 


2. ACID in Hbase (http://hadoop-hbase.blogspot.kr/2012/03/acid-in-hbase.html)

그나마 deep하게 잘 나온 블로그 내용.(개인)


재미있는 부분만 발췌

The highlevel flow of a write transaction in HBase looks like this:
  1. lock the row(s), to guard against concurrent writes to the same row(s)
  2. retrieve the current writenumber
  3. apply changes to the WAL (Write Ahead Log)
  4. apply the changes to the Memstore (using the acquired writenumber to tag the KeyValues)
  5. commit the transaction, i.e. attempt to roll the Readpoint forward to the acquired Writenumber.
  6. unlock the row(s)

The highlevel flow of a read transaction looks like this:
  1. open the scanner
  2. get the current readpoint
  3. filter all scanned KeyValues with memstore timestamp > the readpoint
  4. close the scanner (this is initiated by the client)

.....

Note that a reader acquires no locks at all, but we still get all of ACID. It is important to realize that this only works if transactions are committed strictly serially; otherwise an earlier uncommitted transaction could become visible when one that started later commits first. In HBase transaction are typically short, so this is not a problem. HBase does exactly that: All transactions are committed serially.

....

added with HBASE-2856, which allowed HBase to support ACID guarantees even with concurrent flushes.
HBASE-5569 finally enables the same logic for the delete markers (and hence deleted KeyValues).
....





3. ACID

Hbase문서 - Hbase acid





Posted by '김용환'
,


HBase의 Zookeeper의 역할은 주로 replication이나 failover에 중요한 역할로 알려져 있다.


Zookeeper plays a key role in HBase Replication, where it manages/coordinates almost all the major replication activity, such as registering a slave cluster, starting/stopping replication, enqueuing new WALs, handling regionserver failover, etc. 


출처 : http://blog.cloudera.com/blog/2012/07/hbase-replication-overview-2/



최근 hbase 에 zookeeper에 read/write locks을 할 수 있도록 0.95.0에 반영되었다. 0.95.0이후 버전을 사용하는 경우 lock기능이 작동된다. 


HBASE-7305. ZK based Read/Write locks for table operations  


zookeeper를 이용해 table operation시 locking하는데 사용한다. master가 table schema 변경시 동기(sync)를 지원한다. 


Hbase설정에 따르면, 기본적으로 zookeeper를 lock용으로 쓰고 있음을 확인할 수 있다. 


hbase.table.lock.enable

Set to true to enable locking the table in zookeeper for schema change operations. Table locking from master prevents concurrent schema modifications to corrupt table state.

Default: true




참고로 Row locks 을 쓴다고 해서 Zookeeper를 사용하지 않는다. 왜냐하면 구현상 하나의 row는 하나의 Region서버에 저장하기 때문이다. 이는 분산락(distributed lock)이 필요없다는 것이다. 따라서 대신 빠른 성능을 줄 수 있다.  또한, Region 서버가 새롭게 만들어지거나 재시작할때 row lock은 동작되지 않는다. 개런티를 전혀 할 수 없다.  


그래서, Client코드에서 API(ClientProts, HTable 등등)를 통해서 lockRow, unlockRow하는 코드는 사라졌다. 


출처 : https://issues.apache.org/jira/browse/HBASE-7315





Posted by '김용환'
,

[Hbase] 버전별 성능

nosql 2013. 4. 25. 17:58



출처 : 

http://grokbase.com/t/hbase/dev/134hk6vw53/vote-the-1st-hbase-0-94-7-release-candidate-is-available-for-download



아래 PDF를 보면 최근 hbase 버전에 따른 성능을 확인할 수 있다. 


http://www.spaggiari.org/media/blogs/hbase/pdf/performances_20130418.pdf


요약본)

* 실행환경

- 9대 서버에서 테스트 (1대 master, 8대 slave)

- default balancer

- major compaction 실행

IntegrationTestBigLinkedList 테스트

* 0.90, 0.92, 0.94, 0.95. 0.95이후의 trunk

- scan range 가 3% 정도 느림

- Random read 7% 빠름

- random write 7% 느림


Posted by '김용환'
,


Hbase 메일링 리스트를 보면 대부분의 User들이 Region Server의 compation과 Hotspotting때문에 고생을 한다. 언젠가 부딪힐 수 있는 부분이라서 정리를 해본다.


Hbase 가이드에 따르면 샤딩해놓은 Region 서버를 미리 만들어 널널하게 데이터들을 분배할 수 있도록 하라고 한다. (pre creation) 마치DB 파티셔닝 정책과 비슷하다. 


보통은 Sequential key단위로 row를 Hbase에 저장하면,  하나의 Region Server에 몰릴 수 있다. 따라서 Key를 Sequential하지 않게 만드는 경우도 빈번하다.

이 방법을 해결하기 위해서는 2가지 정도가 쓰였던 것 같다. 


첫번째,  000001:key, 0000002:key 와 같이 key를 같이 쓰는 형태로 쓰게 된다. 대신 적절하게 key-value를 분산할 수 있지만 Range  Scan시 fully search하게 되니. Hbase에 큰 부하를 주게 한다.


두번째, consistent hashing key를 Hbase의 row로 사용하는 방식인데. 이 방법은 진짜 hashing은 되지만 Range는 도저히 쓸 수 없는 형태가 된다. 그렇지만 Region Hotspotting 을 피할 수 있게 된다. 


Range 검색도 쉽게 되게 하고 Hotspotting을 피하는 방법이 있나 궁금했었는데..

sematext.com 라는 빅데이터 분석 및 솔루션 판매 회사에서 기술 블로그에서 간단히 공유된 팁이 있어서 공유하고자 한다. 


http://blog.sematext.com/2012/04/09/hbasewd-avoid-regionserver-hotspotting-despite-writing-records-with-sequential-keys/


자세한 내용은 직접 보는 것이 좋을듯 하다.




Sequential Key를 row에 넣으면 특정 Region이 튀는 현상이 발견된다. 




아래 식을 이용해서 sequential key를 bucket number, 즉 저장 단위별로 %로 나누어 저장하게 한다. 

new_row_key = (++index % BUCKETS_NUMBER) + original_key





이렇게 함으로서, 데이터를 분산하여 cpu 튀는 현상이 없도록 했다. 





Scan시 병렬로 읽기 때문에 큰 성능 저하는 없었다고 한다.


이를 바탕으로 hbaseWD (https://github.com/sematext/HBaseWD) 라는 오픈 소스를 공유했다.



예를 들어, 32 buckets으로 나누고. 분산화된 키를 가지고 저장(Put)한다.


 byte bucketsCount = (byte) 32; // distributing into 32 buckets

    RowKeyDistributor keyDistributor =

                           new RowKeyDistributorByOneBytePrefix(bucketsCount);

    for (int i = 0; i < 100; i++) {

      Put put = new Put(keyDistributor.getDistributedKey(originalKey));

      ... // add values

      hTable.put(put);

    }

    

    

Scan을 진행하는 코드이다. 


       Scan scan = new Scan(startKey, stopKey);

    ResultScanner rs = DistributedScanner.create(hTable, scan, keyDistributor);

    for (Result current : rs) {

      ...

    }

    

    


Scan한 결과를 가지고 Map-Reduce를 진행할 수 있다.


      Configuration conf = HBaseConfiguration.create();

    Job job = new Job(conf, "testMapreduceJob");


    Scan scan = new Scan(startKey, stopKey);


    TableMapReduceUtil.initTableMapperJob("table", scan,

      RowCounterMapper.class, ImmutableBytesWritable.class, Result.class, job);


    // Substituting standard TableInputFormat which was set in

    // TableMapReduceUtil.initTableMapperJob(...)

    job.setInputFormatClass(WdTableInputFormat.class);

    keyDistributor.addInfo(job.getConfiguration());

    




HbaseWD의 실제 코드는 그리 많지는 않고.. 현재는 업데이트 되는 것 같지는 않다 ^^;


https://github.com/sematext/HBaseWD/tree/master/src/main/java/com/sematext/hbase/wd



Posted by '김용환'
,


0. 설치 버전

Hadoop 1.0.4

ZooKeeper 3.4.5

HBase 0.94.6




1. Hadoop 먼저 설치 하기


1) 구성


** 특징별 구분 

1번 서버 (Master, 1.1.1.1): NameNode, Job Tracker 

2번 서버 (Slave, 1.1.1.2) : Secondary Name Node, DataNode, TaskTracker

3번 서버 (Slave, 1.1.1.3) : DataNode, TaskTracker


 

2) bashrc 설정 수정 


$ vi .bashrc


export JAVA_HOME=/app/jdk

export HADOOP_HOME=/app/hadoop

HADOOP_HOME_WARN_SUPPRESS=1

export HADOOP_HOME_WARN_SUPPRESS

PATH=$PATH:$HADOOP_HOME/bin



HADOOP_HOME_WARN_SUPPRESS 의 값이 지정되어야 HADOOP_HOME이 deprecated가 되지 않았다고 뜸

(Warning: $HADOOP_HOME is deprecated.)




3) java 설치

알아서..


4) ssh 연동 설정

ssh 기반으로 hadoop을 운영한다. 


* 1번서버


$ ssh-keygen -t rsa -f ~/.ssh/id_rsa

Generating public/private rsa key pair.

Enter passphrase (empty for no passphrase):

Enter same passphrase again:

Your identification has been saved in /home/www/.ssh/id_rsa.

Your public key has been saved in /home/www/.ssh/id_rsa.pub.

The key fingerprint is:

87:39:e8:fd:87:05:96:48:e5:02:a3:4c:19:51:6e:c9 www@HBASEtest-dev1

The key's randomart image is:

+--[ RSA 2048]----+

|    +=+  ..      |

|   o.+ +..       |

|    o E.....     |

|     . ..++      |

|      . S...     |

|     . . o  .    |

|      . .  o     |

|         .. .    |

|          ..     |

+-----------------+



* 2, 3번 서버에서 작업



ssh key generation후 authorized keys에 복사


$ ssh-keygen -t rsa -f ~/.ssh/id_rsa


$ cat ~/.ssh/id_rsa.pub  >> ~/.ssh/authorized_keys





2,3번 서버의 공개키를 1번 서버의 authorized_keys로 복사


www@HBASEtest-dev1:/home/www>$ ssh www@1.1.1.2 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys


www@HBASEtest-dev1:/home/www>$ ssh www@1.1.1.2 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys






1번서버의 authorized_keys를 2,3번 slave에 복사


$ scp .ssh/authorized_keys  www@1.1.1.2:~/.ssh/authorized_keys


$ scp .ssh/authorized_keys  www@1.1.1.2:~/.ssh/authorized_keys



이렇게 해서 1,2,3번 서버는 ssh연결시 no password인증이 되어 쉽게 사용가능하다.





5) 설정 변경


* 다운로드

http://hadoop.apache.org/releases.html


* 1번서버에서 수정

$ vi conf/hadoop-env.sh

export HADOOP_HEAPSIZE=500


$ vi conf/slaves

1.1.1.2

1.1.1.2


$ vi conf/masters

1.1.1.1



$ vi core-site.xml

..

<configuration>

    <property>

        <name>fs.default.name</name>

        <value>hdfs://1.1.1.1:9000</value>

    </property>

</configuration>



slave는 2대, master는 1대이므로 replication수는 2로 한다.


$ vi hdfs-site.xml


<configuration>

  <property>

         <name>dfs.replication</name>

         <value>3</value>

     </property>

     <property>

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

             <value>/app/hadoop/work/name</value>

     </property>

    <property>

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

         <value>/app/hadoop/work/data</value>

     </property>

     <property>

         <name>dfs.support.append</name>

         <value>true</value>

     </property>

</configuration>



$ vi mapred-site.xml


<configuration>

        <property>

        <name>mapred.job.tracker</name>

        <value>1.1.1.1:9001</value>

    </property>


    <property>

            <name>mapred.system.dir</name>

             <value>/app/hadoop/work/mapred/system</value>

      </property>


</configuration>



디렉토리 생성

$ mkdir -p /app/hadoop/work/mapred/system

$ mkdir -p /app/hadoop/work/name

$ mkdir -p /app/hadoop/work/data



6) 설정 복사 

hadoop/conf에 있는 다음 파일을 2, 3번서버에 복사


   * core-site.xml

   * hdfs-site.xml

   * mapred-site.xml

   * masters

   * slaves

   * hadoop-env.sh


$ scp /app/hadoop/conf/* www@1.1.1.2:~/hadoop/conf

$ scp /app/hadoop/conf/* www@1.1.1.2:~/hadoop/conf




7) name node format


1, 2,3 번 서버 무에게 namenode format 실행


$ ./bin/hadoop namenode -format




8) 데몬 시작


* 1번 서버

start-dfs.sh 실행

$ bin/start-dfs.sh


* 2번,3번 서버

start-mapred.sh 실행

$ bin/start-mapred.sh


=> 그냥 bin/start-all.sh (bin/stop-all.sh)을 호출해도 됨



9) jps 확인


* 1번

www@HBASEtest-dev1:/app/hadoop/bin>$ jps

38006 JobTracker

37825 NameNode

38100 Jps


* 2번

www@HBASEtest-dev2:/app/hadoop/conf>$ jps

34387 DataNode

34614 Jps

34473 SecondaryNameNode

34561 TaskTracker


* 3번 

www@HBASEtest-dev3:/app/hadoop/conf>$ jps

33734 Jps

33681 TaskTracker

33586 DataNode





10) 웹 테스트


http://1.1.1.1:50070/

http://1.1.1.1:50030/




11) 동작여부 테스트

1) 테스트 #1

1번 서버

$ bin/hadoop fs -copyFromLocal bin xxxbin

$ bin/hadoop fs -ls


2,3번 서버도 1번 서버와 동일하게 결과가 나오는지 확인한다. 

$ bin/hadoop fs -ls



2) 테스트 #2


$ ./bin/hadoop jar ../hadoop-examples-1.0.4.jar  wordcount xxxbin/start-all.sh result 

$ ./bin/hadoop fs -cat result/part-r-00000 


제대로 결과가 나오면 성공 





2. ZooKeeper 설치


1) bashrc 수정

$ vi .bashrc

export ZK_HOME=/app/zookeeper



2) 설정 변경

http://zookeeper.apache.org/releases.html 에서 다운로드후 /app/zookeeper에 설치



모두 ZK_HOME에서 작업


1,2,3번 서버에 모두 적용후 데몬 start


$ cp conf/zoo_sample.cfg conf/zoo.cfg  

$ vi conf/zoo.cfg  


#dataDir=/tmp/zookeeper 

dataDir=/home/www/zookeeper/data

dataLogDir=/home/www/zookeeper/datalog



$ mkdir -p zookeeper/data  

$ mkdir -p zookeeper/datalog




3) myid 입력 


1번 서버

$ echo "1" > /app/zookeeper/data/myid

1


2번 서버

$ echo "2" > /app/zookeeper/data/myid

2


3번 서버

$ echo "3" > /app/zookeeper/data/myid

3




4) 데몬 시작 


www@HBASEtest-dev1:/app/zookeeper/$ bin/zkServer.sh start

JMX enabled by default

Using config: /app/zookeeper/bin/../conf/zoo.cfg

Starting zookeeper … STARTED



정상적인지 확인

www@HBASEtest-dev1:/app/zookeeper>$ ./bin/zkCli.sh -server 1.1.1.1:2181

[zk: 1.1.1.1:2181(CONNECTED) 0] ls /

[zookeeper]

[zk: 1.1.1.1:2181(CONNECTED) 1] quit

Quitting…



1번서버부터 시작해서 차례대로 2,3번 서버에서 zookeeper 데몬 실행

$ bin/zkServer.sh start


데몬 확인


$ jps

42320 QuorumPeerMain



Zookeeper 쿼럼에서 테스트- 1번 서버에서 작업

$ ./zkCli.sh  -server 1.1.1.1,1.1.1.2,1.1.1.3

Connecting to 1.1.1.1,1.1.1.2,1.1.1.3

….




[zk: 1.1.1.1,1.1.1.2,1.1.1.3(CONNECTED) 2] create /a a

Created /a

[zk: 1.1.1.1,1.1.1.2,1.1.1.3(CONNECTED) 3] get /a

a

cZxid = 0x100000003

ctime = Fri Apr 19 18:12:52 KST 2013

mZxid = 0x100000003

mtime = Fri Apr 19 18:12:52 KST 2013

pZxid = 0x100000003

cversion = 0

dataVersion = 0

aclVersion = 0

ephemeralOwner = 0x0

dataLength = 1

numChildren = 0



3번 서버에서 정상적으로 저장되었는지 테스트

$ ./bin/zkCli.sh -server 1.1.1.3

 [zk: 1.1.1.3(CONNECTED) 0] get /a

a

cZxid = 0x100000003

ctime = Fri Apr 19 18:12:52 KST 2013

mZxid = 0x100000003

mtime = Fri Apr 19 18:12:52 KST 2013

pZxid = 0x100000003

cversion = 0

dataVersion = 0

aclVersion = 0

ephemeralOwner = 0x0

dataLength = 1

numChildren = 0




만약 종료할때는 stop을 실행

$ ./zkServer.sh stop





3. HBase 설치


1) bashrc 수정

vi .bashrc

export HBASE_HOME=/app/hbase

PATH=$PATH:$HBASE_HOME/bin



2) 설정 수정



* 다운로드 

http://www.apache.org/dyn/closer.cgi/hbase/

/app/hbase를 홈디렉토리로 유지



* 따로 셋팅한 ZooKeeper를 사용할 예정이기 때문에 1번 서버의 설정 정보를 수정


$ vi conf/hbase-env.sh

export HBASE_MANAGES_ZK=false


 

$ vi conf/hbase-site.xml

<configuration>


    <property>

        <name>hbase.rootdir</name>

        <value>hdfs://1.1.1.1:9000/hbase</value>

    </property>


    <property>

        <name>hbase.cluster.distributed</name>

        <value>true</value>

    </property>


    <property>

        <name>hbase.tmp.dir</name>

        <value>/app/hbase/var</value>

    </property>


    <property>

        <name>hbase.ZooKeeper.quorum</name>

        <value>1.1.1.1,1.1.1.2,1.1.1.3</value>

    </property>

</configuration>



$ vi conf/regionservers

1.1.1.1

1.1.1.2

1.1.1.3


$ ln -sf $HADOOP_HOME/conf/hdfs-site.xml $HBASE-HOME/conf/hdfs-site.xml

 

* 버전 확인

버전 확인 이미 버전을 맞추었기 때문에 틀별한 작업은 안해도 됨

www@HBASEtest-dev1:/app/hbase/lib>$ ls -al zoo* hadoo*

-rw-r----- 1 www www 3929148 Mar 15 09:19 hadoop-core-1.0.4.jar

-rw-r----- 1 www www  779974 Mar 15 09:19 zookeeper-3.4.5.jar


* 설정 복사

$ scp /app/hbase/conf/* www@1.1.1.2:~/hbase/conf

$ scp /app/hbase/conf/* www@1.1.1.3:~/hbase/conf  



* hbase 실행

$ bin/start-hbase.sh

starting master, logging to /home/www/hbase/bin/../logs/hbase-www-master-HBASEtest-dev1.out

1.1.1.3: starting regionserver, logging to /home/www/hbase/logs/hbase-www-regionserver-HBASEtest-dev3.out

1.1.1.2: starting regionserver, logging to /home/www/hbase/logs/hbase-www-regionserver-HBASEtest-dev2.out


* hbase 종료

$ bin/stop-hbase.sh




* 로그 및 데몬 확인

로그에 이상이 없는지 확인한다.

2번, 3번 서버에 HRegion Server가 떠있는지 확인한다. 

$ jps

49053 HRegionServer


hadoop_home에서 확인

$ ./bin/hadoop fs -ls /hbase

Found 6 items

drwxr-xr-x   - www supergroup          0 2013-04-19 19:20 /hbase/-ROOT-

drwxr-xr-x   - www supergroup          0 2013-04-19 19:20 /hbase/.META.

drwxr-xr-x   - www supergroup          0 2013-04-19 19:20 /hbase/.oldlogs

drwxr-xr-x   - www supergroup          0 2013-04-19 19:20 /hbase/.tmp

-rw-r--r--   3 www supergroup         38 2013-04-19 19:20 /hbase/hbase.id

-rw-r--r--   3 www supergroup          3 2013-04-19 19:20 /hbase/hbase.version



1번 서버

$ jps

53336 NameNode

53514 JobTracker

17472 HMaster

51510 QuorumPeerMain

17631 HRegionServer

21172 Jps



2번 서버 

$ jps

45166 DataNode

43200 HRegionServer

45902 Jps

45262 SecondaryNameNode

64022 Child

45364 TaskTracker

44079 QuorumPeerMain



3번 서버

$ jps

40347 HRegionServer

42991 Jps

42320 QuorumPeerMain

61489 Child

43422 TaskTracker

43316 DataNode



3) 테스트



$ bin/hbase shell

HBase Shell; enter 'help<RETURN>' for list of supported commands.

Type "exit<RETURN>" to leave the HBase Shell

Version 0.94.6, r1456690, Thu Mar 14 16:32:05 PDT 2013


hbase(main):001:0> create '1','2'

0 row(s) in 2.1530 seconds


hbase(main):002:0> list

TABLE                                                                                                                                                                        

1                                                                                                                                                                            

1 row(s) in 1.0280 seconds






Posted by '김용환'
,



jps 명령어를 이용해서 HMaster 데몬이 뜨는 것까지 확인하고,

bin/hbase shell 을 이용해서 간단한 row,cf를 생성할 때 org.apache.hadoop.hbase.MasterNotRunningException 이 발생했다. 



hbase(main):001:0> create 'test', 'test'


ERROR: org.apache.hadoop.hbase.MasterNotRunningException: Retried 7 times




이럴 때는 이미 예전부터 hbase 문제였으므로 재시작 로그를 확인한다. 

로그는 다음과 같았다. 


13/04/23 17:08:10 INFO client.HConnectionManager$HConnectionImplementation: ZooKeeper available but no active master location found

13/04/23 17:08:10 INFO client.HConnectionManager$HConnectionImplementation: getMaster attempt 0 of 1 failed; no more retrying.

org.apache.hadoop.hbase.MasterNotRunningException

        at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.getMaster(HConnectionManager.java:706)

        at org.apache.hadoop.hbase.client.HBaseAdmin.<init>(HBaseAdmin.java:126)

        at org.apache.hadoop.hbase.master.HMasterCommandLine.stopMaster(HMasterCommandLine.java:175)

        at org.apache.hadoop.hbase.master.HMasterCommandLine.run(HMasterCommandLine.java:106)

        at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:65)

        at org.apache.hadoop.hbase.util.ServerCommandLine.doMain(ServerCommandLine.java:76)

        at org.apache.hadoop.hbase.master.HMaster.main(HMaster.java:1944)

13/04/23 17:08:10 INFO client.HConnectionManager$HConnectionImplementation: Closed zookeeper sessionid=0x13e2188f1ba006f





문제 해결 방법 가이드

1. hadoop을 다시 실행하고.웹 서버로 접근해서 체크

2. hadoop example을 하나 테스트해서 이상없는지 체크

3. hbase 실행후 HMaster 데몬이 떠있는지 확인. Hmaster 데몬이 안떠있으면 critical하게 설정이 잘못한 것임

4. Hmaster는 떠 있는데, bin/hbase shell이 안되는 경우는 connection문제

5. 설정중 통신관련된 부분을 체크


hadoop은 이상없었고, hbase 설정 이슈 같은데 잘 안잡혔다.

hbase-site.xml 상에서도 zookeeper 설정도 잘했다고 생각했고 jps 로 보니 QuorumPeerMain 자바 데몬은 떠 있었다. 



소스를 통해서 확인해보니 ZooKeeper Master 정보를 얻지 못해서 발견된 에러였다. 

http://javasourcecode.org/html/open-source/hbase/hbase-0.90.3/org/apache/hadoop/hbase/client/HConnectionManager.java.html



fully distributed모드일때는 Zookeeper 쿼럼을 다 적어야 하나보다.



살펴보니.

hbase-sitemhbase.ZooKeeper.quorum 설정에 하나만 해놨다.. ㅠ 

3대의 Zookeeper 데몬을 실행시켜놨는데, 이를 제대로 하지 않아서 에러가 발생했던 것이었다. 

실수한 부분

    <property>

        <name>hbase.ZooKeeper.quorum</name>

        <value>1.1.1.1</value>

    </property>


-> 

고친 부분

    <property>

        <name>hbase.ZooKeeper.quorum</name>

        <value>1.1.1.1,1.1.1.2,1.1.1.3</value>

    </property>


Zookeeper 서버 설정을 완료후, hbase 재시작을 하니.  MasterNotRunningException이 더이상 문제가 해결되었다.




Zookeeper에서 zkCli.sh를 실행시켜서 master 가 어디있는지 확인했다.  1.1.1.1이 master였다. 


[zk: localhost:2181(CONNECTED) 6] get /hbase/master

1.1.1.1,1,60000,1366704841540

cZxid = 0x10000019b

ctime = Tue Apr 23 17:14:02 KST 2013

mZxid = 0x10000019b

mtime = Tue Apr 23 17:14:02 KST 2013

pZxid = 0x10000019b

cversion = 0

dataVersion = 0

aclVersion = 0

ephemeralOwner = 0x13e2188f1ba0070

dataLength = 61

numChildren = 0








Posted by '김용환'
,



리눅스에서 일반 계정으로 hbase 를 실행시키고 있었고 bin/stop-hbase.sh 실행시 종료가 안되는 경우가 발생했다. 계속 period만 찍히는 현상이 발생. "..............."


bin/stop-hbase.sh을 확인해보니, 스크립에서는 pid 정보를 보고 kill을 하는데, pid값이 잘못되어 있었다. 


pid=${HBASE_PID_DIR:-/tmp}/hbase-$HBASE_IDENT_STRING-master.pid


while kill -0 `cat $pid` > /dev/null 2>&1; do

  echo -n "."

  sleep 1;

done


확인해보니. HBASE_PID_DIR를 지정을 안했었다. 디폴트로 /tmp로 되어 있는데, 일반계정으로 실행시키다 보니 write 를 할 수 없었던 것 같다.


hbase-env.sh에서 HBASE_PID_DIR을 실행계정에서 접근할 수 있도록 했다. 



$ vi hbase-env.sh 


export HBASE_PID_DIR=/home/hadoop/pids



그리고, hadoop/pids 디렉토리를 생성했다. 


$mkdir -p /home/hadoop/pids



bin/start-hbase.sh  후 jps 결과로 나온 pid 확인


$ cat hbase-1001237-master.pid 

13035

$ cat hbase-1001237-regionserver.pid 

13193


정상적으로 stop되었음을 확인했다. 


$ bin/stop-hbase.sh 

stopping hbase...........

$





Posted by '김용환'
,

[hbase] Phoenix ?

nosql 2013. 4. 22. 11:26


직접 써본 것은 아니지만 추후 사용을 위해서 정리한 내용이다. 

혹시 업무로 이 물건을 사용하고 훌륭하다고 생각되시면 널리 널리 알려주시면 감사하겠다. 



--------



보통 일반적으로 HBase 상에서 Query Language를 사용하려면, Hive나 Pig를 활용한다. hadoop위에 impala를 쓰는 경우도 있었다. 이 말고 다른 것은 있나 확인차 다른 오픈소스나 툴을 찾아보았다.


Solr를 이용한 Lily라는 것이 있고..
http://www.lilyproject.org/lily/index.html


요즘 뜨는 것중에 Phoenix라는 것을 발견했다. 

https://github.com/forcedotcom/phoenix


Phoenix는 SalesForce에서 사용한 방식으로 HBASE를  JDBC 드라이버 단으로 접속해서 Query를 날리는 방식을 사용했다. 올해 초에 뉴스도 나왔다. (http://cloudfront.blogspot.kr/2013/01/salesforcecoms-phoenix-sql-layer-for.html#.UXSe_CtVSDY )


Phoenix 1.1은 hbase 0.94.4을 지원하고 DDL, DML을 지원하는듯 하다. 

 http://phoenix-hbase.blogspot.kr/2013/02/annoucing-phoenix-v-11-support-for.html 


성능테스트는  다음과 같다고 한다.  





Posted by '김용환'
,


0.95.0 하위 및 0.95.2 버전에서 HTable의 coprocessorExec 를 사용시 모든 테이블을 scan하는 이슈가 있었다.따라서, 상위 버전으로 업그레이드를 해야 한다. 


startRow, endRow를 주어도 다음의 코드가 영향을 받았을 수 있다. 


results = table.coprocessorExec(IEndPoint_SA.class,  startrow, endrow,

   new Batch.Call<IEndPoint_SA,Hashtable<String,Hashtable>>() {

     public Hashtable<String,Hashtable> call(IEndPoint_SA instance)throws IOException{

     Hashtable<String,Hashtable> s = null;

       try {

s=instance.GetList();

} catch (ParseException e) {

e.printStackTrace();

}

       return s;

     }

   });


관련 BTS : https://issues.apache.org/jira/browse/HBASE-6870

참고로 패치는 다음과 같이 진행 : https://issues.apache.org/jira/secure/attachment/12579669/hbase-6870v6.patch


따라서 이 문제를 해결하기위해서는 0.95.1 또는 0.98 버전 이후의 버전을 사용해야 한다. 




Posted by '김용환'
,