HBase에서 사용하는 hash functionHBase에서 사용하는 hash function

Posted at 2012. 10. 5. 23:22 | Posted in OpenSource

http://javasourcecode.org/html/open-source/hbase/hbase-0.90.3/org/apache/hadoop/hbase/util/Hash.java.html

  /**
   * This utility method converts String representation of hash function name
   * to a symbolic constant. Currently two function types are supported,
   * "jenkins" and "murmur".
   * @param name hash function name
   * @return one of the predefined constants
   */
  public static int parseHashType(String name) {
    if ("jenkins".equalsIgnoreCase(name)) {
      return JENKINS_HASH;
    } else if ("murmur".equalsIgnoreCase(name)) {
      return MURMUR_HASH;
    } else {
      return INVALID_HASH;
    }
  }

//

lucene & nutchlucene & nutch

Posted at 2012. 9. 16. 13:55 | Posted in OpenSource

lucene (검색엔진)

Apache Lucene(TM) is a high-performance, full-featured text search engine library written entirely in Java.

http://lucene.egloos.com/1386072

http://www.ibm.com/developerworks/kr/library/tutorial/os-apachelucene/section2.html


nutch (크롤링)

Apache Nutch is an open source web-search software project.

http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/Search/Document/nutch/Crawling

//

Java SE 7 Features and EnhancementsJava SE 7 Features and Enhancements

Posted at 2011. 8. 5. 10:37 | Posted in OpenSource
//

zookeeper insidezookeeper inside

Posted at 2011. 4. 20. 10:12 | Posted in OpenSource
c++용 zookeeper wrapper 클래스를 만들기 전에 이 녀석이 어떻게 동작하는지 알 필요가 있어 살펴 봤다.

<zookeeper(MT) 주요 함수 호출 스택>
zoo_get()
  -> zoo_wget(): sync_completion을 사용해서 blocking 모드로 결과 반환.
    -> zoo_awget()
  -> wait_sync_completion

zookeeper_close()
(1) (ref_counter == 0)
  -> destroy()
    -> cleanup_bufs()
      -> free_completions()
        -> notify_sync_completion() -> broadcast to all waiting sync_completion thread
(2) (ref_counter > 0)
  -> cleanup_bufs() -> free_completions() -> ...
  -> adaptor_finish()
      -> pthread_join(io), pthread_join(completion)
      -> api_epilog() -> ref_counter - 1
        -> zookeeper_close()
          -> (1)
 
async류 함수(zoo_awget)를 호출하더라도 zookeeper_close()를 호출하면 모두 정리하고 나간다.
zookeeper_close() ==> zookeeper join 이라고 봐도 되겠다.

wrapper : 싸는 사람, 감싸는 사람, 싸는 것, 싸개, 보자기
//

[Hadoop] Secondary name-node, Checkpoint node, Backup node[Hadoop] Secondary name-node, Checkpoint node, Backup node

Posted at 2011. 4. 6. 10:14 | Posted in OpenSource

Secondary NameNode는 이름으로 추측할때 Standby-NameNode로 보이는 문제로 인해 Checkpoint Node 또는 Backup Node로 이름이 변경된 것 같습니다.

(하둡 wiki에서 다음과 같이 말하고 있습니다.

http://hadoop.apache.org/hdfs/docs/current/hdfs_user_guide.html#Secondary+NameNode

The Secondary NameNode has been deprecated. Instead, consider using the Checkpoint Node or Backup Node. )


- Checkpoint: 네임스페이스는 네임노드의 메모리 및 디스크에 그 이미지가 저장되는데 이 이미지를 FsImage라고 부릅니다.

네임노드에서 디스크의 FsImage는 변경되지 않으며, 운영하는 동안 변경된 네임스페이스 정보는 edits log에 기록이 됩니다.

이 FsImage가 변경되는 시점은 네임노드가 시작할 때 뿐이며, 네임노드가 시작될 때 edits log를 디스크의 FsImage에 병합하고 이 이미지를 메모리에 올리게 됩니다. 이런 과정을 checkpoint라고 합니다.

 

- Checkpoint Node(또는 Backup Node, Secondary NameNode):

따라서, 네임노드의 FsImage는 네임노드가 시작될 때만 editLog를 머지하고 새롭게 생성되므로, edits log를 주기적으로 FsImage에 병합해주는 것을 자동으로 해주는 것이 필요했고 그것이 Checkpoint Node라고 보시면 됩니다.

즉, Checkpoint Node(Secondary NameNode)는 주기적으로 네임노드의 FsImage와 edits log를 다운로드 받아 이들을 병합(join)하고, 새롭게 만들어진 FsImage를 네임노드에 돌려(upload)줍니다.

Checkpoint Node(Secondary NameNode)는 네임노드가 죽었을 때 백업용이 아니라 FsImage를 주기적으로 갱신(checkpoint)시켜주는 역할만 합니다.

 

이런 역할을 하는 노드가 필요한 이유는 네임스페이스에 많은 변경이 발생한 경우 edits log가 엄청나게 쌓일 것이고, 네임노드를 재시작 시켜주지 않는 한(checkpoint가 일어나지 않는 한) edits log는 삭제되지 않고, 삭제되어서도 안됩니다.

이 edits log가 많이 쌓이면 네임노드 시작시 시간이 엄청나게 길어지고 메모리도 실제 이미지보다 많이 필요하게 되어 네임노드가 시작되지 않는 문제 등을 유발하게 됩니다. 따라서 Checkpoint Node가 주기적으로 edits log를 FsImage에 병합시켜서 네임노드의 FsImage를 수정시켜주는 것입니다.


http://wiki.apache.org/hadoop/FAQ 에 Secondary NameNode의 목적에 대해 나와 있습니다.


The only purpose of the secondary name-node is to perform periodic checkpoints. The secondary name-node periodically downloads current name-node image and edits log files, joins them into new image and uploads the new image back to the (primary and the only) name-node.
--> Secondary NameNode는 네임노드의 FsImage와 edits log를 다운로드하여 병합(join)하여 네임노드로 upload 하는 일을 주기적으로 합니다.

--> 위 내용에 따르면 Secondary NameNode가 없어도 동작할 것 같네요.
--> 테스트 결과 동작합니다. 

//

Thrift 소개Thrift 소개

Posted at 2010. 11. 12. 19:37 | Posted in OpenSource
//

boost 설치하기boost 설치하기

Posted at 2010. 9. 13. 23:26 | Posted in OpenSource

$ ./bootstrap.sh --prefix=path/to/installation/prefix
$ ./bjam install

prefix는 기본값 /usr/local 을 사용해도 좋다.

//

activemq-cpp 설치하기activemq-cpp 설치하기

Posted at 2010. 9. 13. 22:20 | Posted in OpenSource
APR 1.3*
APR-UTIL 1.3*
이 설치되어 있어야 한다.

추가로 설치해줘야하는 라이브러리들
uuid-dev
libexpat1-dev
libcppunit-dev (test시 필요)
doxygen (문서 빌드시 필요)


[Makefile]

all:
    @echo "run \"make install\""

install: install-apr install-apr-util install-activemq-cpp

APR_PREFIX=/usr/local/apr
APR=apr-1.3.9
install-apr:
    tar xzf $(APR).tar.gz
    cd $(APR); ./configure --prefix=$(APR_PREFIX)
    make -C $(APR)
    make -C $(APR) install
    rm -rf $(APR)

APR_UTIL=apr-util-1.3.9
install-apr-util:
    tar xzf $(APR_UTIL).tar.gz
    cd $(APR_UTIL); ./configure --with-apr=$(APR_PREFIX)
    make -C $(APR_UTIL)
    make -C $(APR_UTIL) install
    rm -rf $(APR_UTIL)

ACTIVEMQ_CPP=activemq-cpp-library-3.1.1
install-activemq-cpp:
    tar xzf $(ACTIVEMQ_CPP)-src.tar.gz
    cd $(ACTIVEMQ_CPP); ./configure --with-apr=$(APR_PREFIX)
    make -C $(ACTIVEMQ_CPP)
    make -C $(ACTIVEMQ_CPP) install
    rm -rf $(ACTIVEMQ_CPP)

//

ActiveMQ 메모ActiveMQ 메모

Posted at 2010. 9. 10. 16:08 | Posted in OpenSource
Slow Consumer Handlinghttp://activemq.apache.org/slow-consumer-handling.html
  • queue 최대값(the maximum number of matched messages)을 지정해 놓았을 때, 최대값에 다다르면 오래된 것이 discard 된다?
  • prefetch size, pending limit 등 조절하여 메시지 discard가 있는지 확인해 보자. 위의 글로는 메시지가 discard되는 것으로 보이나, 문맥상 consumer에 prefetch될 메시지를 discard한다는 뜻 같기도 함.(영어 실력이 딸려서..)
  • PendingMessageLimitStrategy를 사용할 수 있으며, 다음과 같이 설명하고 있다.
  • You can configure the PendingMessageLimitStrategy implementation class on the destination map so that different regions of your topic namespace can have different strategies for dealing with slow consumers. For example you may want to use this strategy for prices which are very high volume but for orders and trades which are lower volume you might not wish to discard old messages.

    The strategy calculates the maximum number of pending messages to be kept in RAM for a consumer (above its prefetch size). A value of zero means keep no messages around other than the prefetch amount. A value greater than zero will keep up to that amount of messages around, discarding the older messages as new messages come in. A value of -1 disables the discarding of messages.


What is the prefetch limit forhttp://activemq.apache.org/what-is-the-prefetch-limit-for.html

So ActiveMQ uses a prefetch limit on how many messages can be streamed to a consumer at any point in time. Once the prefetch limit is reached, no more messages are dispatched to the consumer until the consumer starts sending back acknowledgements of messages (to indicate that the message has been processed). The actual prefetch limit value can be specified on a per consumer basis.

Its a good idea to have large values of the prefetch limit if you want high performance and if you have high message volumes. If you have very few messages and each message takes a very long time to process you might want to set the prefetch value to 1 so that a consumer is given one message at a time. Specifying a prefetch limit of zero means the consumer will poll for more messages, one at a time, instead of the message being pushed to the consumer.


Pooled Connections and prefetch

Consuming messages from a connection pool can be problematic due to prefetch. Unconsumed prefetched messages are only released when a connection is closed, but with a pooled connection the connection close is deferred (for reuse) till the connection pool closes. This leaves prefetched messages unconsumed till the connection is reused. This feature can present as missing or out-of-sequence messages when there is more than one connection in the pool.
One solution is to use pooled connections for producers and a non-pooled connection for consumers. This might have performance impacts on the consumer side, if multiple threads try to consume messages at a fast rate. Alternatively, reduce the pool size to 1 for consumers. A third alternative is to reduce the prefetchSize to 1 or 0 with the pooled connection factory. When using Spring JMS and MessageDrivenPojo, you cannot use a prefetch of 0, so use 1 instead.



  • The ActiveMQ broker auto-creates the physical resources associated with a destination on demand.
  • broker가 시작할 때 미리 만들어 둘 수도 있다. http://activemq.apache.org/configure-startup-destinations.html
  • 클라이언트에서 destination을 만들었다고 해서 서버에 만들어 지는 것은 아니다. 해당 큐 또는 토픽으로 메시지가 들어오면 만들어진다. 따라서 클라이언트가 destination 객체를 많이 만들었다고 해서 서버의 리소스를 사용하지 않는다.

Ordered Queue 
  • Exclusive Consumer - http://activemq.apache.org/exclusive-consumer.html
    • 요약하면 queue에 하나의 consumer만 붙게하는 것.
    • queue:consumer=1:1 을 broker가 보장해준다.
  • Message Group - http://activemq.apache.org/message-groups.html
    • Parallel Exclusive Consumer 같은 것.
    • 메시지가 어떤 그룹에 속하지는 구분하기 위해 표준 JMS 헤더는 JMSXGroupID 를 사용.
    • 같은 그룹은 같은 consumer에게 가는 것을 보장한다. consumer fail시 다른 consumer가 선택된다.
    • 그룹 ID를 HTTP session ID에 비유하면 broker는 HTTP load balancer가 된다.
    • broker는 메시지가 들어오면 그룹 ID를 검사하고, 해당 그룹에 연결된 consumer가 있는지 확인하여 전달.
    • hash를 사용하므로 많은 수의 그룹을 사용할 수 있다. (Since there could be a massive number of individual message groups we use hash buckets rather than the actual JMSXGroupID string)
    • consumer는 자신이 close되거나 외부에서 그룹을 close할때까지 메시지를 받는다.
    • Getting notified of ownership changes of message groups: 네트워크 오류 등으로 failover처리가 되는 경우 consumer가 변경될 수 있는데, 이 때 consumer는 특정 메시지 그룹의 메시지를 처음 받는 것인지 확인 할 수가 있다. JMSXGroupFirstForConsumer boolean값을 확인하면 된다. consumer가 가진 캐시나 자원을 초기화 하는 작업 등을 할 수 있다.
    • Adding new consumers: consumer들이 모두 연결되지 않은 상태에서는 첫번째 consumer가 모든 그룹의 메시지를 처리하려고 할 것이다. 이 상황을 피하기 위해 destination policy에서 consumersBeforeDispatchStarts 와 timeBeforeDispatchStarts 를 사용할 수 있다. 모든 consumer가 연결될 때까지 dispatching을 지연시킨다.
      ☞ consumer는 메시지 그룹별로 타이머를 걸어 특정 시간 이후로 메시지가 없을 때 그룹 close를 시키면 부드럽게 load balancing이 될 것이다.



Web console - http://host:8161/admin ,  http://host:8161/admin/queues.jsp


읽어볼 거리: 성능 튜닝 - http://www.edwardkim.pe.kr/?p=737
//

ActiveMQ - Large number of queues(HowTo)ActiveMQ - Large number of queues(HowTo)

Posted at 2010. 9. 9. 22:30 | Posted in OpenSource
Large number of queues(HowTo)
http://activemq.2283324.n4.nabble.com/Large-number-of-queues-HowTo-td2364929.html#a2364929
How do I configure 10s of 1000s of Queues in a single broker ?

able to create more than 20k queues using ~30 threads in a test environment with a 512MB heap. (by Jose Luna-2)

<Reduce Threads>
많은 수의 queue를 만들면 다음과 같은 에러를 만나게 된다.
"unable to create new native thread"
이것은 QueueThread가 queue당 하나가 생성되기 때문이다.
http://activemq.apache.org/per-destination-policies.html 에서 queue properties를 설정할 수 있는데,
optimizedDispatch=true(기본값은 false)로 설정하면 된다.
이 옵션은 다음과 같이 설명하고 있다. "don't use a separate thread for dispatching from a Queue"

그러나, 실제로는 queue별로 thread가 생성된다. 이는 optimizedDispatch 는 TaskRunner를 사용하는 thread를 생성하기 때문이다.
thread pool을 사용하기 위해서는 org.apache.activemq.UseDedicatedTaskRunner 를 false로 설정해 줘야 한다.
http://activemq.apache.org/javalangoutofmemory.html - Number of Threads 항목참조

Number of Threads
By default, ActiveMQ uses a dedicated thread per destination. If there are large numbers of Destinations there will be a large number of threads and their associated memory resource usage. ActiveMQ can be configured to use a thread pool through the use of the system property: -Dorg.apache.activemq.UseDedicatedTaskRunner=false. This is currently specified in the activemq start script via ACTIVEMQ_OPTS. Using a thread pool can restrict the number of threads required by ActiveMQ and hence reduce memory usage.

<policyEntries> 
    <policyEntry queue=">" memoryLimit="15mb" optimizedDispatch='true'/> 
</policyEntries>

set the ACTIVEMQ_OPTS to disable dedicated task runners in the start up script, INSTALL_DIR/bin/activemq -e.g.
   ACTIVEMQ_OPTS="-Xmx512M -Dorg.apache.activemq.UseDedicatedTaskRunner=false"  
or you can set ACTIVEMQ_OPTS in /etc/activemq.conf.

<Reduce number of file descriptors>
AMQ Message Store를 사용하기 보다 KahaDB를 사용하기를 권장함(in version 5.3 higher)
※ AMQ Message Store는 queue당 file descriptor 하나를 사용함.

<Reducing Memory Consumption>
Reduce the memory used per thread - http://activemq.apache.org/javalangoutofmemory.html



//