Skip to content
This repository has been archived by the owner on Jan 18, 2024. It is now read-only.
Jong Wook Kim edited this page Feb 2, 2017 · 1 revision

Asyncbase를 스칼라에서 사용하기 쉽도록 감싼 라이브러리입니다.

Table 인터페이스

HBase 클러스터가 관리되고 있는 ZooKeeper의 quorum을 입력하여 HBase 클라이언트를 만들 수 있으며, 이로부터 다음과 같이 특정 테이블에 대한 핸들 HBaseTable을 가져올 수 있습니다.

import com.kakao.mango.hbase._

val hbase = HBase("quorum1.server.com,quorum2.server.com,quorum3.server.com")
val table = hbase.table("tablename")

import com.kakao.mango.concurrent._

// "rowkey"에 해당하는 모든 값을 출력
table.get("rowkey").sync().foreach {
  case (column, cell) => println(cell.value)
}

HBaseTable은 다음 메소드들을 지원합니다. column()을 제외한 모든 메소드는 Future를 리턴하는 비동기 메소드입니다.

메소드 역할 리턴타입
put(key, family, qualifier, value) 새로운 값 저장 Any
putAll(family, values) 새로운 값 여러 개 저장 Any
get(key) 조건에 해당하는 모든 셀 가져오기 Seq[(Column, Cell)]
get(key, family) 조건에 해당하는 모든 셀 가져오기 Seq[(Column, Cell)]
get(key, family, qualifier) 조건에 해당하는 모든 셀 가져오기 Option[Cell]
getAll(key) 조건에 해당하는 셀을 구버전을 포함하여 가져오기 Seq[(Column, Cell)]
getAll(key, family) 조건에 해당하는 셀을 구버전을 포함하여 가져오기 Seq[(Column, Cell)]
getAll(key, family, qualifier) 조건에 해당하는 셀을 구버전을 포함하여 가져오기 Seq[Cell]
scan(..., limit) 조건에 맞는 셀 스캔 Seq[(String, Seq[(Column, Cell)])]
column(family, qualifier) 단일 컬럼에 대한 인터페이스 가져오기 HBaseColumn

Column 인터페이스

HBase의 column family와 qualifier를 이용하여 다양한 방식의 스키마 디자인을 할 수도 있지만, 단순한 key-value store로 이용하는 경우엔 column family와 qualifier를 고정하고 row key와 value의 매핑만을 사용하기도 합니다. 이런 방식을 위해 HBaseColumn 인터페이스를 사용할 수 있습니다.

import com.kakao.mango.hbase._

val hbase = HBase("quorum1.server.com,quorum2.server.com,quorum3.server.com")
val table = hbase.table("tablename")
val column = table.column("f", "q")   // 또는 hbase.column("tablename", "f", "q")

import com.kakao.mango.concurrent._

// "rowkey"에 해당하는 값을 출력
column.get("rowkey").sync().foreach {
  case Some(cell) => println(cell.value)
}

HBaseColumn 인터페이스는 다음과 같은 메소드를 지원하며, 모두 Future를 리턴하는 비동기 메소드입니다. 리턴타입에 Column에 대한 정보가 생략되어서 HBaseTable의 메소드보다 간단합니다.

메소드 역할 리턴타입
put(key, value) 새로운 값 저장 Any
putAll(values) 새로운 값 여러 개 저장 Any
get(key) 조건에 해당하는 모든 셀 가져오기 Seq[Option[Cell]]
getAll(key) 조건에 해당하는 셀을 구버전을 포함하여 가져오기 Seq[Cell]
delete(key) 조건에 해당하는 셀 삭제하기 Any
scan(..., limit) 조건에 맞는 셀 스캔 Seq[(String, Seq[Cell])]

자료구조

HBase의 셀은 (row key, column family, column qualifier, timestamp)로 유일하게 참조되는 값이며 이 중 column qualifier와 row key, 그리고 셀의 value는 임의의 바이트 배열이 될 수 있고, 편의에 따라 UTF-8 문자열을 사용하기도 합니다.

Mango HBase의 메소드들은 다양한 유즈케이스에 모두 대응할 수 있도록 Array[Byte] 타입과 String 타입을 사용하는 컬럼, 셀에 대해 개별 case class를 리턴합니다. 메소드의 파라미터를 String으로 주었다면 String 자료구조를 리턴하고, Array[Byte]로 주었다면 Byte 자료구조를 리턴하도록 만들어져 있습니다.

Array[Byte] String
column ByteColumn(column: Array[Byte], qualifier: Array[Byte]) StringColumn(column: String, qualifier: String)
cell ByteCell(timestamp: Long, value: Array[Byte]) StringCell(timestamp: Long, value: String)

Asynchbase의 장점과 한계

Asynchbase는 OpenTSDB에서 HBase에 time series 정보 HBase에 저장하고 읽어오기 위해 만들어진 라이브러리로, Apache HBase 프로젝트에서 개발하는 공식 클라이언트가 아닙니다. 블로킹 인터페이스만을 제공하는 HTableInterface와는 달리 Asynchbase는 netty 기반의 논블로킹 요청을 지원하므로 좀더 높은 스루풋을 내는 것이 가능합니다. 최근 HBase도 netty 기반 비동기 클라이언트 지원을 시작하였습니다만 HBase 버전 업을 하기 힘든 현재로서는 Asynchbase가 유일한 방법입니다. 또한 프로토콜버퍼를 사용하므로 HBase 서버 버전 호환성이 좀 더 좋은 것도 장점입니다.

다만 Asynchbase는 HTableInterface의 기능 중 일부만을 지원하여 테이블 생성 / 리스팅 등 몇몇 주요 기능을 지원하지 않습니다.

Clone this wiki locally