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

    참고

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