

# チュートリアル:Amazon DynamoDB と Apache Hive の使用
<a name="EMRforDynamoDB.Tutorial"></a>

このチュートリアルでは、まず、Amazon EMR クラスターを起動した上で、DynamoDB テーブルに格納されているデータの処理に Apache Hive を使用していきます。

*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 クライアント (セキュアシェル)。SSH クライアントを使用して、Amazon EMR クラスターのリーダーノードに接続し、対話型コマンドを実行します。ほとんどの Linux、Unix、および Mac OS X の実装では、SSH クライアントをデフォルトで利用できます。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 マネジメントコンソール にサインインし、Amazon EC2 コンソール ([https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/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. Amazon EMR コンソール ([https://console.aws.amazon.com/emr](https://console.aws.amazon.com/emr/)) を開きます。

1. [**クラスターの作成**] を選択します。

1. **[Create Cluster - Quick Options]** (クラスターの作成 – クイックオプション) ページで、以下を実行します。

   1. **[Cluster name]** (クラスター名) にクラスターの名前を入力します (例: `My EMR cluster` など)。

   1. **[EC2 key pair]** (EC2 キーペア) で、先に作成してあるキーペアを選択します。

   その他の設定はデフォルト値のままにしておきます。

1. [**Create cluster (クラスターの作成)**] を選択します。

クラスターを起動するには数分間かかります。このプロセスの進捗状況は、Amazon EMR コンソールの **[Cluster Details]** (クラスターの詳細) ページで確認できます。

ステータスが `Waiting` に変わると、クラスターは使用可能状態になっています。

## クラスターのログファイルと Amazon S3
<a name="EMRforDynamoDB.Tutorial.LaunchEMRCluster.LogFilesAndS3"></a>

Amazon EMR クラスターは、クラスターのステータスやデバッグに関する情報が記載されたログファイルを生成します。[**Create Cluster - Quick Options (クラスターの作成-クイックオプション)**] のデフォルト設定には、Amazon EMR でのログ記録に関する設定が含まれています。

まだ Amazon S3 バケットが存在しない場合は、AWS マネジメントコンソール マネジメントコンソールにより作成されます。このバケットの名前は `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. **[Connect to the Leader Node Using SSH]** (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 Distributed File System (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 (固有の識別子)
   + 名前
   + クラス (湖、森林、小川、その他)
   + 状態
   + 緯度 (度)
   + 経度 (度)
   + 高度 (フィート)

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. これで、`features.txt` ファイルからのデータが格納された、ネイティブ Hive テーブルが用意できます。これを確認するには、次の 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. DynamoDB コンソール ([https://console.aws.amazon.com/dynamodb/](https://console.aws.amazon.com/dynamodb/)) を開きます。

1. [**テーブルの作成**] を選択します。

1. **[Create DynamoDB table]** (DynamoDB テーブルの作成) ページで、次の操作を行います。

   1. **[Table]** (テーブル) に **Features** とタイプします。

   1. **[Partition key]** (パーティションキー) フィールドの **[Primary key]** (プライマリキー) に **Id** とタイプします。データ型を [**数値**] に設定します。

      **[Use default settings]** (デフォルト設定の使用) を消します。**[Provisioned Capacity]** (プロビジョニングキャパシティ) に以下をタイプします。
      + **[Read Capacity Units]** (読み込みキャパシティユニット) — `10`
      + **[Write Capacity Units]** (書き込みキャパシティユニット) — `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 のフィーチャーテーブル間でのマッピングが確立されました。

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. フィーチャーテーブルを選択し、**[Items]** (アイテム) タブを選択して、データを表示します。

**次のステップ**  
[ステップ 6: DynamoDB テーブル内のデータをクエリを行います](EMRforDynamoDB.Tutorial.QueryDataInDynamoDB.md)

# ステップ 6: DynamoDB テーブル内のデータをクエリを行います
<a name="EMRforDynamoDB.Tutorial.QueryDataInDynamoDB"></a>

このステップでは、HiveQL を使用して DynamoDB の フィーチャーテーブルをクエリします。以下の 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. Amazon EMR コンソール ([https://console.aws.amazon.com/emr](https://console.aws.amazon.com/emr/)) を開きます。

   1. Amazon EMR クラスターを選択した上で、**[Terminate]** (終了) を選択し確認します。

1. DynamoDB 内のフィーチャーテーブルを削除します。

   1. DynamoDB コンソール ([https://console.aws.amazon.com/dynamodb/](https://console.aws.amazon.com/dynamodb/)) を開きます。

   1. ナビゲーションペインで、[**Tables (テーブル)**] を選択します。

   1. フィーチャ-テーブルを選択します。**[Actions]** (アクション) メニューから、**[Delete Table]** (テーブルの削除) を選択します。

1. Amazon EMR ログファイルが保存されている Amazon S3 バケットを削除します。

   1. Amazon S3 コンソール ([https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)) を開きます。

   1. バケットのリストから [`aws-logs- accountID-region`] を選択します。ここで、*accountID* は使用している AWS アカウント番号であり、*region* はクラスターを起動したリージョンです。

   1. [**Actions (アクション)**] メニューから、[**Delete (削除)**] を選択します。