노력과 삽질 퇴적물

DB: NoSQL과 Amazon DynamoDB 본문

프로그래밍note/서버 및 통신

DB: NoSQL과 Amazon DynamoDB

MTG 2017. 5. 11. 13:56







0. 필요한 파일


파일명

예시 경로

 이클립스[#]

 C:\eclipse

 AWS Toolkit for Eclipse [#]

 (이클립스 플러그인)
 JDK, JAVA SE [#] C:\Java\jdk1.8.0_111
 Java용 AWS SDK [#] D:\dev_lib\aws_java_sdk
> aws-java-sdk-1.11.111


개발용 환경변수 설정(Path 설정) 참조.






1. NoSQL


* MySQL같은 RDBMS(relational database management system)와 달리

NoSQL(Not Only SQL)은 분산처리에 촛점을 둔 비관계형 데이터 저장기술이다.


1) 장점

> 데이터간의 관계를 정의X: Join등의 관계형 연산 없음.

> 빅데이터에 최적화: 페타바이트급 용량 가능.

> 데이터 처리 완결성(Transaction) 보장하지 않음.

> Schemaless: 데이터의 스키마와 속성들을 다양하게 수용하고 동적으로 정의

: 테이블 생성시 고정된 Hashkey, RangeKey만 맞으면 put/update등의 처리 입력이 자유롭다.

> 높은 레벨의 트랜잭선이 제공되지 않고, 데이터 검증이 없기때문에 저장이 빠르다.

> 대다수의 제품이 오픈소스



2) 단점

> Join 연산이 없으므로 복잡한 검색이 어렵다.

> 대체로 순서가 보장되지 않음.

> RDBMS에 비해 안정성 검증이 덜되었다.

: 특히 금융권에 부적합.

> 용도가 한정된 상황이다.

: 댓글, 메신져 로그 등등



3) 종류

 key-value 형식

 문서 형식

 그래프 형식

 컬럼 형식

 가장 일반적인 종류.

 


예. Riak, Vodemort, Tokyo등

 JSON, XML과 같은 Collection 데이터 모델


예. Mongo DB, Cough DB, DynamoDB

 Nodes, Relationship, Key-Value 데이터 모델


예. AgensGraph, Neo4j, SAP HANA 등등.

 데이터의 컬럼을 읽고 쓰는 데 최적화


예. HBase, Cassandra, Hypertable






2. DynamoDB


* JAVA기준입니다.


1) 테이블 기본 제어

① getItem

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
private final String TABLE_NAME = "my_dynamoDB_table_name";
private final String TABLE_RANGED_KEY = "hashTag_or_category_key";
DynamoDB dynamoDB = new DynamoDB(new AmazonDynamoDBClient());
... ... ...
 
Table table = dynamoDB.getTable( TABLE_NAME );
GetItemSpec spec = new GetItemSpec();
            spec.withPrimaryKey("p_key_label""this is unique val""r_key_label", TABLE_RANGED_KEY );
            spec.withAttributesToGet( "col_name_1", ...,"col_name_k");// as like as 'SELECT col_name_1, ..., col_name_k' 
Item tableResultItem = null;
 
try {
    tableResultItem = table.getItem(spec);
                
    if(tableResultItem==null){
        //do-somthing
        return;
    }
catch (AmazonServiceException exception) {
    //    REF. http://docs.aws.amazon.com/ko_kr/amazondynamodb/latest/developerguide/Programming.Errors.html
    //do-somthing
    }
catch (AmazonClientException exception) {
    //do-somthing
}
cs


② putItem

withConditionExpression으로 신규 아이템 추가 OR 기존 아이템 갱신 처리도 가능.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
private final String TABLE_NAME = "my_dynamoDB_table_name";
private final String TABLE_RANGED_KEY = "hashTag_or_category_key";
DynamoDB dynamoDB = new DynamoDB(new AmazonDynamoDBClient());
... ... ...
 
Table table = dynamoDB.getTable( TABLE_NAME );
Item tableResultItem = null;
HashSet<String> hashSet = new HashSet<String>( Arrays.asList("item_1""item_2"));
 
tableResultItem = new Item();
tableResultItem.withPrimaryKey("p_key_label""this is unique val""r_key_label", TABLE_RANGED_KEY );
tableResultItem.withInt("col_name_1"2017);
tableResultItem.withString("col_name_2""ANALOG-GREEN");
tableResultItem.withStringSet( "col_name_3", hashSet );//WARN. DynamoDB does not allow empty sets.
 
PutItemSpec putItemSpec = new PutItemSpec();
putItemSpec.withItem(tableResultItem);
putItemSpec.withConditionExpression("attribute_not_exists(p_key_label)");
 
try{
    table.putItem(putItemSpec);
}catch(ConditionalCheckFailedException e){
    //do something
}catch (AmazonServiceException exception) {
    //    REF. http://docs.aws.amazon.com/ko_kr/amazondynamodb/latest/developerguide/Programming.Errors.html
    //do-somthing
    }
catch (AmazonClientException exception) {
    //do-somthing
}
cs


③ updateItem

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
private final String TABLE_NAME = "my_dynamoDB_table_name";
private final String TABLE_RANGED_KEY = "hashTag_or_category_key";
DynamoDB dynamoDB = new DynamoDB(new AmazonDynamoDBClient());
... ... ...
 
Table table = dynamoDB.getTable( TABLE_NAME );
UpdateItemSpec updateItemSpec = new UpdateItemSpec();
updateItemSpec.withPrimaryKey("p_key_label""this is unique val""r_key_label", TABLE_RANGED_KEY);
updateItemSpec.withUpdateExpression("SET date=:newDate, cnt=:newCnt");
updateItemSpec.withConditionExpression("date<:newDate AND attribute_exists(p_key_label)");
updateItemSpec.withValueMap( new ValueMap()
                                .withNumber( ":newDate", newDate)
                                .withNumber( ":newCnt", newCnt) );
 
// update to dynamoDB
try{
    table.updateItem(updateItemSpec);
}catch(ConditionalCheckFailedException exception){
    // do something
}
cs

Making Comparisons

Logical Evaluations



2) 추가제어
① BatchGetItem

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
private final String TABLE_NAME = "my_dynamoDB_table_name";
private final String TABLE_RANGED_KEY = "hashTag_or_category_key";
DynamoDB dynamoDB = new DynamoDB(new AmazonDynamoDBClient());
... ... ...
 
BatchGetItemOutcome outcome = null;
Map<String, List<Item>> profileTableItems = null;
 
TableKeysAndAttributes tableKeysAndAttributes = new TableKeysAndAttributes( TABLE_NAME );
tableKeysAndAttributes.addHashAndRangePrimaryKey("p_key_label""this is unique val_1""r_key_label"1234);
tableKeysAndAttributes.addHashAndRangePrimaryKey("p_key_label""this is unique val_2""r_key_label"5678);
 
try {
    outcome = dynamoDB.batchGetItem(ReturnConsumedCapacity.TOTAL, tableKeysAndAttributes);
    profileTableItems = outcome.getTableItems();
 
catch (AmazonServiceException exception) {
    //REF. http://docs.aws.amazon.com/ko_kr/amazondynamodb/latest/developerguide/Programming.Errors.html
    //do-somthing
catch (AmazonClientException exception) {
    //do-somthing
}
cs

> [#추가 샘플코드]

> putItem이나 updateItem과 달리 다수의 테이블 아이템을 hashKey, rangedKey를 지정해서 가져올수 있지만, 결과값이 100개로 제한됨. 특정 randgedKey로 다수의 아이템 검색이 필요하면 Query가 권장되고 있음.

> 검색할 몇백개를 제한갯수에 맞춰 분할해서 BatchGetItem하면 결과로 받는 갯수상 누락이 발생하는거 확인한 상태.


② BatchWriteItem

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
private final String TABLE_NAME = "my_dynamoDB_table_name";
private final String TABLE_RANGED_KEY = "hashTag_or_category_key";
DynamoDB dynamoDB = new DynamoDB(new AmazonDynamoDBClient());
Item item = null;
... ... ...
 
TableWriteItems tableWriteItems = new TableWriteItems( TABLE_NAME );
item = new Item();
...
tableWriteItems.addItemToPut(item);
...
item = new Item();
...
tableWriteItems.addItemToPut(item);
 
try {
    dynamoDB.batchWriteItem(tableWriteItems);
catch (AmazonServiceException exception) {
    //REF. http://docs.aws.amazon.com/ko_kr/amazondynamodb/latest/developerguide/Programming.Errors.html
    //do-somthing
catch (AmazonClientException exception) {
    //do-somthing
}
cs

> [#샘플코드]

> putItem이나 updateItem과 달리 다수의 테이블 아이템 갱신을 한번에 가능하지만, 조건문을 걸수 없다.


③ Scan

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
private final String TABLE_NAME = "my_dynamoDB_table_name";
DynamoDB dynamoDB = new DynamoDB(new AmazonDynamoDBClient());
... ... ...
 
Table table = dynamoDB.getTable( TABLE_NAME );
ItemCollection<ScanOutcome> tableItems = null;
 
ScanFilter primaryKeyFilter = new ScanFilter("p_key_label").contains( "something_word" );
ScanSpec spec = new ScanSpec();
spec.setMaxResultSize( 100 );
spec.withScanFilters(primaryKeyFilter);
 
try {
    tableItems = table.scan(spec);
catch (AmazonServiceException exception) {
    //REF. http://docs.aws.amazon.com/ko_kr/amazondynamodb/latest/developerguide/Programming.Errors.html
    //do-somthing
catch (AmazonClientException exception) {
    //do-somthing
}
cs

> [#Scan 예제]


④ Query

> [#Query 예제]

> rangedKey등으로 검색범위 지정해서 결과 아이템을 뽑아내는 방법은 BatchGet과 거의 유사.




3. 비교문


Comparison Operator and Function Reference - Amazon DynamoDB참조.

update조건문을 걸때,

[<>]가 [!=]와 같은 처리이고 [=]가 [==]인거 빼고는 다른 언어에서의 연산자와 같습니다.






기타. 참조문서


1) NoSQL

NoSQL이란 무엇입니까? – Amazon Web Services(AWS)

* 공개SW 기술팁 - [빅데이터] NoSQL이란 무엇인가?

NOSQL Databases



2) DynamoDB

Amazon DynamoDB - Wikipedia

Amazon DynamoDB란 무엇입니까? - Amazon DynamoDB  [#html]  [#pdf]

Amazon DynamoDB 시작하기 - Amazon DynamoDB

Amazon DynamoDB - Amazon DynamoDB


AWS Toolkit for Eclipse

Using DynamoDB with AWS Explorer — User Guide

이 개발자 안내서의 코드 샘플 실행 - Amazon DynamoDB


AWS Toolkits for Eclipse and Visual Studio Now Support DynamoDB | AWS Blog

com.amazonaws.services.dynamodbv2.document.quickstart.F_UpdateItemTest in aws-sdk-java | Insight.io



3) 기타

Graph database - Wikipedia







기타. 변경이력


일자

변경이력

2017-05-11

 초안

2017-09-28

 [3. 비교문] 항목 추가