java client of couchbase  


------------


1. 자바 클라이언트 적용  

- pom.xml 에 관련 dependency 추가  

-

    <dependency>

      <groupId>com.couchbase.client</groupId>

      <artifactId>couchbase-client</artifactId>

      <version>1.2.3</version>

    </dependency>

  - client 호출  

  - 

  public CouchbaseClient getCouchbaseClient(){

    CouchbaseClient couchbaseClient = null;

   

    ArrayList<URI> nodes = new ArrayList<URI>();

    

    // Add one or more nodes of your cluster (exchange the IP with yours)

    nodes.add(URI.create("http://lvm001:8091/pools"));

    

    try {

    couchbaseClient = new CouchbaseClient(nodes, "default", "");

    } catch (Exception e) {

    System.err.println("Error connecting to Couchbase: " + e.getMessage());

    System.exit(1);

    }

   

    return couchbaseClient;

 }

    

2. 자바 클라이언트를 통한 read/write to couchbase  

    - data 저장방식  

- java object : java 에서 생성한 object 그대로 입출력, admin-web 에서 json document 형태로 확인이 가능  

- json object : java object 를 json 형태의 object 로 변환하여 입출력, admin-web 에서 json document 형태로 확인이 가능  

- string : java object 를 string 형태로 변환하여 입출력, admin-web 에서 json document 형태로 확인 불가  

    - example  

    - java object  

        public void setObject(String id, CouchbaseVO couchbaseVO){  

      couchbaseClient.add(id, couchbaseVO);  

      }  

      public CouchbaseVO getObject(String id){

      CouchbaseVO couchbaseVO = null;  

      couchbaseVO = (CouchbaseVO)couchbaseClient.get(id);  

      return couchbaseVO;  

      }

    - json obejct  

        public void setJsonObject(String id, CouchbaseVO couchbaseVO){

      Gson gson = new Gson();  

      couchbaseClient.set(id, gson.toJson(couchbaseVO));  

        }

        public CouchbaseVO getJsonObject(String id){  

        Gson gson = new Gson();  

        CouchbaseVO couchbaseVO = null;  

        couchbaseVO = gson.fromJson((String)couchbaseClient.get(id), CouchbaseVO.class);  

        return couchbaseVO;  

        }

    - string   

        public void setString(String id, CouchbaseVO couchbaseVO){  

            couchbaseClient.set(id, couchbaseVO.toString());  

        }   

        public CouchbaseVO getString(String id){  

        CouchbaseVO couchbaseVO = null;  

        String value = (String) couchbaseClient.get(id);      

        couchbaseVO = CouchbaseVO.convert(value);       

        return couchbaseVO;      

        }   

  

      - 비교

- write : string > java == json  

- read : string > java == json  

- 큰 차이가 존재하지는 않았으나 string 타입으로 처리하는 것이 빠른 속도를 내는 것으로 보였다  

- but  

- string 타입은 web 상으로 값이 구분이 안되기 때문에 잘 데이터 확인이 필요한 수준을 판단해야 한다  

- object 를 string 타입으로 잘 변환할 수 있는 java code 를 구현해야 한다

'Nosql > couchbase' 카테고리의 다른 글

couchbase 설치  (0) 2016.08.01
couchbase 소개  (0) 2016.08.01
Posted by 감각적신사
,

# hector - cassandra java client


1. pool architecture

       

- cassandraHostRetryService : 다운된 node 에 대한 재시도

- retryDownedHosts: 서비스 사용유무 . 기본값 true

- retryDownedHostsQueueSize: 모니터링 할 node 수 . 기본값 -1 (전체)

- retryDownedHostsDelayInSeconds: 사용주기 . 기본값 10 sec

- nodeAutoDiscoverService : 새로운 node 에 대한 ring 에 추가할 것인가

- autoDiscoverHosts: 서비스 사용유무 . 기본값 false

- autoDiscoveryDelayInSeconds: 사용주기 . 기본값 30 sec

- autoDiscoveryDataCenters: 특정 datacenter 에 한한 서비스 사용 . 기본값 전체

2. 데이터 일관성 (read , write 따로 적용 가능)

- ANY: 복제본에 대한 응답이 존재할 때 까지 대기  

- ONE: 복제본 1개에 대한 응답이 존재할 때 까지 대기

- TWO: 복제본 2개에 대한 응답이 존재할 때 까지 대기

- THREE: 복제본 3개에 대한 응답이 존재할 때 까지 대기

- QUORUM: (replicationi_factor / 2 ) + 1 개 만큼의 복제본이 응답할 때 까지 대기

- LOCAL_QUORUM: 동일 데이터 센터에서 quorum 만큼의 응답 대기

- EACH_QUORUM: 각각의 데이터 센터에서 quorum 만큼의 응답 대기

- ALL: 모든 replicationi_factor 만큼의 복제본 응답 대기

3. feature

- connection pooling

- 클라이언트 단에서의 장애조치 기능

- JMX(Java Management Extension) 기반의 모니터링

- load balancing 에 대한 설정 기능

- thrift 통신에 대한 캡슐화 , 숨김

- 다운된 node 에 대한 자동 재시도

- 추가된 node 에 대한 자동 검색

- 쉽게 사용할 수 있는 ORM(Object-Relational Mappging)

- cassandra’s data model 에 맞는 type-safe approach

4. hector object mapper

- 카산드라 데이터 저장 단위에 mapping 되도록 지원하는 모듈

- 설정 및 사용

      @Entity

 @Table(name="TestColumnFamily")

 public class MyPojo {

   @Id // rowkey

   private UUID id;


   @Column(name="col1")

   private long longProp1;


      @me.prettyprint.hom.annotations.Column(name = "color", converter = ColorConverter.class)

      private Colors color;


 private Map<String, String> anonymousProps = new HashMap<String, String>();


   @AnonymousPropertyAddHandler

   public void addAnonymousProp(String name, String value) {

    anonymousProps.put(name, value);

   }

      }

      

    Keyspace keyspace = HFactory.createKeyspace("TestKeyspace", cluster);

         entityMgr = new EntityManagerImpl(keyspace, "패키지명");

    MyPojo pojo = new MyPojo();

    pojo.setId(asdd-asdasd-asdsad-asdasd);

    pojo.setLongProp1(0L);

    pojo.setColor("black");

    // 저장

    entityMgr.persist(desk);

    // 읽어오기

    MyPojo loadPojo = entityMgr.load(MyPojo.class, "asdd-asdasd-asdsad-asdasd");



# astyanax - cassandra java client

1. hector lib 를 리팩토링한 lib


2. 3 main part

- connection pool : 다양한 방법으로 load balancing 구현

- cassandra-thrift API implementation

- recipes and utilities : csv import 가능

3. util

- CSV importer

- JSON exporter

4. feature

- context 설정을 통해 장애조치

- 특정 node 에 요청 보내도록 하는 기능

- 토큰 범위를 통한 Host partitions

- latency tracking 기능

- load balancing 선택 가능

- 다운된 node 에 대한 요청 보내지 않음

- JMX 를 통한 모니터링 (단, 커낵션 pool 내부에 대한 로깅 X)

- 다운된 node 자동 재시도

- 추가된 node 자동 검색

- Minimal use of synchronized by using non-blocking data structures


# java driver - cassandra java client

1. datastax 에서 cql 언어를 java 단에서 사용하기 위해 제공


2. 적합성  

   

  

3. feature

- Asynchronous

- Nodes discovery

- Configurable load balancing

- Transparent failover

- Convenient schema access

4. cql문과 cassandra-cli 를 통해 생성된 스키마 간의 호환

- 일부 호환 (select * : o) (insert : x)

- 생성된 스키마에 대한 다른 방법으로 변경 불가

# lib 비교


# lib 비교 분석을 통한 cassandra 사용에 대한 사견

1. cql 사용시 최소한의 리소스로 원하는 데이터를 얻을 수 있다.    

       

- 상황 : sns 를 사용하는 user 를 출력하고 싶다

- cql : select * from UserCF where use_sns='Y';

- cassandra-cli :

1) get[UserCF];

2) use_sns='Y' 에 대해 추가 작업 필요

2. 단, cql 로 생성하지 않는 스키마에서는 cql 의 모든 기능을 사용하기엔 제한된다.

- cassandra-cli 로 생성한 Column Family 에서는 select column명 from CF; (동작하지 않았다)

- cassandra-cli 로 생성한 Column Family 의 스키마 변경이 되지 않았다

3. 그러나~ cql 스키마로 생성하기에는 데이터 모델링에 대한 소요 가 많다.

- DB 에 대한 깊이가 얕은 나로서는 사용하기 적합하지 않다

- append 가 자유롭고 구조가 유연하다는 장점이 발휘되지 않는다는 느낌이 조금 있다

- column key 가 알지 못하는 값으로 들어올 경우 cql 로는 얻기 어렵다? -> select * 을 통해서만 값을 가져올 수 있다

4. 그렇다면!!! hector, astyanax 등으로도 유연하면서 리소스를 잘 다룰수 있는 스키마 생성이 필요하다

- column 에는 많은 정보를 담지 않는다 -> json, map 타입의 데이터는 안 좋지 않을까, 대신 컬럼을 많이 늘리자

- CF 에 대한 rowkey 관리가 필요하다 -> rowkey 는 select * 을 통해 얻거나 client 가 직접 알고 있어야만 하는 정보이다

'Nosql > cassandra' 카테고리의 다른 글

opscenter - cassandra monitor tool  (0) 2016.08.02
cassandra 간단 설치 및 multi cluster 구성하기  (0) 2016.08.02
cassandra cql 3.0  (0) 2016.08.01
cassandra-cli  (0) 2016.08.01
cassandra date model  (0) 2016.08.01
Posted by 감각적신사
,

# Intro of DynamoDB  


1. intro  

- Nosql Database service  

- SSD 구축  

- aws 에 의해 관리  

- 데이터 분할, 복제  

- 서버용량 프로비저닝  

2. consistency  

- write : 3 replica 유지 (aws S3 와 마찬가지로 3개의 region 에 복제본 유지)  

- 복제 관리는 aws 에 의해 관리됨  

- read : 

- *Eventually Consistent Read(default)* : 읽기 처리량 최대, 최신 기록을 반영하지 못할 수도 있다.  

- 문서에 의하면 1초 이내에 최신 기록을 3 복제로 반영해준다고 한다  

- Strongly Consistent Read : 해당 읽기 전에 성공적인 응답을 수신한 모든 쓰기를 반영한 결과를 반환함  

3. feature  

- 다양한 쿼리 지원  

- GET : 1 MB 이내 컬럼 처리  

- GetItem

- BatchGet : 다중 컬럼 입력 가능

- SET : 1 MB 이내 컬럼 처리  

- PutItem

- BatchPut : 다중 컬럼 입력 가능

- UPDATE  

- DELETE  

- **TODO : batch 와 일반 입출력 성능 비교?**

    - 조건부 연산 지원  

    - boolean 함수 : ATTRIBUTE_EXIST, CONTAINS, BEGINS_WITH  

    - 비교 : =, <>, Between, In  

    - 논리 : NOT, AND, OR  

    - 증가, 감소 지원  

    

4. data model  

     

- table  

- item 의 모음  

- primary key 는 반드시 지정해야 한다

- 제한 사항

- item 의 개수 제한이 없다

- 한 리전에 최대 256 개의 테이블 생성 가능 (추가 생성요청은 aws 통해서..)

- item  

- attribute 의 모음  

- 제한 사항

            - attribute 의 개수 제한이 없다

        - 한 item 의 attribute (key,value) 의 총 합은 400 KB 이하여야 한다

        - attribute

          - key-value 의 조합

            - hash key (필수) == primary key     /     range key (선택)

   

5. data type  

- scalar data type : number, string, binary

- multi-valued type : number set, string set, binart set

'Nosql > aws dynamoDB' 카테고리의 다른 글

DynamoDB 테이블 설계  (0) 2016.08.26
DynamoDB 특징  (0) 2016.08.01
Posted by 감각적신사
,

# opscenter - cassandra monitor tool


1. opscenter 소개

- DataStax 에서 제공하는 cassandra monitoring , data explorer

- JMX 를 이용하여 모니터링과 node management 를 한다

2. opscenter 설치

- cassandra 가 설치 되어있어야 한다

- 다운로드 http://www.datastax.com/what-we-offer/products-services/datastax-opscenter

- python ./bin/setup.py

- 실행 : ./bin/opscenter

- 실행 확인 : http://localhost:8888

3. opscenter 사용

- 기존 multi cluster 를 모니터링 한다

- cluster 추가시 해당 node 에 agent 를 설치해야되기 때문에 sudo user 의 id/pw 를 입력한다

   - NODES 메뉴에서 추가된 ring 을 확인할 수 있음         

                

            


'Nosql > cassandra' 카테고리의 다른 글

cassandra java client 소개 및 비교  (0) 2016.08.02
cassandra 간단 설치 및 multi cluster 구성하기  (0) 2016.08.02
cassandra cql 3.0  (0) 2016.08.01
cassandra-cli  (0) 2016.08.01
cassandra date model  (0) 2016.08.01
Posted by 감각적신사
,

# cassandra 간단설치


1. cassandra 소개

    - 오픈소스 분산 데이터베이스 관리 시스템

    - 아마존 다이나모 분산 디자인 과 구글 빅데이블 의 데이터 모델을 기반으로 페이스북에서 활용


2. cassandra 다운로드

    - http://cassandra.apache.org

    - cassandra 2.0 이후 부터는 java 1.7 에서 동작한다


3. 압축 풀기 및 기본 설정

    - ./bin : 실행 파일 cassandra , cassandra-cli 가 존재한다

    - ./conf : cassandra.yaml --> TODO 정리 필요

        - 기본적으로 /var/lib , /var/log 를 path 로 사용

        - sudo chown -R 소유자.소유자그룹 /var/lib/cassandr /var/log/cassandra


4. 실행

    - ./bin/cassandra


# cassandra multi cluster 구성하기


1. vm 구성

- 3개의 노드 준비 (lvm001, lvm002, lvm003)

- /etc/hosts 에 각 노드 등록 : (ip hostname)

- vm 간 방화벽 확인 (port 9160)

- cassandra.yaml

- rpc_port: 9160

- 각자 동작 중인 cassandra 중지 및 데이터 삭제 , commit log 삭제 (/var/lib/cassandra ...)

- cassandra.yaml : 

- data_file_directories: /usr/local/var/lib/cassandra/data

- commitlog_directory: /usr/local/var/lib/cassandra/commitlog


2. 단일 데이터센터 내 멀티 클러스터로 구성하기

- cassandra.yaml 파일 수정

- cluster_name: 'MyDemoCluster'

- num_tokens: 256

- seed_provider:

 - class_name: org.apache.cassandra.locator.SimpleSeedProvider

    - parameters:

          - seeds:  "lvm001"

- listen_address: lvm001 (* 본인 vm 의 값을 넣어준다)

- rpc_address: 0.0.0.0

- endpoint_snitch: RackInferringSnitch

- auto_bootstrap: false : 없는 옵션이므로 추가한다


3. 클러스터 구성 확인하기

- 실행 : ./bin/cassandra &

- 구성확인 : ./bin/nodetool status


4. cassandra.yaml

- path : ./conf/cassandra/yaml *or* /etc/cassandra/conf/cassandra.yaml

- 수정 point

- listen_address : 노드 간 통신하기 위한 address

- default 값은 localhost

- 0.0.0.0 은 노드간 통신 불가

- 멀티노드 구성시 변경이 필요하다

- rpc_address : client 가 접근할 수 있도록 listen address 지정

- default 값은 localhost

- 0.0.0.0 : 전 ip 에 대해 접근 가능하도록 변경

    - rpc_port : client 가 접근할 수 있도록 listen port 지정  

    - seed_provider : 노드가 추가될 때 contact point

    - default 값은 127.0.0.1

    - 멀티노드 구성시 변경이 필요하다

'Nosql > cassandra' 카테고리의 다른 글

cassandra java client 소개 및 비교  (0) 2016.08.02
opscenter - cassandra monitor tool  (0) 2016.08.02
cassandra cql 3.0  (0) 2016.08.01
cassandra-cli  (0) 2016.08.01
cassandra date model  (0) 2016.08.01
Posted by 감각적신사
,

Hadoop - MapReducer

BigData 2016. 8. 2. 11:51

# MapReducer


1. 개념

- Map : 데이터를 key - value 형태로 변경 시킨다

- -- -- -- 정렬 과 병합 -- -- -- : 하둡 플랫폼에서 수행한다

- Reducer : key - value 형태의 데이터를 가공한다

- ※ 기본적으로 **오름차순 정렬**

- ※ 개발자는 MapReducer 만 고민하면 된다, read / write 는 플랫폼에서 지원한다


2. 아키텍쳐 ( Hadoop 2.0 이후 버전 )

       

- JobTrcker : 마스터 노드, ResourceManager 역할로 슬레이브 노드 중 여유있는 노드를 찾아 Job(MapReduce 동작) 을 전달하고 이를 관리함

- TaskTracker : 슬레이브 노드, AppMaster 역할로 실제 Job 을 Map Task 와 Reducer Task 로 나누어 각각의 노드(슬레이브 노드)에 전달한다

- 하둡 1.x 에서는 마스터 노드에서 모두 관리하여 마스터 노드에 부담이 큰 아키텍쳐었다.


3. 동작 원리

       

- Map 작업이 완료 되어야 Reducer 작업이 진행된다

- but Reducer 작업은 Map 의 결과를 옮기는 것부터 시작임으로 로그 상에서 Map task 가 100%을 수행되지 않아도 올라갈 수 있다

- 하둡 플랫폼에 의해 (**사용자 아님**) 데이터의 양을 판단, 입력 스프릿 수를 결정하여 각각 매퍼를 생성

- in JAVA, 리듀서는 default 1개

- 중복되는 task 가 진행 될 경우 하나를 kill 한다

- 투기적 매커니즘 에 의해 긴 응답시간이 걸릴 때 중복 작업을 지시한다 > 먼저 나오는 task 를 제외하고 kill 한다

4. 동작

- 마스터     

[hadoop@hadoop01 input]$ jps      

7847 org.eclipse.equinox.launcher_1.3.0.v20140415-2008.jar          

11356 Jps      

11295 RunJar      

3830 ResourceManager      

5561 JobHistoryServer     

3514 NameNode       

3696 SecondaryNameNode        

- 슬레이브        

[hadoop@hadoop04 ~]$ jps        

5574 YarnChild      

2489 NodeManager          

4883 MRAppMaster (*) : slave 에서 mapreduce 동작시, taskManager 역할을 하게 된다      

5568 YarnChild : (*) 실제 mapreduce 동작하는 프로세스       

5565 YarnChild       

5735 Jps      

5564 YarnChild       

2393 DataNode       

5567 YarnChild      

5566 YarnChild       

- 동작 로그         

Starting Job = job_1432788061280_0003, Tracking URL = http://hadoop01:8088/proxy/application_1432788061280_0003/         

Kill Command = /home/hadoop/hadoop/bin/hadoop job  -kill job_1432788061280_0003

Hadoop job information for Stage-1: number of mappers: 4; number of reducers: 1 >> 매퍼 4개 리듀서 1개 확인            

2015-05-28 16:13:29,860 Stage-1 map = 0%,  reduce = 0%            

2015-05-28 16:13:50,172 Stage-1 map = 100%,  reduce = 0%, Cumulative CPU 15.48 sec         

2015-05-28 16:13:55,362 Stage-1 map = 100%,  reduce = 100%, Cumulative CPU 16.67 sec             

MapReduce Total cumulative CPU time: 16 seconds 670 msec         

Ended Job = job_1432788061280_0003      

MapReduce Jobs Launched:      

Job 0: Map: 4  Reduce: 1   Cumulative CPU: 16.67 sec   HDFS Read: 992186218 HDFS Write: 5 SUCCESS       

Total MapReduce CPU Time Spent: 16 seconds 670 msec       

OK        

6412       

Time taken: 43.959 seconds, Fetched: 1 row(s)        

5. 튜닝 구간

- 셔플 : Map task 와 Reduce task 사이의 전달 구간

- 튜닝 포인트

- Map task 는 메모리 버퍼를 생성한 후 출력데이터를 버퍼에 기록 후 일정 크기에 도달하면 로컬 디스크로 쓴다 (파일 I/O 발생)

- 로컬 디스크 로 쓰여진 spill 파일들을 정렬된 출력 파일로 병합한다 (thread 추가 포인트)

    - 실행 시 추가할 옵션

    - io.sort.mb: 100mb --> 200mb

    - io.sort.factor: 10 --> 30

    - mapred.child.java.opts=-Xmx512m   #JAVA HEAP MEMORY


6. MapReducer 를 구현하는 Java Project

- 구조

- Main.java : Job 을 선언 및 설정   

            Configuration conf = new Configuration();

            Job job = Job.getInstance(conf);

            job.setJobName("JOB_TEST_NAME");

            job.setJarByClass(Main.class);

            job.setMapperClass(TestMapper.class);

            job.setReducerClass(TestReducer.class);

            job.setInputFormatClass(TextInputFormat.class);

            job.setOutputFormatClass(TextOutputFormat.class);

            job.setOutputKeyClass(Text.class);

            job.setOutputValueClass(IntWritable.class);

            FileInputFormat.addInputPath(job, new Path(args[0]));

            FileOutputFormat.setOutputPath(job, new Path(args[1]));

            job.waitForCompletion(true);   


- Mapper.java : 읽어올 데이터의 타입 지정, keyvalue 형태로 변환

          public class TestMapper extends 

          Mapper<LongWritable, Text, Text, IntWritable> {

          

            private final static IntWritable one = new IntWritable(1);

            private Text word = new Text();


            public void map(LongWritable key, Text value, Context context) 

            throws IOException, InterruptedException {

                StringTokenizer itr = new StringTokenizer(value.toString());

                while (itr.hasMoreTokens()) {

                    word.set(itr.nextToken());

                    context.write(word, one);

                }

            }

        }

          

- Reducer.java : keyvalue 형태의 값을 읽어 가공

          public class TestReducer extends

                Reducer<Text, IntWritable, Text, IntWritable> {

            private IntWritable result = new IntWritable();


            public void reduce(Text key, Iterable<IntWritable> values, Context context)

                    throws IOException, InterruptedException {

                int sum = 0;

                for (IntWritable val : values) {

                    sum += val.get();

                }

                result.set(sum);

                context.write(key, result);

            }

        }

- core-site.xml : hdfs 경로 등 설정 값

- hdfs-site.xml : 퍼미션 등의 설정 값

- 주요 용어

- Context > 객체간 메시지를 전달하는 전역변수 역할

- But Pig Project or Hive Project 가 간단하게 짤 수 있다

'BigData' 카테고리의 다른 글

HDFS ( Hadoop Distributed File System )  (0) 2016.08.01
Hadoop 설치  (0) 2016.08.01
Hadoop 기초  (0) 2016.08.01
Posted by 감각적신사
,