

# 자습서: Amazon DynamoDB 및 Apache Hive 작업
<a name="EMRforDynamoDB.Tutorial"></a>

이 자습서에서는 Amazon EMR 클러스터를 시작한 다음 Apache Hive를 사용하여 DynamoDB 테이블에 저장된 데이터를 처리합니다.

*Hive*는 여러 소스의 데이터를 처리 및 분석할 수 있게 해주는, Hadoop용 데이터 웨어하우스 애플리케이션입니다. Hive는 SQL과 유사한 언어인 *HiveQL*을 제공합니다. 이 언어를 사용하면 Amazon EMR 클러스터에 로컬로 저장된 데이터 또는 외부 데이터 원본(예: Amazon DynamoDB)에 저장된 데이터로 작업할 수 있습니다.

자세한 내용은 [Hive Tutorial](https://cwiki.apache.org/confluence/display/Hive/Tutorial)을 참조하세요.

**Topics**
+ [시작하기 전 준비 사항](#EMRforDynamoDB.Tutorial.BeforeYouBegin)
+ [1단계: Amazon EC2 키 페어 생성](EMRforDynamoDB.Tutorial.EC2KeyPair.md)
+ [2단계: Amazon EMR 클러스터 시작](EMRforDynamoDB.Tutorial.LaunchEMRCluster.md)
+ [3단계: 리더 노드에 연결](EMRforDynamoDB.Tutorial.ConnectToLeaderNode.md)
+ [4단계: HDFS로 데이터 로드](EMRforDynamoDB.Tutorial.LoadDataIntoHDFS.md)
+ [5단계: DynamoDB로 데이터 복사](EMRforDynamoDB.Tutorial.CopyDataToDDB.md)
+ [6단계: DynamoDB 테이블의 데이터 쿼리](EMRforDynamoDB.Tutorial.QueryDataInDynamoDB.md)
+ [7단계: (선택 사항) 정리](EMRforDynamoDB.Tutorial.CleanUp.md)

## 시작하기 전 준비 사항
<a name="EMRforDynamoDB.Tutorial.BeforeYouBegin"></a>

이 자습서를 이해하려면 다음이 필요합니다.
+ AWS 계정. 계정이 없을 경우 [에 가입AWS](SettingUp.DynamoWebService.md#SettingUp.DynamoWebService.SignUpForAWS) 단원을 참조하세요.
+ SSH 클라이언트(Secure Shell). SSH 클라이언트를 사용하여 Amazon EMR 클러스터의 리더 노드에 연결하고 대화형 명령을 실행합니다. SSH 클라이언트는 대부분의 Linux, Unix 및 Mac OS X 설치 시 기본적으로 사용됩니다. Windows 사용자는 SSH가 지원되는 [PuTTY](http://www.chiark.greenend.org.uk/~sgtatham/putty/) 클라이언트를 다운로드하여 설치하면 됩니다.

**다음 단계**  
[1단계: Amazon EC2 키 페어 생성](EMRforDynamoDB.Tutorial.EC2KeyPair.md)

# 1단계: Amazon EC2 키 페어 생성
<a name="EMRforDynamoDB.Tutorial.EC2KeyPair"></a>

이 단계에서는 Amazon EMR 리더 노드에 연결하고 Hive 명령을 실행하는 데 필요한 Amazon EC2 키 페어를 생성합니다.

1. AWS Management Console에 로그인하고 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)에서 Amazon EC2 콘솔을 엽니다.

1. 리전을 선택합니다(예: `US West (Oregon)`). 이 리전은 DynamoDB 테이블이 있는 리전과 동일해야 합니다.

1. 탐색 창에서 [**Key Pairs**]를 선택합니다.

1. **키 페어 생성(Create Key Pair)**을 선택합니다.

1. **Key pair name**에서 키 페어의 이름(예: `mykeypair`)을 입력한 다음 **Create**를 선택합니다.

1. 프라이빗 키 파일을 다운로드합니다. 파일 이름은 `.pem`으로 끝납니다(`mykeypair.pem` 등). 프라이빗 키 파일은 안전한 곳에 보관하세요. 이 키 페어를 사용하여 시작한 모든 Amazon EMR 클러스터에 액세스하는 데 필요합니다.
**중요**  
키 페어를 잃어버린 경우에는 Amazon EMR 클러스터의 리더 노드에 연결할 수 없습니다.

   Amazon EC2 키 페어에 대한 자세한 내용은 Amazon EC2 사용 설명서에서 [Amazon EC2 키 페어](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html)를 참조하세요.**

**다음 단계**  
[2단계: Amazon EMR 클러스터 시작](EMRforDynamoDB.Tutorial.LaunchEMRCluster.md)

# 2단계: Amazon EMR 클러스터 시작
<a name="EMRforDynamoDB.Tutorial.LaunchEMRCluster"></a>

이 단계에서는 Amazon EMR 클러스터를 구성하고 시작합니다. Hive와 DynamoDB용 스토리지 핸들러는 이미 클러스터에 설치되어 있을 것입니다.

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

1. **Create Cluster**를 선택합니다.

1. **Create Cluster - Quick Options** 페이지에서 다음을 수행합니다.

   1. **Cluster name**에 클러스터 이름을 입력합니다(예: `My EMR cluster`).

   1. **EC2 key pair**에서 앞서 생성한 키 페어를 선택합니다.

   기타 설정은 기본값을 유지합니다.

1. **클러스터 생성**을 선택합니다.

클러스터를 시작하는 데 몇 분이 걸릴 수 있습니다. Amazon EMR 콘솔의 **Cluster Details(클러스터 세부 정보)** 페이지에서 진행 상황을 모니터링할 수 있습니다.

`Waiting` 상태로 변경된 이후에 클러스터를 사용할 수 있습니다.

## 클러스터 로그 파일 및 Amazon S3
<a name="EMRforDynamoDB.Tutorial.LaunchEMRCluster.LogFilesAndS3"></a>

Amazon EMR 클러스터는 클러스터 상태 정보와 디버깅 정보를 포함하는 로그 파일을 생성합니다. **Create Cluster - Quick Options(클러스터 생성 - 빠른 옵션)**의 기본 설정에는 Amazon EMR 로깅 설정이 포함됩니다.

없는 경우 AWS Management Console에서 Amazon S3 버킷을 생성합니다. 버킷 이름은 `aws-logs-account-id-region`이며, 여기에서 ` account-id`는 AWS 계정 번호, `region`은 클러스터를 시작한 리전입니다(예: `aws-logs-123456789012-us-west-2`).

**참고**  
Amazon S3 콘솔을 사용하여 로그 파일을 볼 수 있습니다. 자세한 내용은 *Amazon EMR 관리 가이드*의 [로그 파일 보기](https://docs.aws.amazon.com/ElasticMapReduce/latest/ManagementGuide/emr-manage-view-web-log-files.html) 단원을 참조하세요.

이 버킷을 로깅 이외에 용도로 사용할 수 있습니다. 예를 들어, 버킷을 Hive 스크립트를 저장하기 위한 위치로 사용하거나 Amazon DynamoDB에서 Amazon S3로 데이터를 내보낼 때 대상으로 사용할 수 있습니다.

**다음 단계**  
[3단계: 리더 노드에 연결](EMRforDynamoDB.Tutorial.ConnectToLeaderNode.md)

# 3단계: 리더 노드에 연결
<a name="EMRforDynamoDB.Tutorial.ConnectToLeaderNode"></a>

Amazon EMR 클러스터의 상태가 `Waiting`으로 바뀌면 SSH를 사용하여 리더 노드에 연결하여 명령줄 작업을 수행할 수 있습니다.

1. Amazon EMR 콘솔에서 상태를 볼 클러스터의 이름을 선택합니다.

1. **Cluster Details(클러스터 세부 정보)** 페이지에서 **Leader public DNS(리더 퍼블릭 DNS)** 필드를 찾습니다. 이 필드는 Amazon EMR 클러스터 리더 노드의 퍼블릭 DNS 이름입니다.

1. DNS 이름 오른쪽에서 **SSH** 링크를 선택합니다.

1. **SSH를 사용하여 리더 노드에 연결**의 지침을 따릅니다.

   운영 체제에 따라 **Windows** 탭 또는 **Mac/Linux** 탭을 선택하고 리더 노드를 연결하는 지침을 따릅니다.

SSH 또는 PuTTY를 사용하여 리더 노드에 연결되면 다음과 비슷한 명령 프롬프트가 나타납니다.

```
[hadoop@ip-192-0-2-0 ~]$ 
```

**다음 단계**  
[4단계: HDFS로 데이터 로드](EMRforDynamoDB.Tutorial.LoadDataIntoHDFS.md)

# 4단계: HDFS로 데이터 로드
<a name="EMRforDynamoDB.Tutorial.LoadDataIntoHDFS"></a>

이 단계에서는 데이터 파일을 Hadoop 분산 파일 시스템(HDFS)으로 복사한 후 해당 데이터 파일로 매핑되는 외부 Hive 테이블을 생성합니다.

**샘플 데이터 다운로드**

1. 샘플 데이터 아카이브(`features.zip`)를 다운로드합니다.

   ```
   wget https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/samples/features.zip
   ```

1. 아카이브에서 `features.txt` 파일을 추출합니다.

   ```
   unzip features.zip
   ```

1. `features.txt` 파일의 처음 몇 줄을 확인합니다.

   ```
   head features.txt
   ```

   결과가 다음과 비슷할 것입니다.

   ```
   1535908|Big Run|Stream|WV|38.6370428|-80.8595469|794
   875609|Constable Hook|Cape|NJ|40.657881|-74.0990309|7
   1217998|Gooseberry Island|Island|RI|41.4534361|-71.3253284|10
   26603|Boone Moore Spring|Spring|AZ|34.0895692|-111.410065|3681
   1506738|Missouri Flat|Flat|WA|46.7634987|-117.0346113|2605
   1181348|Minnow Run|Stream|PA|40.0820178|-79.3800349|1558
   1288759|Hunting Creek|Stream|TN|36.343969|-83.8029682|1024
   533060|Big Charles Bayou|Bay|LA|29.6046517|-91.9828654|0
   829689|Greenwood Creek|Stream|NE|41.596086|-103.0499296|3671
   541692|Button Willow Island|Island|LA|31.9579389|-93.0648847|98
   ```

   `features.txt` 파일에는 미국 지명위원회([http://geonames.usgs.gov/domestic/download\$1data.htm](http://geonames.usgs.gov/domestic/download_data.htm))의 데이터의 하위 집합이 포함되어 있습니다. 각 행의 필드는 다음 정보를 표시합니다.
   + 지형 ID(고유 식별자)
   + 이름
   + 클래스(호수, 산림, 강 등)
   + State
   + 위도(각도)
   + 경도(각도)
   + 고도(피트)

1. 명령 프롬프트에 다음 명령을 입력합니다.

   ```
   hive
   ```

   명령 프롬프트 이렇게 바뀝니다. `hive>` 

1. 다음 HiveQL 문을 입력하여 고유 Hive 테이블을 생성합니다.

   ```
   CREATE TABLE hive_features
       (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 '|'
       LINES TERMINATED BY '\n';
   ```

1. 다음 HiveQL 문을 입력하여 테이블에 데이터를 로드합니다.

   ```
   LOAD DATA
   LOCAL
   INPATH './features.txt'
   OVERWRITE
   INTO TABLE hive_features;
   ```

1. 이제 고유 Hive 테이블에 `features.txt` 파일 데이터가 채워졌습니다. 확인하려면 다음 HiveQL 문을 입력합니다.

   ```
   SELECT state_alpha, COUNT(*)
   FROM hive_features
   GROUP BY state_alpha;
   ```

   출력에 주 목록과 각 주의 지형 수가 표시되어야 합니다.

**다음 단계**  
[5단계: DynamoDB로 데이터 복사](EMRforDynamoDB.Tutorial.CopyDataToDDB.md)

# 5단계: DynamoDB로 데이터 복사
<a name="EMRforDynamoDB.Tutorial.CopyDataToDDB"></a>

이 단계에서는 Hive 테이블(`hive_features`)의 데이터를 DynamoDB의 새 테이블로 복사합니다.

1. [https://console.aws.amazon.com/dynamodb/](https://console.aws.amazon.com/dynamodb/)에서 DynamoDB 콘솔을 엽니다.

1. **Create Table(테이블 생성)**을 선택합니다.

1. **Create DynamoDB table** 페이지에서 다음 작업을 수행합니다.

   1. **테이블**에 **Features**를 입력합니다.

   1. **기본 키**의 **파티션 키** 필드에 **Id**를 입력합니다. 데이터 형식을 [**Number**]로 설정합니다.

      **Use Default Settings**를 지웁니다. **Provisioned Capacity**에 대해 다음을 입력합니다.
      + **읽기 용량 단위** `10`- 
      + **쓰기 용량 단위** `10`- 

   **생성(Create)**을 선택합니다.

1. Hive 프롬프트에서 다음 HiveQL 문을 입력합니다.

   ```
   CREATE EXTERNAL TABLE ddb_features
       (feature_id   BIGINT,
       feature_name  STRING,
       feature_class STRING,
       state_alpha   STRING,
       prim_lat_dec  DOUBLE,
       prim_long_dec DOUBLE,
       elev_in_ft    BIGINT)
   STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler'
   TBLPROPERTIES(
       "dynamodb.table.name" = "Features",
       "dynamodb.column.mapping"="feature_id:Id,feature_name:Name,feature_class:Class,state_alpha:State,prim_lat_dec:Latitude,prim_long_dec:Longitude,elev_in_ft:Elevation"
   );
   ```

   이제 Hive와 DynamoDB의 Features 테이블에 사이에 매핑이 설정되었습니다.

1. 다음 HiveQL 문을 입력하여 DynamoDB로 데이터를 가져옵니다.

   ```
   INSERT OVERWRITE TABLE ddb_features
   SELECT
       feature_id,
       feature_name,
       feature_class,
       state_alpha,
       prim_lat_dec,
       prim_long_dec,
       elev_in_ft
   FROM hive_features;
   ```

   Hive가 MapReduce 작업을 제출하고, Amazon EMR 클러스터가 작업을 처리합니다. 작업을 완료하는 데 몇 분이 걸릴 수 있습니다.

1. DynamoDB에 데이터가 로드되었는지 확인합니다.

   1. DynamoDB 콘솔 탐색 창에서 **Tables(테이블)**를 선택합니다.

   1. Features 테이블을 선택한 다음 **Items** 탭을 선택하여 데이터를 봅니다.

**다음 단계**  
[6단계: DynamoDB 테이블의 데이터 쿼리](EMRforDynamoDB.Tutorial.QueryDataInDynamoDB.md)

# 6단계: DynamoDB 테이블의 데이터 쿼리
<a name="EMRforDynamoDB.Tutorial.QueryDataInDynamoDB"></a>

이 단계에서는 HiveQL을 사용하여 DynamoDB에서 Features 테이블을 쿼리합니다. 다음 Hive 쿼리를 시도해 보세요.

1. 알파벳 순으로 모든 지형 유형(`feature_class`):

   ```
   SELECT DISTINCT feature_class
   FROM ddb_features
   ORDER BY feature_class;
   ```

1. "M"으로 시작하는 모든 호수:

   ```
   SELECT feature_name, state_alpha
   FROM ddb_features
   WHERE feature_class = 'Lake'
   AND feature_name LIKE 'M%'
   ORDER BY feature_name;
   ```

1. 고도가 1마일(5,280피트) 이상인 지형이 3개 이상인 주:

   ```
   SELECT state_alpha, feature_class, COUNT(*)
   FROM ddb_features
   WHERE elev_in_ft > 5280
   GROUP by state_alpha, feature_class
   HAVING COUNT(*) >= 3
   ORDER BY state_alpha, feature_class;
   ```

**다음 단계**  
[7단계: (선택 사항) 정리](EMRforDynamoDB.Tutorial.CleanUp.md)

# 7단계: (선택 사항) 정리
<a name="EMRforDynamoDB.Tutorial.CleanUp"></a>

이제 자습서를 모두 마쳤습니다. 이 단원을 계속 읽으면서 Amazon EMR에서의 DynamoDB 데이터 작업에 대해 보다 자세히 알아볼 수 있습니다. 그러는 동안 Amazon EMR 클러스터를 계속 실행해야 할 수 있습니다.

더 이상 클러스터가 필요하지 않을 경우 클러스터를 종료하고 관련 리소스를 모두 제거해야 합니다. 그래야 불필요한 리소스에 대해 요금을 지불하지 않을 수 있습니다.

1. Amazon EMR 클러스터를 종료합니다.

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

   1. Amazon EMR 클러스터를 선택하고 **Terminate(종료)**를 선택한 다음 확인합니다.

1. DynamoDB에서 Features 테이블을 삭제합니다.

   1. [https://console.aws.amazon.com/dynamodb/](https://console.aws.amazon.com/dynamodb/)에서 DynamoDB 콘솔을 엽니다.

   1. 탐색 창에서 **테이블**을 선택합니다.

   1. Features 테이블을 선택합니다. **Actions** 메뉴에서 **Delete Table**을 선택합니다.

1. Amazon EMR 로그 파일을 포함하는 Amazon S3 버킷을 삭제합니다.

   1. [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)에서 S3 콘솔을 엽니다.

   1. 버킷 목록에서 `aws-logs- accountID-region`을 선택합니다. 여기서 *accountID*는 AWS 계정 번호이고, *region*은 클러스터를 시작한 리전입니다.

   1. **Action** 메뉴에서 **Delete**를 선택합니다.