cassandra avro client example

cassandra는 클라이언트 모듈을 별도로 제공하지 않습니다. 일반적으로 데이터 저장소의 데몬들은 정해진 클라이언트 라이브러를 제공하고 이 라이브러리를 사용해서 접속하게 되는데 이렇게 되면 각 프로그램 언어별로 클라이언트를 만들어야 하는 문제점이 있습니다.
cassandra는 이 문제를 해결하기 위해 서버 측과 통신을 위한 프로토콜로 thrift와 avro 두가지를 지원하고 이 두가지 통신 프레임워크는 다양한 프로그램 언어를 지원합니다. thrift의 경우 c/c++, java, python, perl, php, ruby 등 우리가 알고 있는 대부분의 언어를 지원합니다.

따라서 cassandra에 데이터를 저장, 조회하는 클라이언트 프로그램을 만들기 위해서는 cassandra에서 제공하는 interface 디렉토리에 있는 cassandra,thrift나 cassandra,avro 파일을 이용하여 thrift나 avro 클라이언트 모듈을 generate한 다음 사용합니다.
cassandra를 코드로 다운로드 받으면 이미 generated 되어 있습니다.
thrift에 대한 예제는 많이 있는 반면 avro에 대한 예제는 별로 없어 간단하게 만들어 봤습니다.

주의해야할 사항은 Column 등과 같은 클래스가 avro, thrift 패키지 두가지 모두 존재하는데 반드시 avro 패키지를 선택해야 합니다.

import org.apache.avro.ipc.HttpTransceiver;
import org.apache.avro.ipc.Transceiver;
import org.apache.avro.specific.SpecificRequestor;
import org.apache.cassandra.avro.Cassandra;
import org.apache.cassandra.avro.Column;
import org.apache.cassandra.avro.ColumnOrSuperColumn;
import org.apache.cassandra.avro.ColumnParent;
import org.apache.cassandra.avro.ColumnPath;
import org.apache.cassandra.avro.ConsistencyLevel;

public class CassandraAvroTest {
  public static void main(String[] args) throws Exception {
    String server = args[0];
    Transceiver transceiver = new HttpTransceiver(new URL(“http://” + server + “:9160”));
    Cassandra cassandra = (Cassandra) SpecificRequestor.getClient(Cassandra.class, transceiver);
   
    List<CharSequence> keySpaces = cassandra.describe_keyspaces();
    for(CharSequence eachKeySpace: keySpaces) {
      System.out.println(“KeySpace:” + eachKeySpace);
    }
    String keyspace = “Twissandra”;

    cassandra.set_keyspace(keyspace);
   
    String columnFamily = “User”;
   
    //데이터 입력
    ColumnParent columnParent = new ColumnParent();
    columnParent.column_family = columnFamily;
    Column column = new Column();
    column.name = ByteBuffer.wrap(“Col1”.getBytes());
    column.value = ByteBuffer.wrap(“test”.getBytes());
    column.timestamp = System.currentTimeMillis();

    cassandra.insert(ByteBuffer.wrap(“Ke2”.getBytes()), columnParent, column, ConsistencyLevel.QUORUM);
   
    //데이터 조회
    ColumnPath columnPath = new ColumnPath();
    columnPath.column_family = columnFamily;
    columnPath.column = ByteBuffer.wrap(“Col1”.getBytes());
   
    ColumnOrSuperColumn result = cassandra.get(ByteBuffer.wrap(“Ke2”.getBytes()), columnPath, ConsistencyLevel.QUORUM);
    System.out.println(“get result:” + result.toString());
    transceiver.close();
  }
}

avro 인테페이스를 사용하기 위해서는 cassandra 데몬도 avro로 실행되어야 하는데 실행 시 다음과 같이 실행합니다.

    bin/cassandra -a

Comments