

# 教程：使用 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 管理控制台，打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 选择一个区域（例如，`US West (Oregon)`）。此区域应当是 DynamoDB 表所在的区域。

1. 在导航窗格中，选择**密钥对**。

1. 选择**创建密钥对**。

1. 在**密钥对名称**中，键入密钥对名称（例如，`mykeypair`），然后选择**创建**。

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 集群。集群将已经安装 Hive 和 DynamoDB 存储处理程序。

1. 通过 [https://console.aws.amazon.com/emr](https://console.aws.amazon.com/emr/) 打开 Amazon EMR 控制台。

1. 选择**创建集群**。

1. 在**创建集群 - 快速选项**页面，执行以下操作：

   1. 在**集群名称**中键入集群名称（如 `My EMR cluster`）。

   1. 在 **EC2 密钥对**中，选择之前创建的密钥对。

   保留其他设置的默认值。

1. 选择**创建集群**。

启动集群将花费几分钟的时间。可以使用 Amazon EMR 控制台的**集群详细信息**页面监控其进度。

状态更改为 `Waiting` 后，说明集群准备好使用。

## 集群日志文件和 Amazon S3
<a name="EMRforDynamoDB.Tutorial.LaunchEMRCluster.LogFilesAndS3"></a>

Amazon EMR 集群生成日志文件，其中包含有关集群状态和调试信息的信息。默认设置**创建集群 - 快速选项**包括设置 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. 在**集群详细信息**页面上，找到**主公共 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 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. 现在，您有一个本机 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. 打开 DynamoDB 控制台：[https://console.aws.amazon.com/dynamodb/](https://console.aws.amazon.com/dynamodb/)。

1. 选择**创建表**。

1. 在**创建 DynamoDB 表**页面，执行以下操作：

   1. 在**表**中键入 **Features**。

   1. 对于**主键**，在**分区键**字段键入 **Id**。将数据类型设置为 **Number**。

      清除**使用默认设置**。对于**预置容量**，键入：
      + **读取容量单位**—`10`
      + **写入容量单位**—`10`

   选择**创建**。

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 将提交一个 MapReduce 任务，由 Amazon EMR 集群处理。完成任务需要几分钟的时间。

1. 验证数据是否已加载到 DynamoDB 中：

   1. 在 DynamoDB 控制台导航窗格选择**表**。

   1. 选择 Features 表，然后选择**项目**选项卡查看数据。

**后续步骤**  
[第 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://console.aws.amazon.com/emr](https://console.aws.amazon.com/emr/) 打开 Amazon EMR 控制台。

   1. 选择 Amazon EMR 集群，选择**终止**，然后确认。

1. 删除 DynamoDB 的 Features 表：

   1. 打开 DynamoDB 控制台：[https://console.aws.amazon.com/dynamodb/](https://console.aws.amazon.com/dynamodb/)。

   1. 在导航窗格中，选择**表**。

   1. 选择 Features 表。从**操作**菜单选择**删除表**。

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 账号，*区域*是启动集群的区域。

   1. 从**操作**菜单选择**删除**。