

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 教學課程：使用 Amazon DynamoDB 和 Apache Hive
<a name="EMRforDynamoDB.Tutorial"></a>

在本教學課程中，您將啟動 Amazon EMR 叢集，然後使用 Apache Hive 處理存放在 DynamoDB 資料表中的資料。

*Hive* 是 Hadoop 的資料倉儲應用程式，允許您用其處理和分析來自多個來源的資料。Hive 提供類似 SQL 的語言 (*HiveQL*)，可讓您處理本機存放在 Amazon EMR 叢集或外部資料來源 (如 Amazon DynamoDB) 中的資料。

如需詳細資訊，請參閱 [Hive 教學課程](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 叢集的領導節點並執行互動式命令。預設情況下，大多數的 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 管理主控台 ，並在 https：//[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 金鑰對](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 叢集。DynamoDB 的 Hive 和儲存處理常式已安裝在叢集上。

1. 在 https：//[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** (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 記錄。

如果尚未存在， AWS 管理主控台 會建立 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** (建立 DynamoDB 資料表) 頁面中，執行下列作業：

   1. 在 **Table** (資料表) 中輸入 **Features**。

   1. 對於 **Primary key** (主索引鍵)，在 **Partition key** (分割區索引鍵) 欄位中輸入 **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"
   );
   ```

   您已經在 DynamoDB 中的 Hive 和 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 會提交將由 Amazon EMR 叢集處理的 MapReduce 任務。完成任務需要幾分鐘的時間。

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. 至少三個特徵高於一英里 (5,280 英尺) 的州：

   ```
   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：//[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. 在導覽窗格中，選擇 **Tables (資料表)**。

   1. 選擇 Features (特徵) 資料表。在 **Actions** (動作) 選單中，選擇 **Delete Table** (刪除資料表)。

1. 刪除含有 Amazon EMR 日誌檔案的 Amazon S3 儲存貯體：

   1. 開啟位於 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/) 的 Amazon S3 主控台。

   1. 從儲存貯體清單中，選擇 `aws-logs- accountID-region`，其中 *accountID* 是 AWS 您的帳戶號碼，*而 region* 是您啟動叢集的區域。

   1. 在 **Action** (動作) 選單中，選擇 **Delete** (刪除)。