<3938C8A35FB0F8C7D05FC6AEB7BBB5E55F E F4E6F73716C5FB8A65FC0CCBFEBC7D15FC0AFB4D65FC5D7BDBAC6AE5FB9E6B9FD5F F312E687770>

Similar documents
쉽게 풀어쓴 C 프로그래밊

PowerPoint 프레젠테이션

10.ppt

FileMaker 15 ODBC 및 JDBC 설명서

Spring Boot/JDBC JdbcTemplate/CRUD 예제

DBMS & SQL Server Installation Database Laboratory

@OneToOne(cascade = = "addr_id") private Addr addr; public Emp(String ename, Addr addr) { this.ename = ename; this.a

FileMaker ODBC 및 JDBC 가이드

MySQL-.. 1

NoSQL

Spring Data JPA Many To Many 양방향 관계 예제

Microsoft PowerPoint - 10Àå.ppt

Chap7.PDF

rmi_박준용_final.PDF

FileMaker ODBC and JDBC Guide

API STORE 키발급및 API 사용가이드 Document Information 문서명 : API STORE 언어별 Client 사용가이드작성자 : 작성일 : 업무영역 : 버전 : 1 st Draft. 서브시스템 : 문서번호 : 단계 : Docum

Microsoft PowerPoint - 04-UDP Programming.ppt

Connection 8 22 UniSQLConnection / / 9 3 UniSQL OID SET

슬라이드 1

PowerPoint 프레젠테이션

윈도우시스템프로그래밍

교육자료

목차 BUG DEQUEUE 의 WAIT TIME 이 1 초미만인경우, 설정한시간만큼대기하지않는문제가있습니다... 3 BUG [qp-select-pvo] group by 표현식에있는컬럼을참조하는집합연산이존재하지않으면결괏값오류가발생할수있습니다... 4

DB진흥원 BIG DATA 전문가로 가는 길 발표자료.pptx

Ubiqutious Pubilc Access Reference Model

슬라이드 1

RUCK2015_Gruter_public

FileMaker ODBC and JDBC Guide

초보자를 위한 분산 캐시 활용 전략

ALTIBASE 사용자가이드 Templete

빅데이터분산컴퓨팅-5-수정

Interstage5 SOAP서비스 설정 가이드

1. 자바프로그램기초 및개발환경 2 장 & 3 장. 자바개발도구 충남대학교 컴퓨터공학과

신림프로그래머_클린코드.key

PowerPoint Presentation

강의 개요

untitled

02 C h a p t e r Java

PowerPoint 프레젠테이션

Intra_DW_Ch4.PDF

MySQL-Ch10

JUNIT 실습및발표

목차 BUG 문법에맞지않는질의문수행시, 에러메시지에질의문의일부만보여주는문제를수정합니다... 3 BUG ROUND, TRUNC 함수에서 DATE 포맷 IW 를추가지원합니다... 5 BUG ROLLUP/CUBE 절을포함하는질의는 SUBQUE

- JPA를사용하는경우의스프링설정파일에다음을기술한다. <bean id="entitymanagerfactory" class="org.springframework.orm.jpa.localentitymanagerfactorybean" p:persistenceunitname=

교육2 ? 그림

5 주차 -mongodb 설치잠깐! CAP 이론 NoSQL이나온이유와 MongoDB NoSQL의데이터저장구조에따른세가지분류 RDBMS와 NoSQL특성비교 RDBMS와 NoSQL의사용시기 MongoDB 소개및특징 MongoDB와 RDBMS와의공통 MongoDB CRUD

MS-SQL SERVER 대비 기능

문서 템플릿

PowerPoint Presentation

13주-14주proc.PDF

Cloud Friendly System Architecture

untitled

슬라이드 1

윈도우시스템프로그래밍

PowerPoint 프레젠테이션

8 장데이터베이스 8.1 기본개념 - 데이터베이스 : 데이터를조직적으로구조화한집합 (cf. 엑셀파일 ) - 테이블 : 데이터의기록형식 (cf. 엑셀시트의첫줄 ) - 필드 : 같은종류의데이터 (cf. 엑셀시트의각칸 ) - 레코드 : 데이터내용 (cf. 엑셀시트의한줄 )

歯sql_tuning2

C# Programming Guide - Types

표준프레임워크로 구성된 컨텐츠를 솔루션에 적용하는 것에 문제가 없는지 확인

목차 BUG offline replicator 에서유효하지않은로그를읽을경우비정상종료할수있다... 3 BUG 각 partition 이서로다른 tablespace 를가지고, column type 이 CLOB 이며, 해당 table 을 truncate

Microsoft Word - WETHXCNIMNSI.doc

Microsoft PowerPoint - CNVZNGWAIYSE.pptx

(Humphery Kim) RAD Studio : h=p://tech.devgear.co.kr/ : h=p://blog.hjf.pe.kr/ Facebook : h=p://d.com/hjfactory :

Lec. 2: MySQL and RMySQL

Spring Boot

Microsoft PowerPoint - GUI _DB연동.ppt [호환 모드]

MySQL-Ch05

q 이장에서다룰내용 1 객체지향프로그래밍의이해 2 객체지향언어 : 자바 2

Web Application Hosting in the AWS Cloud Contents 개요 가용성과 확장성이 높은 웹 호스팅은 복잡하고 비용이 많이 드는 사업이 될 수 있습니다. 전통적인 웹 확장 아키텍처는 높은 수준의 안정성을 보장하기 위해 복잡한 솔루션으로 구현

Mobile Service > IAP > Android SDK [ ] IAP SDK TOAST SDK. IAP SDK. Android Studio IDE Android SDK Version (API Level 10). Name Reference V

DocsPin_Korean.pages

WINDOW FUNCTION 의이해와활용방법 엑셈컨설팅본부 / DB 컨설팅팀정동기 개요 Window Function 이란행과행간의관계를쉽게정의할수있도록만든함수이다. 윈도우함수를활용하면복잡한 SQL 들을하나의 SQL 문장으로변경할수있으며반복적으로 ACCESS 하는비효율역

개요오라클과티베로에서 JDBC 를통해접속한세션을구분할수있도록 JDBC 접속시 ConnectionProperties 를통해구분자를넣어줄수있다. 하나의 Node 에다수의 WAS 가있을경우 DB 에서 Session Kill 등의동작수행시원하는 Session 을선택할수있다.

김기남_ATDC2016_160620_[키노트].key

11 템플릿적용 - Java Program Performance Tuning (김명호기술이사)

<4D F736F F D205B4354BDC9C3FEB8AEC6F7C6AE5D3131C8A35FC5ACB6F3BFECB5E520C4C4C7BBC6C320B1E2BCFA20B5BFC7E2>

PowerPoint Presentation

자바-11장N'1-502

RED HAT JBoss Data Grid (JDG)? KANGWUK HEO Middleware Solu6on Architect Service Team, Red Hat Korea 1

비긴쿡-자바 00앞부속

JMF3_심빈구.PDF

07 자바의 다양한 클래스.key

Microsoft PowerPoint - Java7.pptx

PowerPoint 프레젠테이션

JMF2_심빈구.PDF

歯JavaExceptionHandling.PDF

fundamentalOfCommandPattern_calmglow_pattern_jstorm_1.0_f…

분산처리 프레임워크를 활용한대용량 영상 고속분석 시스템

MasoJava4_Dongbin.PDF

<4D F736F F F696E74202D20C1A63234C0E520C0D4C3E2B7C228B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

3 S Q L A n t i p a t t e r n s Trees/intro/parent.sql CREATE TABLE Comments ( comment_id SERIAL PRIMARY KEY, parent_id BIGINT UNSIGNED, comment TEXT

Tablespace On-Offline 테이블스페이스 온라인/오프라인

PowerPoint 프레젠테이션

PowerPoint Presentation

예제 2) Test.java class A intvar= 10; void method() class B extends A intvar= 20; 1"); void method() 2"); void method1() public class Test 3"); args) A

A Hierarchical Approach to Interactive Motion Editing for Human-like Figures

Microsoft PowerPoint - CSharp-10-예외처리

Analytics > Log & Crash Search > Unity ios SDK [Deprecated] Log & Crash Unity ios SDK. TOAST SDK. Log & Crash Unity SDK Log & Crash Search. Log & Cras

PowerPoint Presentation

1. efolder 시스템구성 A. DB B. apache - mod-perl - PHP C. SphinxSearch ( 검색서비스 ) D. File Storage 2. efolder 설치순서 A. DB (MySQL) B. efolder Service - efolder

Transcription:

Cassandra(Nosql) 를이용한유닛테스트방법 Part 1 : 카산드라소개 2014.7.8.[ 제 98 호 ] Ⅰ. Cassandra 소개및특징 Ⅱ. Cassandra Java Client Ⅲ. 정리

SW 공학트렌드 동향분석 Webzine Ⅰ. Cassandra 소개및특징 구 글의 BigTable 아키텍트와 AWS 의 Amazon Dynamo 를기반으로하고있는 Cassandra 는 Amazon 의 Dynamo 를디자인했던 Avinash Lakshman 라는엔지니어가 Facebook 으로이직해 Facebook 의 Prashant Malik 엔지니어와함께만들었다. 그림 1_Cassandra 마크 Cassandra 는줄임말로 C* 이라표현하기도한다. C* 표시가유명한곳은 Cassandra 를컨설팅하는회사인 Datastax이다. 이사이트에서는 Planet Cassandra 라는커뮤니티서비스사이트를운영하고있다. Planet Cassandra 는 < 그림 2> 과같이 C* 이표시된마크로형상화했다. 그림 2_C* 이표시된 Planet Cassandra 사이트 출처 : http://planetcassandra.org/ Cassandra 는그리스신화에서나온인물중하나로서, Cassandra는프리아모스왕과헤카베의딸이다. 이런얘기를하는것은 Cassandra 에연관된 client library 명칭이그리스신화와연관되어있기때문이다. 예를들어 Cassandra의대표적인 java client 중 hector 나 astyanax 와같이그리스신화의인물의이름을사용하고있다. 표 1_ 위키피디아의 Cassandra 항목중에서 아폴론은 Cassandra 를사랑하게되었는데, 그녀를유혹하려고예언능력을주었다. 그러나 Cassandra 는예언하는능력을가지게되자, 아폴론은신이기에늙지않고죽지않는다지만, 자신은인간이었기에늙고죽는다는것을알았다. 즉자신이나중에늙거나병이들면아폴론은자신을버리고다른여자와사귈것이라는알게된것이다. 그래서아폴론이자기를끌어안자그를밀쳐냈고, 아폴론은크게진노하여그녀의입안에침을뱉었다. 그뒤로 Cassandra 가하는예언을더이상아무도믿지않게되었다. Cassandra 는트로이군에게목마를도시안으로들여보내지말라고경고했지만, 트로이군은그녀의말을무시하였고때문에그리스군이들어가숨은목마로인해전쟁에서패했다. 출처 : http://ko.wikipedia.org/wiki/%ec%b9%b4%ec%82%b0%eb%93%9c%eb%9d%bc 01 2014 July (No.98)

공학트렌드 그리스신화의내용과는상관없지만, Nosql Cassandra 서버, Hector, Astyanax 와같은 라이브러리들이어우러지는 Cassandra 이야기를시작하고자한다. 1.1 아키텍처특징 Cassandra 는 BigTable Column 기반의데이터모델과 Dynamo 분산모델을기반으로만들어졌다. 따라서 Dynamo 분산모델의큰특징인 event consistency 와 BigTable Column 기반의큰특징인 Column 기반의 key-value 체계를큰틀로하고있다. 여기에분산처리 (Distributed) 가되게하여 SPOF(Single Point Of Failure) 을줄여주고데이터손실이없도록한다. 어떤노드에장애가발생해도전체시스템은멈추지않도록한다. 같은데이터의 Replica 가동시에장애가발생하여멈추는문제가아니라면 Read 는문제가없다. Write 는 Replica에상관없이항상가능하다. 장비를추가하고제거하는과정이단순해서새로운장비를추가하고설정을바꾼후 Cassandra 를재시작하면된다. Cassandra는노드가추가되면자동으로 Consistent hashing 을통해각노드가가진키의개수를맞춘다. 다른 NoSQL 은 CAP 이론 (Consistency, Availability, Partition Tolerance) 에대한정책이명확한편이다. CAP 이론은미국버클리대학의 Brewer 교수에의해알려졌다. 1) 데이터저장소는 CAP 중하나는만족시킬수없다는내용이다. 그림 3_CAP 이론정보 출처 : http://architects.dzone.com/articles/better-explaining-cap-theorem 1) http://www.cs.berkeley.edu/~brewer/cs262b-2004/podc-keynote.pdf 02

SW 공학트렌드 동향분석 Webzine < 그림 3> 을살펴보면 Data Storage 에대해서 CAP 이론쪽에맞는솔루션들을분류한것이다. 예를들어 CA 는 Mysql 이, AP 는 CouchDB, CP 는 HBase 가위치하고있다. Cassandra 는 < 그림 3> 에따르면 Consistency 를포기하고 AP 에집중된것으로보인다. 그러나 Cassandra 는 Read replica count 와 Write replica count 의값을변경시켜 Consistency 와 Availability 간의균형을개발자또는운영자가설정할수있다. 만약 Consistency 가주요한부분이라는정책을세운다면, Read replica count 와 Write replica count 를 Replica 개수보다크게한다면 (R + W > Number of replica) 강한 Consistency 를줄수있다. 2) 2008 년 Apache 오픈소스로공개되어 3) 최근소스는 Github 에 4) 저장및공유되어있다. 자바언어로개발되어있는특징이있지만, 다양한언어의클라이언트로개발할수있는환경을제공하고있다. 현재 Twitter, Adobe, AOL, Rakuten, Splunk, Symantec, Hulu, Netflix, Ebay, Docomo, Expedia, Eventbrite, GE, Github, HP, IBM, Juniper, Microsoft, Onlive, Parse, Accenture, Sky 방송, Instagram, Comcast 등 1500 개회사들이 Cassandra 를사용하고있다. 5) 참고로 Facebook 은 Cassandra 개발을주도하였고, Inbox Search 를위해서 Cassandra 를이용했으나, 2010 년 HBase로구현한 Facebook Message Platform 로바뀐상태이다. 이후 2012 년 Instagram 에서다시쓰기시작했다. 6) 대용량데이터의고성능처리가가능하여용량확장이쉬운데이터베이스이다. 처음에는 Relation DB( 관계형데이터베이스 ) 와다르게 SQL 을사용하지않은 NoSQL 제품중하나였으나 Cassandra 0.8 부터는 Cassandra Query Language (CQL) 를제공하여 SQL과비슷한형태로개발할수있는환경을제공하고있다. 2.0 이추가되면서 lightweight transanction 과 trigger 가추가되었고, datacenter 간 reparing 을제공하고있다. Cassandra 는 SSTable(Sorted String Table) 에 Write 성데이터를 Append 하다가일정크기가되면, SSTable 을통째로디스크에저장하도록설계되었다. 따라서데이터파일중간에 row 를끼워넣는저장방식인 RDBMS 보다는성능이좋다. SSTable 의 Bloom filter 를통해 read 할대상데이터를찾는구조로되어있다. Bloom filter 는어떤데이터가어떤곳에저장되어있는지파악하는알고리즘이다. Cassandra 는 read/write 시한쓰레드가 column 접근할때다른쓰레드가 column 에접 2) http://wiki.apache.org/cassandra/architectureoverview 3) http://cassandra.apache.org/ 4) https://github.com/apache/cassandra 5) http://planetcassandra.org/companies/ 6) http://en.wikipedia.org/wiki/apache_cassandra 03 2014 July (No.98)

공학트렌드 근하지못하는경우가없도록한다. 이를 lockless 라고한다. 이때문에동시성문제는발생하지않는다. 2.0 에서 lightweight transaction 을제공하였다. 이는 compare and set 의개념으로존재여부 (if) 를확인하고 read/write 를할수있도록하였다. Cassandra 2.0 부터는 java 7 이상사용할수있는환경이었는데, 최근에는 3.0 이개발이진행되고있다. 아직정식으로 Release 하지않았지만, 잠깐내용을살펴보면 Java 8에서동작할수있는구조이다. 7) 미국의 Netflix 사는아마존 AWS 에서 Cassandra를잘사용하여서비스운영한발표한자료가있으니, 자세한내용은아래 URL 을참조하도록한다. 8) OPS Center, DEV Center 와같은운영 UI 툴이제공되어 Cassandra 모니터링이나데이터조회가가능하다. 서비스를개발하고운영하는입장에서는단순히 Cassandra 만가지고서비스할수없다. 실시간처리및분석을지원하는것은물론대용량을지원하며 Cassandra와 integration 할수있는오픈소스들을설치운영의조합이필요하다. Hadoop / Pig 나 Mahout 과같은 Hadoop 연동시스템이나 Solr 와같은검색오픈소스들과 Cassandra 모니터링을하나의군으로패키징할수있다. 이를 Consulting 하는회사는 DataStax 이다. DataStax 는 DSE(DataStax Entreprise Edition) 9) 라는제품군을참조하면 Cassandra 를기반으로하는솔루션군배포및컨설팅을지원하고있다. < 그림 4> 는 DataStax의 DSE 는 Cassandra 기반으로 Hadoop, Hadoop 기반의오픈소스, Solr 검색, OpsCenter 의운영도구가어떻게하나의제품군으로패키징될수있는지보여준다. 그림 4_DataStax 의 DSE(DataStax Entreprise Edition) 출처 : http://blog.xebia.fr/2013/07/18/retours-sur-le-cassandra-breakfast/ 7) https://github.com/apache/cassandra/blob/trunk/changes.txt 8) http://www.slideshare.net/acunu/cassandra-eu-2012-netflixs-cassandra-architecture-and-open-source-efforts 9) http://www.datastax.com/what-we-offer/products-services/datastax-enterprise 04

SW 공학트렌드 동향분석 Webzine 1.2 데이터저장방식 RDBMS 는 row 를레코드형태로저장한다. 그러나 Cassandra는 < 그림 5> 처럼 Column Family 형태로저장된다. Key-value 형태보다는 Key 에조금더많은정보를저장할수있다. 또한 Keyspace를두어 multi-tenant 를일부지원하고있다. 그림 5_Column Family 구조 (1) 출처 : http://javamaster.wordpress.com/2010/03/22/apache-cassandra-quick-tour/ 그림 6_Column Family 구조 (2) 출처 : http://javamaster.wordpress.com/2010/03/22/apache-cassandra-quick-tour/ 05 2014 July (No.98)

공학트렌드 각 Column 은 name, value, timestamp 를가지고있다. timestamp 은명시적으로보여주고있지않다. 각각따로보려고해야볼수있는시간값이다. RDMS 관점으로쉽게표현하자면 KeySpace는논리 Database와비슷하고, Column Family 는 Table 과비슷하다. 그리고 Key 와 Column 은마치 Row 의 Key 와 Value 와비슷한특징이있다. RDBMS 의관점으로 < 그림 6> 을보면이해하는데도움이될것이다. Column Family 를사용한예제를통해살펴보도록한다. Tweeter의예제를들어보면, 사용자마다 TimeLine 이따로존재한다. 이 TimeLine 에대한글을추상화하면 < 그림 7> 과같을것이다. Column Family Tweets 는 Time UUID 의레코드타입을 Key 로하고 User_ID( 글작성자 ), Text( 글내용 ), Date( 사람이알아볼수있는 Date 정보 ) 정보를저장하도록되어있다. 그림 7_Tweets 예제 출처 : http://maxgrinev.com/2010/07/09/a-quick-introduction-to-the-cassandra-data-model/ Cassandra 에는 Super Column 이라는개념 (Column 의 Map) 이초기에는있었다. 그러나성능 이슈가생기면서개수제한이주는경우가많아지면서, 최대한쓰지않도록하고있다. 10) 1.3 CQL3 Cassandra 는 Column Family 라는개념이계속쓰이고있다. 그러나 CQL 이라는 Query Language 로사용할때는상황이다르다. CQL 초기 Specification 에서는 Column Family 를사용했으나, 점차 Column Family 대신 Table 로사용을확대했고, Column Family 라는단 10) http://www.wentnet.com/blog/?p=38 06

SW 공학트렌드 동향분석 Webzine 어는쓰이지않고있다. 대신 DB 에서사용하는 Table 이라는이름으로변경되었다. Column Family 데이터모델링이사실상 DB 의데이터모델링과비슷한형태를취하고있다. 그러나 constraint 가없고명시적인 transaction 이없는유연한 DB 의테이블형태와비슷한모델이되고있다. 1.2 에서얘기한 Column Family 구조를 RDBMS 의 row 와같은구조로개념화할수있다. < 그림 8> 과같이바뀐 2차원테이블형태의정보는 Query Language 질의가가능하다. 간단하게내용을설명하면다음과같다. 그림 8_Column Family 에서 RDBMS 의 row 로개념화 출처 : http://www.datastax.com/dev/blog/cql3-for-cassandra-experts CQL3 는 Cassandra 에서사용할수있는 Query Language 로서 SQL 과비슷한형태를가 지고있다. playlists 라는 Table 을생성한다. Table 은사실상 Column Family 이다. CREATE TABLE playlists ( id uuid, title text, album text, artist text, song_id uuid, PRIMARY KEY (id, title, album, artist) ); CQL3 에대한정보는 Cassandra 홈페이지 11) 를참조한다. 예를들어 Select 문은 order by, limit 이제공된다. join 와 sub query, group by, cursor 는제공이안된다. 간단한종류 의쿼리를사용할수있다. 11) http://cassandra.apache.org/doc/cql3/cql.html 07 2014 July (No.98)

공학트렌드 1.4 Cassandra 서버설치및테스트 Cassandra 서버를동작하기위해서는 Cassandra 홈페이지 12) 에서 Cassandra 압축파일 을다운로드한다. Java 1.7 을설치한후다음의작업을진행한다. $ tar -zxvf apache-cassandra-$version.tar.gz $ cd apache-cassandra-$version $ sudo mkdir -p /var/log/cassandra $ sudo chown -R `whoami` /var/log/cassandra $ sudo mkdir -p /var/lib/cassandra $ sudo chown -R `whoami` /var/lib/cassandra Cassandra 를 forground(-f) 로실행한다. $ bin/cassandra -f 이제 Cassandra 설치디렉토리에접근해서 CQL 을이용해서데이터저장 / 조회를해본다. $ bin/cqlsh cqlsh> 먼저 SCHEMA 를생성한후, TABLE 을생성한다. INSERT 와 SELECT 를통해서데이터 확인이가능하다. cqlsh> CREATE SCHEMA schema1 WITH replication = { 'class' : 'SimpleStrategy', 'replication_factor' : 1 ; cqlsh> USE schema1; cqlsh:schema1> CREATE TABLE users ( user_id varchar PRIMARY KEY, first varchar, last varchar, age int ); cqlsh:schema1> INSERT INTO users (user_id, first, last, age) VALUES ('jsmith', 'John', 'Smith', 42); cqlsh:schema1> SELECT * FROM users; user_id age first last ---------+-----+-------+------- jsmith 42 john smith 그리고, TTL(Time To Live) 을이용해서특정시간이지나면데이터를자동으로삭제 시킬수있다. 12) http://cassandra.apache.org/ 08

SW 공학트렌드 동향분석 Webzine cqlsh:schema1> INSERT INTO users (user_id, first, last, age) VALUES ('michael', 'Jack', 'Michael', 20) using ttl 10 ; cqlsh:schema1> select * from users where user_id='michael'; user_id age first last ---------+-----+-------+--------- michael 20 Jack Michael (10 초후 ) cqlsh:schema1> select * from users where user_id='michael'; (0 rows) 그리고, DB 와같이 primary key 가아닌필드에인덱싱 (indexing) 을할수있다. cqlsh:schema1> create index on users(age); cqlsh:schema1> create index on users(last); cqlsh:schema1> create index on users(first); Ⅱ. Cassandra Java Client Cassandra 에접근할수있는언어별클라이언트는 Planet Cassandra 사이트 13) 에서정리되었다. 지원하는언어는.net/c#, c++, closure, go, haskell, java, node.js, odbc, perl, php, python, R, ruby, scala 이다. 이중에잘살펴봐야하는것은 Cassandra 1.0 은지원하지만 Cassandra 2.0 은지원하지않은부분들이있으니잘확인하고사용할필요가있다. Java 클라이언트의경우는 Thrift API 을이용하는경우가많다. 그러나 Thrift 가쓰기에쉽지않기때문에 Hector 가가장많이사용되고있으며, Netflix 에서개발한 Astyanax 도많이쓰이고있다. 2.1 Thrift API Thrift 는일종의 ldl(interface specification language) 이기때문에다양한언어에서구현한 13) http://planetcassandra.org/client-drivers-tools/ 09 2014 July (No.98)

공학트렌드 stub 코드를이용하여개발할수있다. Cassandra 뿐아니라 Perl, Ruby, C, C++ 뿐아니 라 Java 에서도쉽게사용할수있다. 아래는 Thift 를이용해서 schema1 Keyspace 의 cf11 이라는 table( 또는 column family) 를생성한후, 한건의데이터를 insert 하는 java 코딩 이다. 먼저 Cassandra 서버에연결후, table 을생성후 insert 를하는코드이다. public class ThriftTest { private static final String KEYSPACE_NAME = "schema1"; private static final String ROW_KEY_NAME = "row1"; private static final String COLUMN_FAMILY_NAME = "cf11"; private Cassandra.Client client; private TTransport tr; public static void main(string[] args) throws Exception { ThriftTest sample = new ThriftTest(); sample.getconfig(); sample.create(); sample.insert(); public void getconfig() { tr = new TFramedTransport(new TSocket("localhost", 9160)); TProtocol proto = new TBinaryProtocol(tr); client = new Cassandra.Client(proto); public void create() throws Exception { tr.open(); String cql = "use " + KEYSPACE_NAME + ";"; client.execute_cql_query(bytebuffer.wrap(cql.getbytes()), Compression.NONE); cql = "create columnfamily " + COLUMN_FAMILY_NAME + " (key text primary key, name text, number text);"; client.execute_cql_query(bytebuffer.wrap(cql.getbytes()), Compression.NONE); tr.close(); public void insert() throws Exception { tr.open(); client.set_keyspace(keyspace_name); // insert data long timestamp = System.currentTimeMillis(); Column namecolumn = new Column(ByteBuffer.wrap("name".getBytes())); namecolumn.setvalue(long.tohexstring(1).getbytes()); namecolumn.settimestamp(timestamp); Column numbercolumn = new Column(ByteBuffer.wrap("number".getBytes())); numbercolumn.setvalue(long.tohexstring(2).getbytes()); numbercolumn.settimestamp(timestamp); ColumnParent columnparent = new ColumnParent(COLUMN_FAMILY_NAME); 10

SW 공학트렌드 동향분석 Webzine client.insert(bytebuffer.wrap(row_key_name.getbytes()), columnparent,namecolumn,consistencylevel.all) ; client.insert(bytebuffer.wrap(row_key_name.getbytes()), columnparent,numbercolumn,consistencylevel.all); tr.close(); cqlsh 를이용하면 cf11 이라는 Table 이생성되었음을확인할수있고, Insert 한데이터 도확인할수있다. cqlsh:schema1> describe table cf11 CREATE TABLE cf11 ( key text, name text, number text, PRIMARY KEY (key) ) WITH COMPACT STORAGE AND bloom_filter_fp_chance=0.010000 AND caching='keys_only' AND comment='' AND dclocal_read_repair_chance=0.000000 AND gc_grace_seconds=864000 AND index_interval=128 AND read_repair_chance=0.100000 AND replicate_on_write='true' AND populate_io_cache_on_flush='false' AND default_time_to_live=0 AND speculative_retry='99.0percentile' AND memtable_flush_period_in_ms=0 AND compaction={'class': 'SizeTieredCompactionStrategy' AND compression={'sstable_compression': 'LZ4Compressor'; cqlsh:schema1> select * from cf11; key name number ------+------+-------- row1 1 2 (1 rows) Thrift API 코드는범용프레임워크이기때문에 Cassandra 와통신하는코드가깔끔하지 않다고느껴질수있다. 또한한대의노드가아닌클러스터단위로통신작업을해야하다 보니, 이에대한 Cassnadra 노드의통신불능에대한처리방식, Connection Pooling 이지원 되고있지않다. 즉, DB 와의연결및 DB 문제로인한 Error/Exception 처리가필요한것이 다. 따라서 Thrift API 만가지고개발하고있는경우는그리많지않으며, 위의언급한고급 기능을포함시키고, Thrift API 기반으로개발된 Hector 나 Astyanax 를많이사용하고있다. 11 2014 July (No.98)

공학트렌드 2.2 Hector Hector 는 Cassandra 의형제이다. Cassandra java client 중의가장유명한것으로알려진 Hector 14) 를이용하여 thrift API 를사용하는것보다쉽게개발이가능하다. 2.1 의예제와비슷하게 Hector 코드를가지고개발한코드이다. Cassandra 서버에연결후, table 을생성후 insert 를하는코드이다. Table 의 name_idx, number_idx 인덱스도확인가능하다. public class HectorTest { private Cluster cluster = null; private Keyspace keyspace = null; private BasicColumnFamilyDefinition columnfamilydefinition = null; private static final String KEY_SPACE_NAME = "schema1"; private static final String COLUMN_FAMILY_NAME = "cf6"; public static void main(string[] args) { HectorTest sample = new HectorTest(); sample.getconfig(); sample.create(); sample.insert(); public void getconfig() { String hosts = "localhost:9160"; CassandraHostConfigurator cassandrahostconfigurator = new CassandraHostConfigurator(hosts); cassandrahostconfigurator.setmaxactive(1); cassandrahostconfigurator.setcassandrathriftsockettimeout(3000); cassandrahostconfigurator.setmaxwaittimewhenexhausted(4000); cluster = HFactory.getOrCreateCluster("Test Cluster", cassandrahostconfigurator); ConfigurableConsistencyLevel configurableconsistencylevel = new ConfigurableConsistencyLevel(); Map<String, HConsistencyLevel> clmap = new HashMap<String, HConsistencyLevel>(); clmap.put("mycolumnfamily", HConsistencyLevel.ONE); configurableconsistencylevel.setreadcfconsistencylevels(clmap); configurableconsistencylevel.setwritecfconsistencylevels(clmap); HFactory.createKeyspace(KEY_SPACE_NAME, cluster, configurableconsistencylevel); keyspace = HFactory.createKeyspace(KEY_SPACE_NAME, cluster); public void create() { 14) http://1and1.github.io/hector/build/html/index.html 12

SW 공학트렌드 동향분석 Webzine StringSerializer stringserializer = StringSerializer.get(); BasicColumnDefinition numbercolumndefinition = new BasicColumnDefinition(); numbercolumndefinition.setname(stringserializer.tobytebuffer("number")); numbercolumndefinition.setindexname("number_idx"); numbercolumndefinition.setindextype(columnindextype.keys); numbercolumndefinition.setvalidationclass(comparatortype.utf8type.getclassname()); BasicColumnDefinition namecolumndefinition = new BasicColumnDefinition(); namecolumndefinition.setname(stringserializer.tobytebuffer("name")); namecolumndefinition.setindexname("name_idx"); namecolumndefinition.setindextype(columnindextype.keys); namecolumndefinition.setvalidationclass(comparatortype.utf8type.getclassname()); columnfamilydefinition = new BasicColumnFamilyDefinition(); columnfamilydefinition.setkeyspacename(key_space_name); columnfamilydefinition.setname(column_family_name); columnfamilydefinition.setkeyvalidationclass(comparatortype.utf8type.getclassname()); columnfamilydefinition.setcomparatortype(comparatortype.utf8type); columnfamilydefinition.addcolumndefinition(numbercolumndefinition); columnfamilydefinition.addcolumndefinition(namecolumndefinition); cluster.addcolumnfamily(columnfamilydefinition); assert columnfamilydefinition!= null; public void insert() { StringSerializer stringserializer = StringSerializer.get(); Mutator<String> mutator = HFactory.createMutator(keySpace, stringserializer); mutator.insert("row1", columnfamilydefinition.getname(), HFactory.createStringColumn("1", "Kim")); mutator.insert("row1", columnfamilydefinition.getname(), HFactory.createStringColumn("2", "Park")); mutator.insert("row1", columnfamilydefinition.getname(), HFactory.createStringColumn("3", "Yun")); mutator.addinsertion("row2", columnfamilydefinition.getname(), HFactory.createStringColumn("1", "A")).addInsertion("row2", columnfamilydefinition.getname(), HFactory.createStringColumn("2", "B")).addInsertion("row2", columnfamilydefinition.getname(), HFactory.createStringColumn("3", "C")); mutator.execute(); 코드를실행후, Table 이실제로생성되었는지확인한다. Index 2 개까지생성된것을 13 2014 July (No.98)

공학트렌드 확인할수있다. cqlsh:schema1> describe table cf6 CREATE TABLE cf6 ( key text, name text, number text, PRIMARY KEY (key) ) WITH COMPACT STORAGE AND bloom_filter_fp_chance=0.010000 AND caching='keys_only' AND comment='' AND dclocal_read_repair_chance=0.000000 AND gc_grace_seconds=0 AND index_interval=128 AND read_repair_chance=0.000000 AND replicate_on_write='false' AND populate_io_cache_on_flush='false' AND default_time_to_live=0 AND speculative_retry='none' AND memtable_flush_period_in_ms=0 AND compaction={'class': 'SizeTieredCompactionStrategy' AND compression={'sstable_compression': 'LZ4Compressor'; CREATE INDEX name_idx ON cf6 (name); CREATE INDEX number_idx ON cf6 (number); 가장많이사용한다는 Hector 역시 Thrift 보다는덜하지만테이블생성코드나데이 터추가시중복되는객체가많다. 2.3 Astyanax 그리스신화의 Astyanax 는 Hector 의동생이다. 2.2 의 Hector 클라이언트와는상관이없지만 Netflix 15) 에서 Cassandra 를적용하면서 Cassandra 클라이언트인 Astyanax 16) 를개발했고오픈 소스로전향했다. 위예제들과같이 Table 을생성하고한건의데이터를저장하는예제이다. public class AstyanaxTest { private static final String CLUSTER_NAME = "Test Cluster"; private static final String KEY_SPACE_NAME = "schema1"; 15) https://www.netflix.com/global 16) https://github.com/netflix/astyanax 14

SW 공학트렌드 동향분석 Webzine private static final String COLUMN_FAMILY_NAME = "cf21"; private AstyanaxContext<Keyspace> context; private Keyspace keyspace; private ColumnFamily<String, String> COLUMN_FAMILY; public static void main(string[] args) { AstyanaxTest sample = new AstyanaxTest(); sample.getconfig(); sample.create(); sample.insert(); sample.list(); public void getconfig() { context = new AstyanaxContext.Builder().forCluster(CLUSTER_NAME).forKeyspace(KEY_SPACE_NAME).withAstyanaxConfiguration(new AstyanaxConfigurationImpl().setDiscoveryType(NodeDiscoveryType.RING_DESCRIBE)).withConnectionPoolConfiguration( new ConnectionPoolConfigurationImpl("MyConnectionPool").setPort(9160).setMaxConnsPerHost(1).setSeeds("127.0.0.1:9160")).withAstyanaxConfiguration(new AstyanaxConfigurationImpl().setCqlVersion("3.0.0").setTargetCassandraVersion("2.0.1")).withConnectionPoolMonitor(new CountingConnectionPoolMonitor()).buildKeyspace(ThriftFamilyFactory.getInstance()); context.start(); keyspace = context.getclient(); COLUMN_FAMILY = ColumnFamily.newColumnFamily(COLUMN_FAMILY_NAME, StringSerializer.get(), StringSerializer.get()); public void insert() { try { String statement = String.format("insert into " + COLUMN_FAMILY_NAME + " (key, number, name) values (?,?,?) n"); keyspace.preparequery(column_family).withcql(statement).aspreparedstatement().withstringvalue("row1").withstringvalue("1").withstringvalue("kim").execute(); catch (ConnectionException e) { throw new RuntimeException("failed to write data to cql", e); 15 2014 July (No.98)

공학트렌드 public void create() { drop(); String statement = "create table IF NOT EXISTS " + COLUMN_FAMILY_NAME + " (KEY text, number text, name text, PRIMARY KEY (KEY, number)) WITH COMPACT STORAGE;"; try { keyspace.preparequery(column_family).withcql(statement).execute(); catch (ConnectionException e) { throw new RuntimeException("failed to create table", e); 코드를실행후, Table 정보를확인하고, 데이터가저장되었는지확인가능하다. cqlsh:schema1> describe table cf21 CREATE TABLE cf21 ( key text, number text, name text, PRIMARY KEY (key, number) ) WITH COMPACT STORAGE AND bloom_filter_fp_chance=0.010000 AND caching='keys_only' AND comment='' AND dclocal_read_repair_chance=0.000000 AND gc_grace_seconds=864000 AND index_interval=128 AND read_repair_chance=0.100000 AND replicate_on_write='true' AND populate_io_cache_on_flush='false' AND default_time_to_live=0 AND speculative_retry='99.0percentile' AND memtable_flush_period_in_ms=0 AND compaction={'class': 'SizeTieredCompactionStrategy' AND compression={'sstable_compression': 'LZ4Compressor'; cqlsh:schema1> select * from cf21; key number name ------+--------+------ row1 1 Kim (1 rows) 저자는 Hector 보다는 Astyanax 가훨씬깔끔하게사용할수있는소지들이많다. 그래서 저자는저자가개발한서비스모니터링프로젝트의데이터저장소에 Astyanax 를사용하 16

SW 공학트렌드 동향분석 Webzine 여개발하였다. 잘다듬어서 DB 와연결하는코드처럼쉽게쓸수있도록처리하였다. Ⅲ. 정리 Nosql 중하나인 Cassandra 에대한소개와특징을설명했고, 자바클라이언트중대 표적인 Thrift, Hector, Astyanax 예제를통해어떻게사용하는지설명했다. Part 2 에서는 Cassandra 를어떻게테스트할수있는지설명하고 Unit Test 방법을설명할예정이다. 참고자료 1. http://cassandra.apache.org/ 2. http://maxgrinev.com/2010/07/09/a-quick-introduction-to-the-cassandra-data-model/ 3. http://planetcassandra.org/ 4. http://www.datastax.com/ 17 2014 July (No.98)