View a markdown version of this page

DynamoDB와 Amazon S3 간 데이터 복사 - Amazon DynamoDB

DynamoDB와 Amazon S3 간 데이터 복사

DynamoDB 테이블에 데이터가 있는 경우 Hive를 사용하여 이 데이터를 Amazon S3 버킷으로 복사할 수 있습니다.

DynamoDB 테이블에서 데이터 아카이브를 생성하려는 경우 이렇게 할 수 있습니다. 예를 들어 DynamoDB 내 테스트 데이터의 기준 집합으로 작업해야 하는 테스트 환경을 가정하겠습니다. 기준 데이터를 Amazon S3 버킷으로 복사한 다음 테스트를 실행할 수 있습니다. 나중에 Amazon S3 버킷에서 DynamoDB로 기준 데이터를 복원하여 테스트 환경을 재설정할 수 있습니다.

자습서: Amazon DynamoDB 및 Apache Hive 작업을 완료했다면 이미 Amazon EMR 로그를 포함하는 Amazon S3 버킷이 있습니다. 버킷의 루트 경로를 알고 있다면 이 단원의 예제에서 이 버킷을 사용할 수 있습니다.

  1. https://console.aws.amazon.com/emr에서 Amazon EMR 콘솔을 엽니다.

  2. Name에 대해 클러스터를 선택합니다.

  3. URI은 Configuration Details(구성 세부 정보)의 Log URI(로그 URI)에 나열됩니다.

  4. 버킷의 루트 경로를 기록합니다. 이름 지정 규칙은 다음과 같습니다.

    s3://aws-logs-accountID-region

    여기서 accountID는 AWS 계정 ID이고, region은 버킷의 AWS 리전입니다.

참고

다음 예제에서는 이 예제와 같이 버킷 내 하위 경로를 사용합니다.

s3://aws-logs-123456789012-us-west-2/hive-test

다음 절차는 자습서 내 단계를 완료했고 DynamoDB에 ddb_features라는 외부 테이블이 있다는 전제하에 작성되었습니다.

Hive 기본 형식을 사용하여 데이터 복사

예 DynamoDB에서 Amazon S3로

INSERT OVERWRITE 문을 사용하여 Amazon S3에 직접 작성합니다.

INSERT OVERWRITE DIRECTORY 's3://aws-logs-123456789012-us-west-2/hive-test' SELECT * FROM ddb_features;

Amazon S3 내 데이터 파일은 다음과 같습니다.

920709^ASoldiers Farewell Hill^ASummit^ANM^A32.3564729^A-108.33004616135 1178153^AJones Run^AStream^APA^A41.2120086^A-79.25920781260 253838^ASentinel Dome^ASummit^ACA^A37.7229821^A-119.584338133 264054^ANeversweet Gulch^AValley^ACA^A41.6565269^A-122.83614322900 115905^AChacaloochee Bay^ABay^AAL^A30.6979676^A-87.97388530

각 필드는 SOH 문자(제목 시작 부분, 0x01)로 구분됩니다. 파일에서는 SOH가 ^A로 나타납니다.

예 Amazon S3에서 DynamoDB로
  1. Amazon S3 내의 형식이 지정되지 않은 데이터를 가리키는 외부 테이블을 생성합니다.

    CREATE EXTERNAL TABLE s3_features_unformatted (feature_id BIGINT, feature_name STRING , feature_class STRING , state_alpha STRING, prim_lat_dec DOUBLE , prim_long_dec DOUBLE , elev_in_ft BIGINT) LOCATION 's3://aws-logs-123456789012-us-west-2/hive-test';
  2. DynamoDB에 데이터를 복사합니다.

    INSERT OVERWRITE TABLE ddb_features SELECT * FROM s3_features_unformatted;

사용자 지정 형식을 사용하여 데이터 복사

자체 필드 구분자 문자를 지정하려면 Amazon S3 버킷으로 매핑되는 외부 테이블을 생성할 수 있습니다. 쉼표로 분리된 값(CSV)을 갖는 데이터 파일을 생성할 때 이 기법을 사용할 수 있습니다.

예 DynamoDB에서 Amazon S3로
  1. Amazon S3로 매핑되는 Hive 외부 테이블을 생성합니다. 이때 데이터 형식이 DynamoDB 외부 테이블과 일치해야 합니다.

    CREATE EXTERNAL TABLE s3_features_csv (feature_id BIGINT, feature_name STRING, feature_class STRING, state_alpha STRING, prim_lat_dec DOUBLE, prim_long_dec DOUBLE, elev_in_ft BIGINT) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LOCATION 's3://aws-logs-123456789012-us-west-2/hive-test';
  2. DynamoDB에서 데이터를 복사합니다.

    INSERT OVERWRITE TABLE s3_features_csv SELECT * FROM ddb_features;

Amazon S3 내 데이터 파일은 다음과 같습니다.

920709,Soldiers Farewell Hill,Summit,NM,32.3564729,-108.3300461,6135 1178153,Jones Run,Stream,PA,41.2120086,-79.2592078,1260 253838,Sentinel Dome,Summit,CA,37.7229821,-119.58433,8133 264054,Neversweet Gulch,Valley,CA,41.6565269,-122.8361432,2900 115905,Chacaloochee Bay,Bay,AL,30.6979676,-87.9738853,0
예 Amazon S3에서 DynamoDB로

단일 HiveQL 문을 사용하여 DynamoDB 테이블을 Amazon S3의 데이터로 채울 수 있습니다.

INSERT OVERWRITE TABLE ddb_features SELECT * FROM s3_features_csv;

열 매핑 없이 데이터 복사

데이터 형식 또는 열 매핑을 지정하지 않고 DynamoDB의 데이터를 원본 형식으로 복사하여 Amazon S3에 쓸 수 있습니다. 이 방법을 사용하여 DynamoDB 데이터의 아카이브를 생성하고 Amazon S3에 저장할 수 있습니다.

예 DynamoDB에서 Amazon S3로
  1. DynamoDB 테이블과 연결된 외부 테이블을 생성합니다. (이 HiveQL 문에는 dynamodb.column.mapping이 없습니다.)

    CREATE EXTERNAL TABLE ddb_features_no_mapping (item MAP<STRING, STRING>) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "Features");

  2. Amazon S3 버킷과 연결된 또 하나의 외부 테이블을 생성합니다.

    CREATE EXTERNAL TABLE s3_features_no_mapping (item MAP<STRING, STRING>) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n' LOCATION 's3://aws-logs-123456789012-us-west-2/hive-test';
  3. DynamoDB에서 Amazon S3로 데이터를 복사합니다.

    INSERT OVERWRITE TABLE s3_features_no_mapping SELECT * FROM ddb_features_no_mapping;

Amazon S3 내 데이터 파일은 다음과 같습니다.

Name^C{"s":"Soldiers Farewell Hill"}^BState^C{"s":"NM"}^BClass^C{"s":"Summit"}^BElevation^C{"n":"6135"}^BLatitude^C{"n":"32.3564729"}^BId^C{"n":"920709"}^BLongitude^C{"n":"-108.3300461"} Name^C{"s":"Jones Run"}^BState^C{"s":"PA"}^BClass^C{"s":"Stream"}^BElevation^C{"n":"1260"}^BLatitude^C{"n":"41.2120086"}^BId^C{"n":"1178153"}^BLongitude^C{"n":"-79.2592078"} Name^C{"s":"Sentinel Dome"}^BState^C{"s":"CA"}^BClass^C{"s":"Summit"}^BElevation^C{"n":"8133"}^BLatitude^C{"n":"37.7229821"}^BId^C{"n":"253838"}^BLongitude^C{"n":"-119.58433"} Name^C{"s":"Neversweet Gulch"}^BState^C{"s":"CA"}^BClass^C{"s":"Valley"}^BElevation^C{"n":"2900"}^BLatitude^C{"n":"41.6565269"}^BId^C{"n":"264054"}^BLongitude^C{"n":"-122.8361432"} Name^C{"s":"Chacaloochee Bay"}^BState^C{"s":"AL"}^BClass^C{"s":"Bay"}^BElevation^C{"n":"0"}^BLatitude^C{"n":"30.6979676"}^BId^C{"n":"115905"}^BLongitude^C{"n":"-87.9738853"}

각 필드는 STX 문자(텍스트의 시작 부분, 0x02)로 시작하고 ETX 문자(텍스트의 끝부분, 0x03)로 끝납니다. 파일에서는 STX가 ^B로 나타나고 ETX가 ^C로 나타납니다.

예 Amazon S3에서 DynamoDB로

단일 HiveQL 문을 사용하여 DynamoDB 테이블을 Amazon S3의 데이터로 채울 수 있습니다.

INSERT OVERWRITE TABLE ddb_features_no_mapping SELECT * FROM s3_features_no_mapping;

Amazon S3에서 데이터 보기

SSH를 사용하여 리더 노드에 연결하는 경우 AWS Command Line Interface(AWS CLI)를 사용하여 Hive가 Amazon S3에 쓴 데이터에 액세스할 수 있습니다.

다음 단계는 이 단원에서 설명한 절차 중 하나를 사용하여 DynamoDB에서 Amazon S3로 데이터를 복사했다는 전제하에 작성되었습니다.

  1. 현재 위치가 Hive 명령 프롬프트라면 Linux 명령 프롬프트로 전환합니다.

    hive> exit;
  2. Amazon S3 버킷 내 hive-test 디렉터리의 내용을 나열합니다. (Hive가 DynamoDB에서 데이터를 복사하여 저장한 디렉터리입니다.)

    aws s3 ls s3://aws-logs-123456789012-us-west-2/hive-test/

    응답이 다음과 비슷할 것입니다.

    2016-11-01 23:19:54 81983 000000_0

    파일 이름(000000_0)은 시스템에 의해 생성됩니다.

  3. (선택 사항) 데이터 파일을 Amazon S3에서 리더 노드의 로컬 파일 시스템으로 복사할 수 있습니다. 그런 다음 표준 Linux 명령줄 유틸리티를 사용하여 파일 데이터에 대한 작업을 수행할 수 있습니다.

    aws s3 cp s3://aws-logs-123456789012-us-west-2/hive-test/000000_0 .

    응답이 다음과 비슷할 것입니다.

    download: s3://aws-logs-123456789012-us-west-2/hive-test/000000_0 to ./000000_0

    참고

    리더 노드의 로컬 파일 시스템은 용량이 제한적입니다. 로컬 파일 시스템의 가용 용량보다 큰 파일에는 이 명령을 사용하지 마세요.