

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# Amazon EMR 2.x 和 3.x AMI 版本
<a name="emr-release-3x"></a>

**注意**  
AWS 正在将所有 AWS API 端点的 TLS 配置更新为 TLS 1.2 的最低版本。Amazon EMR 3.10 及更低版本仅支持 TLS 1.0/1.1 连接。2023 年 12 月 4 日之后，您将无法使用 Amazon EMR 3.10 及更低版本创建集群。  
如果您使用 Amazon EMR 3.10 或更低版本，我们建议您立即测试您的工作负载并将其迁移到最新的 Amazon EMR 版本。有关更多信息，请参阅 [AWS 安全博客](https://aws.amazon.com/blogs//security/tls-1-2-required-for-aws-endpoints/)。

Amazon EMR 2.x 和 3.x 发行版（称为 *AMI 版本*）是为出于兼容原因而需要它们的现有解决方案提供的。我们建议不要使用这些发行版创建新集群或新解决方案。它们缺少更新的发行版功能并且包含过时的应用程序包。

建议您使用最新的 Amazon EMR 发行版构建解决方案。

2.x 和 3.x 系列发行版与最新的 Amazon EMR 发行版之间的差异范围非常大。从您创建和配置集群的方式到集群上应用程序的端口和目录结构，均存在差异。

本节将尝试介绍 Amazon EMR 最重要的差异以及特定的应用程序配置和管理差异。介绍并不全面。如果您在 2.x 或 3.x 系列中创建并使用集群，可能遇到此节中未涉及的差异。

**Topics**
+ [使用 Amazon EMR 的早期 AMI 版本创建集群](emr-3x-create.md)
+ [使用 Amazon EMR 的早期 AMI 版本安装应用程序](emr-3x-install-apps.md)
+ [使用 Amazon EMR 的早期 AMI 版本自定义集群和应用程序配置](emr-3x-customizeappconfig.md)
+ [Amazon EMR 的早期 AMI 版本的 Hive 应用程序细节](emr-3x-hive.md)
+ [HBase 早期 AMI 版本的 Amazon EMR 的应用程序细节](emr-3x-hbase.md)
+ [Amazon EMR 的早期 AMI 版本的 Pig 应用程序细节](emr-3x-pig.md)
+ [Amazon EMR 的早期 AMI 版本的 Spark 应用程序细节](emr-3x-spark.md)
+ [S3 DistCp 实用程序与早期 AMI 版本的 Amazon EMR 的区别](emr-3x-s3distcp.md)

# 使用 Amazon EMR 的早期 AMI 版本创建集群
<a name="emr-3x-create"></a>

Amazon EMR 2.x 和 3.x 发行版是按 AMI 版本引用的。对于 Amazon EMR 版本 4.0.0 及更高版本，通过使用版本标签（如 `emr-5.11.0`）按发行版来引用版本。当您以编程方式使用 AWS CLI 或创建集群时，这种变化最为明显。

当您使用使用 AMI 发行版创建集群时，请使用`--ami-version`选项，例如`--ami-version 3.11.0`。 AWS CLI Amazon EMR 4.0.0 及更高版本中推出的许多选项、功能和应用程序在您指定 `--ami-version` 时不可用。有关更多信息，请参阅《AWS CLI 命令参考》**中的 [create-cluster](https://docs.aws.amazon.com/cli/latest/reference/emr/create-cluster.html)。

以下示例 AWS CLI 命令使用 AMI 版本启动集群。

**注意**  
为了便于读取，包含 Linux 行继续符（\$1）。它们可以通过 Linux 命令删除或使用。对于 Windows，请将它们删除或替换为脱字号（^）。

```
aws emr create-cluster --name "Test cluster" --ami-version 3.11.0 \
--applications Name=Hue Name=Hive Name=Pig \
--use-default-roles --ec2-attributes KeyName=myKey \
--instance-groups InstanceGroupType=MASTER,InstanceCount=1,\
InstanceType=m3.xlarge InstanceGroupType=CORE,InstanceCount=2,\
InstanceType=m3.xlarge --bootstrap-actions Path=s3://elasticmapreduce/bootstrap-actions/configure-hadoop,\
Name="Configuring infinite JVM reuse",Args=["-m","mapred.job.reuse.jvm.num.tasks=-1"]
```

所有 Amazon EMR 发行版均以编程方式在 EMR API 中使用 `RunJobFlowRequest` 操作创建集群。以下示例 Java 代码使用 AMI 发行版 3.11.0 创建集群。

```
RunJobFlowRequest request = new RunJobFlowRequest()
			.withName("AmiVersion Cluster")
			.withAmiVersion("3.11.0")
			.withInstances(new JobFlowInstancesConfig()
				.withEc2KeyName("myKeyPair")
				.withInstanceCount(1)
				.withKeepJobFlowAliveWhenNoSteps(true)
				.withMasterInstanceType("m3.xlarge")
				.withSlaveInstanceType("m3.xlarge");
```

以下 `RunJobFlowRequest` 调用改用版本标签：

```
RunJobFlowRequest request = new RunJobFlowRequest()
			.withName("ReleaseLabel Cluster")
			.withReleaseLabel("emr-7.12.0")
			.withInstances(new JobFlowInstancesConfig()
				.withEc2KeyName("myKeyPair")
				.withInstanceCount(1)
				.withKeepJobFlowAliveWhenNoSteps(true)
				.withMasterInstanceType("m3.xlarge")
				.withSlaveInstanceType("m3.xlarge");
```

## 配置集群大小
<a name="emr-3x-cluster-size"></a>

当您的集群运行时，Hadoop 会决定处理数据所需的映射器和 Reducer 任务的数量。更大的集群应当有更多任务，以更好地利用资源并缩短处理时间。通常，EMR 集群在整个集群运行期间会保持相同的大小；当您创建集群时，需要设置任务数量。当您调整正在运行的集群大小时，您可以改变集群执行过程中的处理。因此，您可以在集群的生命周期内改变任务数量，而不是使用固定数量的任务。有两个配置选项可以帮助设置理想的任务数量：
+ `mapred.map.tasksperslot`
+ `mapred.reduce.tasksperslot`

您可以在 `mapred-conf.xml` 文件中设置这两个选项。当您向集群提交任务时，任务客户端会检查当前整个集群范围中可用的 map-reduce 槽位总数。然后，作业客户端会使用以下公式设置任务数量：
+ `mapred.map.tasks` = ` mapred.map.tasksperslot` \$1 集群中的映射槽位数
+ `mapred.reduce.tasks` = `mapred.reduce.tasksperslot` \$1 集群中的 reduce 槽位

如果未配置任务数量，则作业客户端只会读取 `tasksperslot` 参数。通过引导操作 (对于全部集群) 或添加一个更改配置的步骤 (对每个作业单独执行)。您可以随时覆盖任务数量。

Amazon EMR 可以承受任务节点故障，即使任务节点不可用，也会继续执行集群。Amazon EMR 将自动预置额外的任务节点，以替换出现故障的节点。

对于每个集群步骤，您可以有不同数量的任务节点。您还可以向正在运行的集群添加步骤，以修改任务节点的数量。由于所有步骤在默认情况下都保证按顺序运行，您可以为任何步骤指定运行任务节点的数量。

# 使用 Amazon EMR 的早期 AMI 版本安装应用程序
<a name="emr-3x-install-apps"></a>

使用 AMI 版本时，可以通过多种方式安装应用程序，包括使用操作的`NewSupportedProducts`参数、使用引导[RunJobFlow](https://docs.aws.amazon.com/ElasticMapReduce/latest/API/API_RunJobFlow.html)操作和使用 [St](https://docs.aws.amazon.com/ElasticMapReduce/latest/API/API_Step.html) ep 操作。

# 使用 Amazon EMR 的早期 AMI 版本自定义集群和应用程序配置
<a name="emr-3x-customizeappconfig"></a>

Amazon EMR 发行版 4.0.0 推出了使用配置分类的精简应用程序配置方法。有关更多信息，请参阅 [配置应用程序](emr-configure-apps.md)。当使用 AMI 版本时，使用引导操作以及您传递的参数配置应用程序。例如，`configure-hadoop` 和 `configure-daemons` 引导操作设置 Hadoop 和 YARN 特定环境属性（如 `--namenode-heap-size`）。在更新的版本中，这些属性是使用 `hadoop-env` 和 `yarn-env` 配置分类配置的。有关执行常见配置的引导操作，请参阅 [Github 上的emr-bootstrap-actions 存储库](https://github.com/awslabs/emr-bootstrap-actions)。

以下各表将引导操作映射到更新的 Amazon EMR 发行版中的配置分类。


**Hadoop**  

| 受影响的应用程序文件名 | AMI 版本引导操作 | 配置分类 | 
| --- | --- | --- | 
| core-site.xml  | configure-hadoop -c  | core-site | 
| log4j.properties  | configure-hadoop -l  | hadoop-log4j | 
| hdfs-site.xml  | configure-hadoop -s  | hdfs-site  | 
| 不适用 | 不适用 | hdfs-encryption-zones | 
| mapred-site.xml  | configure-hadoop -m  | mapred-site | 
| yarn-site.xml  | configure-hadoop -y  | yarn-site | 
| httpfs-site.xml  | configure-hadoop -t  | httpfs-site | 
| capacity-scheduler.xml  | configure-hadoop -z  | capacity-scheduler | 
| yarn-env.sh  | configure-daemons --resourcemanager-opts | yarn-env | 


**Hive**  

| 受影响的应用程序文件名 | AMI 版本引导操作 | 配置分类 | 
| --- | --- | --- | 
| hive-env.sh | 不适用 | hive-env | 
| hive-site.xml | hive-script --install-hive-site \$1\$1MY\$1HIVE\$1SITE\$1FILE\$1 | hive-site | 
| hive-exec-log4j.properties | 不适用 | hive-exec-log4j | 
| hive-log4j.properties | 不适用 | hive-log4j | 


**EMRFS**  

| 受影响的应用程序文件名 | AMI 版本引导操作 | 配置分类 | 
| --- | --- | --- | 
| emrfs-site.xml | configure-hadoop -e | emrfs-site | 
| 不适用 | s3get -s s3://custom-provider.jar -d /usr/share/aws/emr/auxlib/ | emrfs-site (带新设置 fs.s3.cse.encryptionMaterialsProvider.uri) | 

有关所有分类的列表，请参阅[配置应用程序](emr-configure-apps.md)。

## 应用程序环境变量
<a name="emr-3x-appenv"></a>

当使用 AMI 版本时，将结合使用 `hadoop-user-env.sh` 脚本与 `configure-daemons` 引导操作来配置 Hadoop 环境。该脚本包括以下操作：

```
#!/bin/bash 
export HADOOP_USER_CLASSPATH_FIRST=true; 
echo "HADOOP_CLASSPATH=/path/to/my.jar" >> /home/hadoop/conf/hadoop-user-env.sh
```

在 Amazon EMR 版本 4.x 中，使用 `hadoop-env` 配置分类执行相同的操作，如以下示例中所示：

```
[ 
      { 
         "Classification":"hadoop-env",
         "Properties":{ 

         },
         "Configurations":[ 
            { 
               "Classification":"export",
               "Properties":{ 
                  "HADOOP_USER_CLASSPATH_FIRST":"true",
                  "HADOOP_CLASSPATH":"/path/to/my.jar"
               }
            }
         ]
      }
   ]
```

再举一例，使用 `configure-daemons` 并传递 `--namenode-heap-size=2048` 和 `--namenode-opts=-XX:GCTimeRatio=19` 等效于以下配置分类。

```
[ 
      { 
         "Classification":"hadoop-env",
         "Properties":{ 

         },
         "Configurations":[ 
            { 
               "Classification":"export",
               "Properties":{ 
                  "HADOOP_DATANODE_HEAPSIZE":  "2048",
           	"HADOOP_NAMENODE_OPTS":  "-XX:GCTimeRatio=19"
               }
            }
         ]
      }
   ]
```

其他应用程序环境变量不再在 `/home/hadoop/.bashrc` 中定义。相反，它们主要在 `/etc/default` 文件中基于每个组件或应用程序设置，例如 `/etc/default/hadoop`。应用程序`/usr/bin/`安装的 Wrapper 脚本也 RPMs 可以在涉及实际的 bin 脚本之前设置其他环境变量。

## 服务端口
<a name="emr-3x-serviceports"></a>

当使用 AMI 版本时，某些服务使用自定义端口。


**端口设置中的更改**  

| 设置 | AMI 版本 3.x | 开源默认值 | 
| --- | --- | --- | 
| fs.default.name | hdfs://emrDeterminedIP:9000 | 默认 (hdfs: //: 8020emrDeterminedIP)  | 
| dfs.datanode.address | 0.0.0.0:9200 | 默认值 (0.0.0.0:50010)  | 
| dfs.datanode.http.address | 0.0.0.0:9102 | 默认值 (0.0.0.0:50075)  | 
| dfs.datanode.https.address | 0.0.0.0:9402 | 默认值 (0.0.0.0:50475) | 
| dfs.datanode.ipc.address | 0.0.0.0:9201 | 默认值 (0.0.0.0:50020) | 
| dfs.http.address | 0.0.0.0:9101 | 默认值 (0.0.0.0:50070)  | 
| dfs.https.address | 0.0.0.0:9202 | 默认值 (0.0.0.0:50470)  | 
| dfs.secondary.http.address | 0.0.0.0:9104 | 默认值 (0.0.0.0:50090) | 
| yarn.nodemanager.address | 0.0.0.0:9103 | 默认值 (\$1\$1yarn.nodemanager.hostname\$1:0)  | 
| yarn.nodemanager.localizer.address  | 0.0.0.0:9033 | 默认值 (\$1\$1yarn.nodemanager.hostname\$1:8040) | 
| yarn.nodemanager.webapp.address | 0.0.0.0:9035 | 默认值 (\$1\$1yarn.nodemanager.hostname\$1:8042) | 
| yarn.resourcemanager.address | emrDeterminedIP:9022 | 默认值 (\$1\$1yarn.resourcemanager.hostname\$1:8032) | 
| yarn.resourcemanager.admin.address | emrDeterminedIP:9025 | 默认值 (\$1\$1yarn.resourcemanager.hostname\$1:8033) | 
| yarn.resourcemanager.resource-tracker.address | emrDeterminedIP:9023 | 默认值 (\$1\$1yarn.resourcemanager.hostname\$1:8031) | 
| yarn.resourcemanager.scheduler.address | emrDeterminedIP:9024 | 默认值 (\$1\$1yarn.resourcemanager.hostname\$1:8030) | 
| yarn.resourcemanager.webapp.address | 0.0.0.0:9026  | 默认值 (\$1\$1yarn.resourcemanager.hostname\$1:8088) | 
| yarn.web-proxy.address | emrDeterminedIP:9046  | 默认值 (无值)  | 
| yarn.resourcemanager.hostname | 0.0.0.0 (默认值)  | emrDeterminedIP | 

**注意**  
*emrDeterminedIP*是由 Amazon EMR 生成的 IP 地址。

## Users
<a name="emr-3x-users"></a>

当使用 AMI 版本时，用户 `hadoop` 将运行所有进程并拥有所有文件。在 Amazon EMR 版本 4.0.0 及更高版本中，用户位于应用程序和组件级别。

## 安装顺序、安装的构件和日志文件位置
<a name="emr-3x-directories"></a>

当使用 AMI 版本时，应用程序构件及其配置目录安装在 `/home/hadoop/application` 目录中。例如，如果已安装 Hive，目录将是 `/home/hadoop/hive`。在 Amazon EMR 版本 4.0.0 及更高版本中，应用程序构件安装在 `/usr/lib/application` 目录中。当使用 AMI 版本时，日志文件位于不同的位置。下表列出了位置。


**Amazon S3 上的日志位置的更改**  

| 守护进程或应用程序 | 目录位置 | 
| --- | --- | 
| instance-state | node/ /instance-state/ instance-id | 
| hadoop-hdfs-namenode | daemons//.log instance-id hadoop-hadoop-namenode | 
| hadoop-hdfs-datanode | daemons//.log instance-id hadoop-hadoop-datanode | 
| hadoop-yarn () ResourceManager | 守护进程//instance-idyarn-hadoop-resourcemanager | 
| hadoop-yarn (代理服务器)  | 守护进程//instance-idyarn-hadoop-proxyserver | 
| mapred-historyserver | 守护进程//instance-id | 
| httpfs | daemons/ /httpfs.log instance-id | 
| hive-server | node/ /hive-server/hive-server.log instance-id | 
| hive-metastore | node/ /apps/hive.log instance-id | 
| Hive CLI | node/ /apps/hive.log instance-id | 
| YARN 应用程序用户日志和容器日志 | task-attempts/ | 
| Mahout | 不适用 | 
| Pig | 不适用 | 
| spark-historyserver | 不适用 | 
| mapreduce 任务历史记录文件 | jobs/ | 

## Command Runner
<a name="emr-differences-commandrunner"></a>

当使用 AMI 版本时，许多脚本或程序 (如 `/home/hadoop/contrib/streaming/hadoop-streaming.jar`) 未位于 shell 登录路径环境上，因此您需要在使用 jar 文件 (如 command-runner.jar 或 script-runner.jar) 执行脚本时指定完整路径。`command-runner.jar` 位于 AMI 上，因此无需知道完整 URI，这与 `script-runner.jar` 的情况相同。

## 重复因子
<a name="emr-3x-replication"></a>

重复因子使您可以配置启动 Hadoop JVM 的时间。您可以为每个任务启动一个新的 Hadoop JVM，这样可以提供更好的任务隔离，或者可以在任务 JVMs 之间共享，从而降低框架开销。如果您处理的是许多小文件，合理的做法是多次重复使用 JVM，以摊销启动成本。然而，如果每项任务耗时较长或处理的数据量较大，您可以选择不重复使用 JVM，以确保释放出所有内存供后续任务使用。当使用 AMI 版本时，您可以使用 `configure-hadoop` 引导操作设置 `mapred.job.reuse.jvm.num.tasks` 属性来自定义重复因子。

以下示例演示如何设置无限 JVM 重复使用的 JVM 重复使用因子。

**注意**  
为了便于读取，包含 Linux 行继续符（\$1）。它们可以通过 Linux 命令删除或使用。对于 Windows，请将它们删除或替换为脱字号（^）。

```
aws emr create-cluster --name "Test cluster" --ami-version 3.11.0 \
--applications Name=Hue Name=Hive Name=Pig \
--use-default-roles --ec2-attributes KeyName=myKey \
--instance-groups InstanceGroupType=MASTER,InstanceCount=1,InstanceType=m3.xlarge \
InstanceGroupType=CORE,InstanceCount=2,InstanceType=m3.xlarge \
--bootstrap-actions Path=s3://elasticmapreduce/bootstrap-actions/configure-hadoop,\
Name="Configuring infinite JVM reuse",Args=["-m","mapred.job.reuse.jvm.num.tasks=-1"]
```

# Amazon EMR 的早期 AMI 版本的 Hive 应用程序细节
<a name="emr-3x-hive"></a>

## 日志文件
<a name="emr-3x-hive-log-files"></a>

使用 Amazon EMR AMI 版本 2.x 和 3.x 时，Hive 日志将保存到 `/mnt/var/log/apps/`。为了支持 Hive 的并行版本，您运行的这个 Hive 版本还会确定日志文件名称，如下表所示。


| Hive 版本 | 日志文件名称 | 
| --- | --- | 
| 0.13.1 | hive.log  从此版本开始，Amazon EMR 使用非版本化的文件名 `hive.log`。次要版本将与主要版本共享同一个日志位置。  | 
| 0.11.0 | hive\$10110.log   0.11.0 的次要版本，如 Hive 0.11.0.1，和 Hive 0.11.0 一起共享相同的日志文件位置。  | 
| 0.8.1 | hive\$1081.log   Hive 0.8.1 的次要版本，如 Hive 0.8.1.1，和 Hive 0.8.1 一起共享相同的日志文件位置。  | 
| 0.7.1 | hive\$107\$11.log   Hive 0.7.1 的次要版本，如 Hive 0.7.1.3 和 Hive 0.7.1.4，和 Hive 0.7.1 一起共享相同的日志文件位置。   | 
| 0.7 | hive\$107.log | 
| 0.5 | hive\$105.log | 
| 0.4 | hive.log | 

## 拆分输入功能
<a name="emr-3x-hive-split-input"></a>

要使用 0.13.1 之前的 Hive 版本（3.11.0 之前的 Amazon EMR AMI 版本）实现拆分输入功能，请使用以下命令：

```
hive> set hive.input.format=org.apache.hadoop.hive.ql.io.HiveCombineSplitsInputFormat;
hive> set mapred.min.split.size=100000000;
```

Hive 0.13.1 已弃用此功能。要在 Amazon EMR AMI 版本 3.11.0 中获得同样的拆分输入格式功能，可以使用以下命令：

```
set hive.hadoop.supports.splittable.combineinputformat=true;
```

## Thrift 服务端口
<a name="emr-3x-hive-thrift-service"></a>

 Thrift 是一种 RPC 框架，用于定义紧凑型二进制序列化格式，以保存数据结构供后续分析使用。通常，Hive 会配置服务器在以下端口上运行。


| Hive 版本 | 端口号 | 
| --- | --- | 
| Hive 0.13.1 | 10000 | 
| Hive 0.11.0 | 10004 | 
| Hive 0.8.1 | 10003 | 
| Hive 0.7.1 | 10002 | 
| Hive 0.7 | 10001 | 
| Hive 0.5 | 10000 | 

 有关 Thrift 服务的更多信息，请参阅 [http://wiki.apache.org/thrift/](http://wiki.apache.org/thrift/)。

## 使用 Hive 恢复分区
<a name="emr-3x-hive-recover-partition"></a>

Amazon EMR 包含一条 Hive 查询语言语句，该语句可以从位于 Amazon S3 中的表数据恢复表的分区。以下示例对此进行了介绍。

```
CREATE EXTERNAL TABLE (json string) raw_impression 
PARTITIONED BY (dt string) 
LOCATION 's3://elastic-mapreduce/samples/hive-ads/tables/impressions';
ALTER TABLE logs RECOVER PARTITIONS;
```

分区目录和数据必须处于表定义所指定的位置，而且必须根据 Hive 惯例命名：如`dt=2009-01-01`。

**注意**  
Hive 0.13.1 版之后使用 `msck repair table` 在本机支持此功能，因此不支持 `recover partitions`。欲了解更多信息，请参阅 [https://cwiki.apache。 org/confluence/display/Hive/LanguageManual\$1DDL](https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL)。

## 将 Hive 变量传递到脚本
<a name="emr-3x-hive-pass-variable"></a>

要使用将变量传递到 Hive 步骤 AWS CLI，请键入以下命令，*myKey*替换为您的 EC2 密钥对的名称，然后*amzn-s3-demo-bucket*替换为您的存储桶名称。在此示例中，`SAMPLE` 是 `-d` 开关后面的变量值。此变量在 Hive 脚本中的定义如下：`${SAMPLE}`。

**注意**  
为了便于读取，包含 Linux 行继续符（\$1）。它们可以通过 Linux 命令删除或使用。对于 Windows，请将它们删除或替换为脱字号（^）。

```
aws emr create-cluster --name "Test cluster" --ami-version 3.9 \
--applications Name=Hue Name=Hive Name=Pig \
--use-default-roles --ec2-attributes KeyName=myKey \
--instance-type m3.xlarge --instance-count 3 \
--steps Type=Hive,Name="Hive Program",ActionOnFailure=CONTINUE,\
Args=[-f,s3://elasticmapreduce/samples/hive-ads/libs/response-time-stats.q,-d,\
INPUT=s3://elasticmapreduce/samples/hive-ads/tables,-d,OUTPUT=s3://amzn-s3-demo-bucket/hive-ads/output/,\
-d,SAMPLE=s3://elasticmapreduce/samples/hive-ads/]
```

## 指定外部元存储位置
<a name="emr-3x-hive-external-metastore"></a>

以下步骤介绍了如何覆盖 Hive 元数据仓位置的默认配置值和使用重新配置的元数据仓位置启动集群。

**创建位于 EMR 集群外的元数据仓**

1. 使用 Amazon RDS 创建 MySQL 或 Aurora 数据库。

   有关如何创建 Amazon RDS 数据库的信息，请参阅 [Amazon RDS 入门](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_GettingStarted.html)。

1. 修改您的安全组以允许您的数据库和 **ElasticMapReduce-Master** 安全组之间的 JDBC 连接。

   有关如何针对访问权限修改安全组的信息，请参阅《Amazon RDS 用户指南》**中的 [Amazon RDS 安全组](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Overview.RDSSecurityGroups.html)。

1. 在 `hive-site.xml` 中设置 JDBC 配置值：

   1. 创建包含以下信息的 `hive-site.xml` 配置文件：

      ```
      <configuration>
        <property>
          <name>javax.jdo.option.ConnectionURL</name>
          <value>jdbc:mariadb://hostname:3306/hive?createDatabaseIfNotExist=true</value>
          <description>JDBC connect string for a JDBC metastore</description>
        </property>
        <property>
          <name>javax.jdo.option.ConnectionUserName</name>
          <value>hive</value>
          <description>Username to use against metastore database</description>
        </property>
        <property>
          <name>javax.jdo.option.ConnectionPassword</name>
          <value>password</value>
          <description>Password to use against metastore database</description>
        </property>
      </configuration>
      ```

      *hostname*是运行数据库的 Amazon RDS 实例的 DNS 地址。 *username*和*password*是您的数据库的凭证。有关连接到 MySQL 和 Aurora 数据库实例的更多信息，请参阅《Amazon RDS 用户指南》**中的[连接到运行 MySQL 数据库引擎的数据库实例](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_ConnectToInstance.html)和[连接到 Aurora 数据库集群](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Aurora.Connecting.html)。

      JDBC 驱动程序由 Amazon EMR 进行安装。
**注意**  
值属性不应该包含任何空格或回车。所有内容应显示在一行中。

   1. 将 `hive-site.xml` 文件保存到 Amazon S3 中的位置上，如 `s3://amzn-s3-demo-bucket/hive-site.xml`。

1. 创建一个集群，以指定自定义 `hive-site.xml` 文件的 Amazon S3 位置。

   以下示例命令演示了 AWS CLI 执行此操作的命令。
**注意**  
为了便于读取，包含 Linux 行继续符（\$1）。它们可以通过 Linux 命令删除或使用。对于 Windows，请将它们删除或替换为脱字号（^）。

   ```
   aws emr create-cluster --name "Test cluster" --ami-version 3.10 \
   --applications Name=Hue Name=Hive Name=Pig \
   --use-default-roles --ec2-attributes KeyName=myKey \
   --instance-type m3.xlarge --instance-count 3 \
   --bootstrap-actions Name="Install Hive Site Configuration",\
   Path="s3://region.elasticmapreduce/libs/hive/hive-script",\
   Args=["--base-path","s3://elasticmapreduce/libs/hive","--install-hive-site",\
   "--hive-site=s3://amzn-s3-demo-bucket/hive-site.xml","--hive-versions","latest"]
   ```

## 使用 JDBC 连接到 Hive
<a name="emr-3x-hive-jdbc"></a>

要通过 JDBC 连接 Hive，您需要下载 JDBC 驱动程序并安装 SQL 客户端。以下示例演示如何使用 SQL 通过 JDBC 连接 Workbench/J 到 Hive。

**下载 JDBC 驱动程序**

1. 下载并解压适用于您想访问的 Hive 版本的驱动程序。根据您在创建 Amazon EMR 集群时选择的 AMI，Hive 版本有所不同。
   + [Hive 0.13.1 JDBC 驱动程序：jdbc\$11.0.4.1004.zip https://amazon-odbc-jdbc-drivers.s3.amazonaws.com/public/ AmazonHive](https://amazon-odbc-jdbc-drivers.s3.amazonaws.com/public/AmazonHiveJDBC_1.0.4.1004.zip)
   + Hive 0.11.0 JDBC 驱动程序：[https://mvnrepository.com/artifact/org.apache.hive/hive-jdbc/0.11.0](https://mvnrepository.com/artifact/org.apache.hive/hive-jdbc/0.11.0)
   + Hive 0.8.1 JDBC 驱动程序：[https://mvnrepository.com/artifact/org.apache.hive/hive-jdbc/0.8.1](https://mvnrepository.com/artifact/org.apache.hive/hive-jdbc/0.8.1)

1. 安装 SQL Workbench/J。有关更多信息，请参阅《SQL 手册用户手册》中的[安装和启动 SQL Workbench/J](http://www.sql-workbench.net/manual/install.html)。 Workbench/J 

1. 创建到集群主节点的 SSH 隧道。连接端口因 Hive 版本而异。下表中提供了适用于 Linux `ssh` 用户的示例命令以及适用于 Windows 用户的 PuTTY 命令  
**Linux SSH 命令**    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ReleaseGuide/emr-3x-hive.html)  
**Windows PuTTY 隧道设置**    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ReleaseGuide/emr-3x-hive.html)

1. 将 JDBC 驱动程序添加到 SQL Workbench。

   1. 在 **Select Connection Profile (选择连接配置文件)** 对话框中，选择 **Manage Drivers (管理驱动程序)**。

   1. 选择 **Create a new entry (创建新条目)**（空白页）图标。

   1. 在**名称**字段中，键入 **Hive JDBC**。

   1. 对于 **Library (库)**，请单击 **Select the JAR file(s) (选择 JAR 文件)** 图标。

   1. 选择如下表中所示的 JAR 文件。  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ReleaseGuide/emr-3x-hive.html)

   1. 在 **Please select one driver (请选择一个驱动程序)** 对话框中，根据下表选择一个驱动程序并单击 **OK (确定)**。    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ReleaseGuide/emr-3x-hive.html)

1. 当您返回到**选择连接配置文件**对话框时，验证**驱动程序**字段是否设置为 **Hive JDBC**，然后在 **URL** 字段中根据下表提供 JDBC 连接字符串。    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ReleaseGuide/emr-3x-hive.html)

   如果集群使用 AMI 版本 3.3.1 或更高版本，则在 **Select Connection Profile (选择连接配置文件)** 对话框中，在 **Username (用户名)** 字段中键入 **hadoop**。

# HBase 早期 AMI 版本的 Amazon EMR 的应用程序细节
<a name="emr-3x-hbase"></a>

## 支持的 HBase 版本
<a name="emr-3x-hbase-versions"></a>


| HBase 版本 | AMI 版本 | AWS CLI 配置参数 | HBase 版本详情 | 
| --- | --- | --- | --- | 
| [0.94.18](https://svn.apache.org/repos/asf/hbase/branches/0.94/CHANGES.txt) | 3.1.0 和更高版本 |  `--ami-version 3.1` `--ami-version 3.2` `--ami-version 3.3` `--applications Name=HBase`  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ReleaseGuide/emr-3x-hbase.html)  | 
| [0.94.7](https://svn.apache.org/repos/asf/hbase/branches/0.94/CHANGES.txt) | 3.0-3.0.4 |  `--ami-version 3.0` `--applications Name=HBase`  | 
| [0.92](https://svn.apache.org/repos/asf/hbase/branches/0.92/CHANGES.txt) | 2.2 和更高版本 |  `--ami-version 2.2 or later` `--applications Name=HBase`  | 

## HBase 集群先决条件
<a name="emr-3x-hbase-prerequisites"></a>

使用 Amazon EMR AMI 版本 2.x 和 3.x 创建的集群应满足以下要求。 HBase
+  AWS CLI （可选）-要 HBase 使用命令行进行交互，请下载并安装最新版本的 AWS CLI。有关更多信息，请参阅《AWS Command Line Interface 用户指南》**中的[安装 AWS Command Line Interface](https://docs.aws.amazon.com/cli/latest/userguide/installing.html)。
+ 至少两个实例（可选）：集群的主节点运行 HBase 主服务器和 Zookeeper，任务节点运行 HBase 区域服务器。为了获得最佳性能，HBase 集群应至少在两个 EC2 实例 HBase 上运行，但出于评估目的，您可以在单个节点上运行。
+ 长时间运行的集群-HBase 仅在长时间运行的集群上运行。默认情况下，CLI 和 Amazon EMR 控制台会创建长时间运行的集群。
+ Amazon EC2 密钥对集（推荐）：要使用 Secure Shell（SSH）网络协议连接主节点并运行 HBase Shell 命令，必须在创建集群时使用 Amazon EC2 密钥对。
+ 正确的 AMI 和 Hadoop 版本 — 目前只有 Hadoop 20.205 或更高版本支持HBase 集群。
+ Ganglia（可选）-要监控 HBase 性能指标，请在创建集群时安装 Ganglia。
+ 用于存储日志的 Amazon S3 存储桶（可选）-主节点上提供日志。 HBase 如果要将这些日志复制到 Amazon S3 中，请在创建集群时指定接收日志文件的 S3 存储桶。

## 使用创建集群 HBase
<a name="emr-3x-hbase-launch"></a>

下表列出了使用 Amazon EMR AMI 发行版 HBase 使用控制台创建集群时可用的选项。


| 字段 | Action | 
| --- | --- | 
| Restore from backup (从备份中还原) | 指定是否使用存储在 Amazon S3 中的数据预加载 HBase 集群。 | 
| Backup location (备份位置) | 指定 Amazon S3 中还原所用备份的存储位置的 URI。 | 
| Backup version (备份版本) | 在 Backup Location (备份位置) 处指定要使用的备份的版本名称（可选）。如果您将此字段留空，Amazon EMR 将使用备份位置的最新备份来填充新集群。 HBase  | 
| Schedule Regular Backups (安排定期备份) | 指定是否要计划自动增量备份。第一次备份是完整备份，为以后的增量备份创建基线。 | 
| Consistent backup (一致性备份) | 请指定备份是否应该保持一致。一致性备份指的是，在初始备份阶段为保持节点同步而暂停写入操作的备份。将任何因此而暂停的写入操作放入队列中，然后在同步完成时恢复操作。 | 
| Backup frequency (备份频率) | 定时备份days/hours/minutes间隔的次数。 | 
| Backup location (备份位置) | 存储备份的 Amazon S3 URI。每个 HBase 群集的备份位置应不同，以确保差异备份保持正确。 | 
| Backup start time (备份启动时间) | 指定进行首次备份的时间。您可以将此值设置为 now，使第一次备份在集群运行时立即开始，也可以输入 [ISO 格式](http://www.w3.org/TR/NOTE-datetime)的日期和时间。例如，2012-06-15T20:00Z 会将开始时间设置为 2012 年 6 月 15 日下午 8 点 (UTC)。 | 

以下示例 AWS CLI 命令启动带有 HBase 和其他应用程序的集群：

**注意**  
为了便于读取，包含 Linux 行继续符（\$1）。它们可以通过 Linux 命令删除或使用。对于 Windows，请将它们删除或替换为脱字号（^）。

```
aws emr create-cluster --name "Test cluster" --ami-version 3.3 \
               --applications Name=Hue Name=Hive Name=Pig Name=HBase \
               --use-default-roles --ec2-attributes KeyName=myKey \
               --instance-type c1.xlarge --instance-count 3 --termination-protected
```

在 Hive 和 HBase 集群之间建立连接后（如前面的过程所示），您可以通过在 Hive 中创建外部表来访问存储在 HBase 集群上的数据。

以下示例在 Hive 提示符下运行时，会创建一个外部表，该表引用存储在名`inputTable`为的 HBase 表中的数据。然后，您可以`inputTable`在 Hive 语句中引用以查询和修改存储在 HBase 集群中的数据。

**注意**  
以下示例使用了 AMI 2.3.3 中的 **protobuf-java-2.4.0a.jar**，但是您应该修改此示例以匹配您的版本。要检查您有哪一版本的 Protocol Buffers JAR，请在 Hive 命令提示符处运行命令：`! ls /home/hadoop/lib;`。

```
add jar lib/emr-metrics-1.0.jar ;
               add jar lib/protobuf-java-2.4.0a.jar ;
               
               set hbase.zookeeper.quorum=ec2-107-21-163-157.compute-1.amazonaws.com ;
               
               create external table inputTable (key string, value string)
                    stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
                     with serdeproperties ("hbase.columns.mapping" = ":key,f1:col1")
                     tblproperties ("hbase.table.name" = "t1");
               
               select count(*) from inputTable ;
```

## 自定义配置 HBase
<a name="emr-3x-hbase-customize"></a>

尽管默认设置应该适用于大多数应用程序，但您可以灵活地修改 HBase 配置设置。为此，请运行两种引导操作脚本之一：
+ **configure-hbase-daemons**— 配置主守护程序、区域服务器守护程序和 zookeeper 守护程序的属性。这些属性包括堆大小和 HBase 守护程序启动时传递给 Java 虚拟机 (JVM) 的选项。将这些属性设置为引导操作中的参数。此引导操作修改集群上home/hadoop/conf/hbase的/-user-env.sh 配置文件。 HBase 
+ **configure HBase -hbase —配置特定于站点的设置，例如 HBase 主服务器应绑定的端口以及客户端 CLI 客户端应重**试操作的最大次数。您可以将它们 one-by-one设置为引导操作中的参数，也可以指定 XML 配置文件在 Amazon S3 中的位置。此引导操作修改集群上home/hadoop/conf/hbase的/-site.xml 配置文件。 HBase 

**注意**  
与其他引导操作一样，这些脚本只能在创建集群时运行；您不能使用它们来更改当前正在运行的 HBase 集群的配置。

运行 configu **re-hbase** 或**configure-hbase-daemons**引导操作时，您指定的值会覆盖默认值。任何未显式设置的值都会接受默认值。

使用这些引导操作 HBase 进行配置类似于在 Amazon EMR 中使用引导操作来配置 Hadoop 设置和 Hadoop 守护程序属性。不同之处在于 HBase 没有每进程内存选项。取而代之的是，使用`--daemon-opts`参数设置内存选项，其中替换*daemon*为要配置的守护程序的名称。

### 配置 HBase 守护程序
<a name="emr-3x-hbase-configure-daemons"></a>

 Amazon EMR 提供了一个引导操作`s3://region.elasticmapreduce/bootstrap-actions/configure-hbase-daemons`，您可以使用该操作来更改 HBase 守护程序的配置，其中*region*是您要启动集群的区域。 HBase 

要使用配置 HBase 守护程序 AWS CLI，请在启动集群时添加`configure-hbase-daemons`引导操作以配置一个或多个 HBase 守护程序。您可以设置以下属性。


| 属性 | 说明 | 
| --- | --- | 
| hbase-master-opts | 控制 JVM 如何运行主守护程序的选项。如果设置此选项，则它会覆盖默认的 HBASE\$1MASTER\$1OPTS 变量。 | 
| regionserver-opts | 控制 JVM 如何运行区域服务器守护程序的选项。如果设置此选项，则它会覆盖默认的 HBASE\$1REGIONSERVER\$1OPTS 变量。 | 
| zookeeper-opts | 控制 JVM 如何运行 zookeeper 守护程序的选项。如果设置此选项，则它会覆盖默认的 HBASE\$1ZOOKEEPER\$1OPTS 变量。 | 

有关这些选项的更多信息，请参阅 HBase 文档[中的 hbase-env.sh](https://hbase.apache.org/book.html#hbase.env.sh)。

以下示例中显示的是为 `zookeeper-opts` 和 `hbase-master-opts` 配置值的引导操作。

**注意**  
为了便于读取，包含 Linux 行继续符（\$1）。它们可以通过 Linux 命令删除或使用。对于 Windows，请将它们删除或替换为脱字号（^）。

```
aws emr create-cluster --name "Test cluster" --ami-version 3.3 \
--applications Name=Hue Name=Hive Name=Pig Name=HBase \
--use-default-roles --ec2-attributes KeyName=myKey \
--instance-type c1.xlarge --instance-count 3 --termination-protected \
--bootstrap-actions Path=s3://elasticmapreduce/bootstrap-actions/configure-hbase-daemons,\
Args=["--hbase-zookeeper-opts=-Xmx1024m -XX:GCTimeRatio=19","--hbase-master-opts=-Xmx2048m","--hbase-regionserver-opts=-Xmx4096m"]
```

### 配置 HBase 站点设置
<a name="emr-3x-hbase-configure-site"></a>

Amazon EMR 提供了一个引导操作`s3://elasticmapreduce/bootstrap-actions/configure-hbase`，您可以使用该操作来更改的配置。 HBase您可以将配置值 one-by-one设置为引导操作中的参数，也可以指定 XML 配置文件在 Amazon S3 中的位置。如果您只需要设置几个配置设置， one-by-one则设置配置值非常有用。如果您需要做出很多更改，或如果您要保存配置设置以便重新使用，那么非常适合使用 XML 文件进行设置。

**注意**  
您可以在 Amazon S3 存储桶名称前加上区域前缀`s3://region.elasticmapreduce/bootstrap-actions/configure-hbase`，例如，其中*region*是您要启动 HBase 集群的区域。

此引导操作修改集群上的`/home/hadoop/conf/hbase-site.xml`配置文件。 HBase 引导操作只能在 HBase 集群启动时运行。

有关您可以配置的 HBase 站点设置的更多信息，请参阅 HBase 文档中的[默认配置](http://hbase.apache.org/book.html#config.files)。

在`configure-hbase`启动 HBase 集群时设置引导操作，并在中指定`hbase-site.xml`要更改的值。

**要指定各个 HBase 站点的设置，请使用 AWS CLI**
+ 要更改`hbase.hregion.max.filesize`设置，请键入以下命令并*myKey*替换为您的 Amazon EC2 密钥对的名称。
**注意**  
为了便于读取，包含 Linux 行继续符（\$1）。它们可以通过 Linux 命令删除或使用。对于 Windows，请将它们删除或替换为脱字号（^）。

  ```
  aws emr create-cluster --name "Test cluster" --ami-version 3.3 \
  --applications Name=Hue Name=Hive Name=Pig Name=HBase \
  --use-default-roles --ec2-attributes KeyName=myKey \
  --instance-type c1.xlarge --instance-count 3 --termination-protected \
  --bootstrap-actions Path=s3://elasticmapreduce/bootstrap-actions/configure-hbase,Args=["-s","hbase.hregion.max.filesize=52428800"]
  ```

**要使用 XML 文件指定 HBase 站点设置，请使用 AWS CLI**

1. 创建 `hbase-site.xml` 的自定义版本。您的自定义文件必须是有效的 XML。为了减少引入错误的机会，请从位于 Amazon EMR HBase 主节点的默认副本开始`/home/hadoop/conf/hbase-site.xml`，然后编辑该文件的副本，而不是从头开始创建文件。`hbase-site.xml`可以给您的新文件指定一个新名称，或保留 `hbase-site.xml`。

1. 将您的自定义 `hbase-site.xml` 文件上传到 Amazon S3 存储桶。它应该设置权限，以便启动集群的 AWS 账户可以访问该文件。如果启动集群的 AWS 账户还拥有 Amazon S3 存储桶，则该账户有权访问。

1. 在启动集 HBase 群时设置 con **figure-hbase** 引导操作，并包括自定义文件的位置。`hbase-site.xml`以下示例将 HBase 站点配置值设置为文件中指定的值`s3://amzn-s3-demo-bucket/my-hbase-site.xml`。键入以下命令，*myKey*替换为您的 EC2 密钥对的名称，然后*amzn-s3-demo-bucket*替换为您的 Amazon S3 存储桶的名称。
**注意**  
为了便于读取，包含 Linux 行继续符（\$1）。它们可以通过 Linux 命令删除或使用。对于 Windows，请将它们删除或替换为脱字号（^）。

   ```
   aws emr create-cluster --name "Test cluster" --ami-version 3.3 \
           --applications Name=Hue Name=Hive Name=Pig Name=HBase \
           --use-default-roles --ec2-attributes KeyName=myKey \
           --instance-type c1.xlarge --instance-count 3 --termination-protected \
           --bootstrap-actions Path=s3://elasticmapreduce/bootstrap-actions/configure-hbase,Args=["--site-config-file","s3://amzn-s3-demo-bucket/config.xml"]
   ```

   如果您指定多个选项来自定义 HBase 操作，则必须在每个键值对前面加上一个`-s`选项开关，如以下示例所示：

   ```
          --bootstrap-actions s3://elasticmapreduce/bootstrap-actions/configure-hbase,Args=["-s","zookeeper.session.timeout=60000"]
   ```

设置代理并打开 SSH 连接后，您可以打开带有 http: //: 60010/master-status 的浏览器窗口来查看 HBase 用户界面*master-public-dns-name*，其中是集群*master-public-dns-name*中主节点的公有 DNS 地址。 HBase 

您可以使用 SSH 连接到主节点并导航到该`mnt/var/log/hbase`目录来查看当前 HBase 日志。除非您在集群启动时启用了针对 Amazon S3 的日志记录，否则这些日志将在集群终止后不再可用。

## 备份和恢复 HBase
<a name="emr-3x-hbase-backup-restore"></a>

Amazon EMR 允许您手动或按自动计划将您的 HBase 数据备份到 Amazon S3。您可以执行完整备份和增量备份。获得备份版本 HBase 的数据后，可以将该版本恢复到集 HBase群。您可以恢复到当前正在运行的 HBase 集群，也可以启动预先填充了备份数据的新集群。

在备份过程中， HBase 继续执行写入命令。虽然这样可确保集群在整个备份过程中都处于可用状态，但存在的风险是，正在备份的数据可能与并行执行的任何写入操作不一致。要了解可能出现的不一致性，您必须考虑在集群中的节点之间 HBase 分配写入操作。如果写入操作发生在轮询特定节点之后，则备份存档中不会包含该数据。您甚至可能会发现，早期对 HBase 集群的写入（发送到已经轮询过的节点）可能不在备份存档中，而后来的写入（在轮询之前发送到节点）则包括在内。

如果需要一致的备份，则必须在备份过程的 HBase 初始部分（跨节点同步）暂停写入。您可以通过在请求备份时指定 `--consistent` 参数完成此操作。指定此参数后，系统会将此期间的写入操作加入队列并在同步完成后立即执行这些操作。您还可以计划重复备份，一次备份过程中遗失的数据会在后续备份过程中得到备份，从而解决随时间推移而产生的任何不一致问题。

备份 HBase 数据时，应为每个群集指定不同的备份目录。完成此操作的一种简单方法是，将集群标识符用作备份目录指定路径的一部分。例如 `s3://amzn-s3-demo-bucket/backups/j-3AEXXXXXX16F2`。这样可以确保将来的任何 future 增量备份都引用正确的 HBase 群集。

当您准备删除不再需要的旧备份文件时，我们建议您先对 HBase 数据进行完整备份。这样可确保保留所有数据并为以后的增量备份提供基线。完成完整备份后，您可以导航到备份位置并手动删除旧备份文件。

 HBase 备份过程使用 S3 DistCp 进行复制操作，这在临时文件存储空间方面有一定的限制。

### HBase 使用控制台进行备份和恢复
<a name="emr-3x-hbase-backup-restore-console"></a>

控制台允许启动新集群并使用先前 HBase 备份中的数据填充该集群。它还使您能够计划 HBase 数据的定期增量备份。使用 CLI 时还可以执行其他备份和还原功能，如将数据还原到已在运行的集群、执行手动备份和计划自动完整备份。

**使用控制台向新集群填充存档 HBase 数据**

1. 导航到 Amazon EMR 新控制台，然后从侧面导航栏中选择**切换到旧控制台**。有关切换到旧控制台后预期情况的更多信息，请参阅 [Using the old console](https://docs.aws.amazon.com/emr/latest/ManagementGuide/whats-new-in-console.html#console-opt-in)。

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

1. 在 “**软件配置**” 部分，对于 “**其他应用程序**”，选择 “**HBase****配置”，然后添加**。

1. 在 **Add Application (添加应用程序)** 对话框中，选中 **Restore From Backup (从备份中恢复)**。

1. 在 **B** ackup Location 中，指定要加载到新 HBase 集群中的备份的位置。该位置应是 `s3://amzn-s3-demo-bucket/backups/` 格式的 Amazon S3 URL。

1. 对于 **Backup Version (备份版本)**，您可以选择通过设置值来指定要加载的备份版本的名称。如果没有设置 **Backup Version (备份版本)** 的值，Amazon EMR 会加载指定位置中的最新备份。

1. 选择 **Add (添加)** 并继续使用所需的其他选项创建集群。

**使用控制台安排 HBase 数据的自动备份**

1. 在 “**软件配置**” 部分，对于 “**其他应用程序**”，选择 “**HBase****配置”，然后添加**。

1. 选择 **Schedule Regular Backups (安排定期备份)**。

1. 请指定备份是否应该保持一致。一致性备份指的是，在初始备份阶段为保持节点同步而暂停写入操作的备份。将任何因此而暂停的写入操作放入队列中，然后在同步完成时恢复操作。

1. 通过在 **Backup Frequency (备份频率)** 中输入一个数字并选择 **Days (天)**、**Hours (小时数)** 或 **Minutes (分钟数)**来设置备份频率。首先运行的自动备份将是完整备份；在此之后，Amazon EMR 将根据您指定的日程安排保存增量备份。

1. 指定 Amazon S3 中应当存储备份的位置。应将每个 HBase 集群备份到 Amazon S3 中的一个单独位置，以确保正确计算增量备份。

1. 通过为 **Backup Start Time (备份启动时间)** 设置一个值，指定应当何时进行第一次备份。您可以将此值设置为 `now`，使第一次备份在集群运行时立即开始，也可以输入 [ISO 格式](http://www.w3.org/TR/NOTE-datetime)的日期和时间。例如，2013-09-26T20:00Z 会将开始时间设置为 2013 年 9 月 26 日下午 8 点 (UTC)。

1. 选择**添加**。

1. 根据需要继续使用其他选项创建集群。

## HBase 使用监视器 CloudWatch
<a name="emr-3x-hbase-cloudwatch"></a>

Amazon EMR 报告了三个指标 CloudWatch ，您可以使用这些指标来 HBase监控备份。这些指标每隔五分钟推送 CloudWatch 一次，并且是免费提供的。


| 指标 | 说明 | 
| --- | --- | 
| HBaseBackupFailed |  最后一次备份是否失败。默认设置为 0，如果上一次备份尝试失败，则更新为 1。此指标仅针对 HBase 集群报告。 用例：监控 HBase 备份 单位：*计数*  | 
| HBaseMostRecentBackupDuration |  完成上一次备份所需的时长。无论最后完成的备份成功或失败，都会设置此指标。进行备份的同时，此指标返回备份开始之后的分钟数。此指标仅针对 HBase 集群报告。 用例：监控 HBase 备份 单位：*分钟*  | 
| HBaseTimeSinceLastSuccessfulBackup |  在您的集群上次成功启动 HBase备份后经过的分钟数。此指标仅针对 HBase 集群报告。 用例：监控 HBase 备份 单位：*分钟*  | 

## 将 Ganglia 配置为 HBase
<a name="emr-3x-ganglia-for-hbase"></a>

您可以将 Ganglia 配置为 HBase 使用**configure-hbase-for-ganglia**引导操作。此引导操作配置为向 Gan HBase glia 发布指标。

启动集群时必须配置 HBase 和 Ganglia；无法将 Ganglia 报告添加到正在运行的集群中。

Ganglia 还可以将日志文件存储在 `/mnt/var/log/ganglia/rrds` 处的服务器上。如果您配置了集群以将日志文件保存到 Amazon S3 存储桶，Ganglia 日志文件也会保存在那里。

要启动带有 Ganglia 的集群 HBase，请使用**configure-hbase-for-ganglia**引导操作，如下例所示。

**注意**  
为了便于读取，包含 Linux 行继续符（\$1）。它们可以通过 Linux 命令删除或使用。对于 Windows，请将它们删除或替换为脱字号（^）。

```
aws emr create-cluster --name "Test cluster" --ami-version 3.3 \
--applications Name=Hue Name=Hive Name=Pig Name=HBase Name=Ganglia \
--use-default-roles --ec2-attributes KeyName=myKey \
--instance-type c1.xlarge --instance-count 3 --termination-protected \
--bootstrap-actions Path=s3://elasticmapreduce/bootstrap-actions/configure-hbase-for-ganglia
```

在配置了 Ganglia 的情况下启动集群后，您就可以使用主节点上运行的图形界面来访问 Ganglia 图形和报告。

# Amazon EMR 的早期 AMI 版本的 Pig 应用程序细节
<a name="emr-3x-pig"></a>

## 支持的 Pig 版本
<a name="emr-3x-Pig_SupportedVersions"></a>

您可以添加到集群的 Pig 版本取决于您所使用的 Amazon EMR AMI 的版本和 Hadoop 的版本。下表显示的是哪些 AMI 和 Hadoop 版本与哪些 Pig 版本兼容。我们建议使用最新版本的 Pig，以便利用各种性能增强和新的功能。

当您使用 API 安装 Pig 时，除非您在调用期间将 Pig 加载到集群的步骤中指定`--pig-versions`为参数，否则将使用默认版本[RunJobFlow](https://docs.aws.amazon.com/ElasticMapReduce/latest/API/API_RunJobFlow.html)。


| Pig 版本 | AMI 版本 | 配置参数 | Pig 版本详细信息 | 
| --- | --- | --- | --- | 
| <a name="pig12"></a>0.12.0[发行说明](http://pig.apache.org/releases.html#14+October%2C+2013%3A+release+0.12.0+available)[文档](http://pig.apache.org/docs/r0.12.0/) | 3.1.0 和更高版本 |  `--ami-version 3.1` `--ami-version 3.2` `--ami-version 3.3`  |  添加对以下各项的支持： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ReleaseGuide/emr-3x-pig.html)  | 
| <a name="pig1111"></a>0.11.1.1[发行说明](http://pig.apache.org/releases.html#1+April%2C+2013%3A+release+0.11.1+available)[文档](http://pig.apache.org/docs/r0.11.1/) | 2.2 和更高版本 |  `--pig-versions 0.11.1.1` `--ami-version 2.2`  |   PigStorage 如果输入位于 Amazon S3 中，则可以提高 LOAD 命令的性能。  | 
| <a name="pig0111"></a>0.11.1[发行说明](http://pig.apache.org/releases.html#1+April%2C+2013%3A+release+0.11.1+available)[文档](http://pig.apache.org/docs/r0.11.1/) | 2.2 和更高版本 |  `--pig-versions 0.11.1` `--ami-version 2.2`  |  增加了对 JDK 7、Hadoop 2、Groovy 用户定义函数、 SchemaTuple 优化、新运算符等的支持。有关更多信息，请参阅 [Pig 0.11.1 更改日志](http://svn.apache.org/repos/asf/pig/tags/release-0.11.1/CHANGES.txt)。  | 
| <a name="pig0922"></a>0.9.2.2[发行说明](http://pig.apache.org/releases.html#22+January%2C+2012%3A+release+0.9.2+available)[文档](http://pig.apache.org/docs/r0.9.2/index.html) | 2.2 和更高版本 |  `--pig-versions 0.9.2.2` `--ami-version 2.2`  |  添加了对于 Hadoop 1.0.3 的支持。  | 
| <a name="pig0921"></a>0.9.2.1[发行说明](http://pig.apache.org/releases.html#22+January%2C+2012%3A+release+0.9.2+available)[文档](http://pig.apache.org/docs/r0.9.2/index.html) | 2.2 和更高版本 |  `--pig-versions 0.9.2.1` `--ami-version 2.2`  |  增加了对 MapR 的支持。  | 
| <a name="pig092"></a>0.9.2[发行说明](http://pig.apache.org/releases.html#22+January%2C+2012%3A+release+0.9.2+available)[文档](http://pig.apache.org/docs/r0.9.2/index.html) | 2.2 和更高版本 |  `--pig-versions 0.9.2` `--ami-version 2.2`  |  包括多项性能改进和错误修复。有关 Pig 0.9.2 的更改的完整信息，请转到 [Pig 0.9.2 更改日志](http://svn.apache.org/repos/asf/pig/tags/release-0.9.2/CHANGES.txt)。  | 
| <a name="pig091"></a>0.9.1[发行说明](http://pig.apache.org/releases.html#5+October%2C+2011%3A+release+0.9.1+available)[文档](http://pig.apache.org/docs/r0.9.1/) | 2.0 |  `--pig-versions 0.9.1` `--ami-version 2.0`  | 
| <a name="pig06"></a>0.6[发行说明](http://pig.apache.org/releases.html#1+March%2C+2010%3A+release+0.6.0+available) | 1.0 |  `--pig-versions 0.6` `--ami-version 1.0`  | 
| <a name="pig03"></a>0.3[发行说明](http://pig.apache.org/releases.html#25+June%2C+2009%3A+release+0.3.0+available) | 1.0 |  `--pig-versions 0.3` `--ami-version 1.0`  | 

## Pig 版本详细信息
<a name="emr-pig-version-details"></a>

Amazon EMR 支持可能应用了其他 Amazon EMR 补丁的某些 Pig 版本。您可以配置要在 Amazon EMR 集群上运行的 Pig 版本。有关此操作的详细信息，请参阅 [Apache Pig](emr-pig.md)。以下部分介绍了各种 Pig 版本以及应用到 Amazon EMR 上所加载版本的修补程序。

### Pig 修补
<a name="EnvironmentConfig_AMIPigPatches"></a>

本节介绍应用到 Amazon EMR 可用的 Pig 版本的自定义修补程序。

#### Pig 0.11.1.1 修补
<a name="EnvironmentConfig_AMIPigPatches-0.11.1.1"></a>

Amazon EMR 版本的 Pig 0.11.1.1 是一个维护版本， PigStorage 如果输入位于亚马逊 S3 中，则可以提高加载命令的性能。

#### Pig 0.11.1 补丁
<a name="EnvironmentConfig_AMIPigPatches-0.11.1"></a>

Amazon EMR 版本的 Pig 0.11.1 包含 Apache Software Foundation 提供的所有更新以及从 Pig 0.9.2.2 版本开始累积的 Amazon EMR 补丁。但是，Pig 0.11.1 中没有特定于 Amazon EMR 的新补丁。

#### Pig 0.9.2 补丁
<a name="EnvironmentConfig_AMIPigPatches-0.9.2"></a>

Apache Pig 0.9.2 是 Pig 的维护版。Amazon EMR 团队已将以下补丁应用到 Amazon EMR 版本的 Pig 0.9.2。


| 修补 | 说明 | 
| --- | --- | 
|  PIG-1429  |   将布尔数据类型以第一个类数据类型的形式添加到 Pig。欲了解更多信息，请访问 [https://issues.apache。 org/jira/browse/PIG-1429](https://issues.apache.org/jira/browse/PIG-1429)。  **状态：**Committed (已提交)   **已在以下 Apache Pig 版本中修复：**0.10   | 
|  PIG-1824  |   支持 Jython UDF 中的导入模块。欲了解更多信息，请访问 [https://issues.apache。 org/jira/browse/PIG-1824](https://issues.apache.org/jira/browse/PIG-1824)。  **状态：**Committed (已提交)   **已在以下 Apache Pig 版本中修复：**0.10   | 
|  PIG-2010  |   在分布式缓存 JARs 上注册的捆绑包。欲了解更多信息，请访问 [https://issues.apache。 org/jira/browse/PIG-2010](https://issues.apache.org/jira/browse/PIG-2010)。  **状态：**Committed (已提交)   **已在以下 Apache Pig 版本中修复：**0.11   | 
|  PIG-2456  |   添加 \$1/.pigbootup 文件，用户可以在其中指定默认的 Pig 语句。欲了解更多信息，请访问 [https://issues.apache。 org/jira/browse/PIG-2456](https://issues.apache.org/jira/browse/PIG-2456)。  **状态：**Committed (已提交)   **已在以下 Apache Pig 版本中修复：**0.11   | 
|  PIG-2623  |   Support 支持使用 Amazon S3 路径进行注册 UDFs。欲了解更多信息，请访问 [https://issues.apache。 org/jira/browse/PIG-2623](https://issues.apache.org/jira/browse/PIG-2623)。  **状态：**Committed (已提交)   **已在以下 Apache Pig 版本中修复：**0.10、0.11   | 

#### Pig 0.9.1 补丁
<a name="EnvironmentConfig_AMIPigPatches-0.9.1"></a>

Amazon EMR 团队已将以下补丁应用到 Amazon EMR 版本的 Pig 0.9.1。


| 修补 | 说明 | 
| --- | --- | 
|  支持 dfs 中的 JAR 文件和 Pig 脚本  |   添加对于 HDFS、Amazon S3 或者其他分布式文件系统中存储的运行脚本和已注册 JAR 文件的支持。欲了解更多信息，请访问 [https://issues.apache。 org/jira/browse/PIG-1505](https://issues.apache.org/jira/browse/PIG-1505)。  **状态：**Committed (已提交)   **已在以下 Apache Pig 版本中修复：**0.8.0   | 
|  支持 Pig 中的多个文件系统  |   添加对于 Pig 脚本的支持，以便从一个文件系统中读取数据，并写入另一个文件系统。欲了解更多信息，请访问 [https://issues.apache。 org/jira/browse/PIG-1564](https://issues.apache.org/jira/browse/PIG-1564)。  **状态：**Not Committed (未提交)   **已在以下 Apache Pig 版本中修复：**不适用   | 
|  添加 Piggybank 日期时间和字符串 UDFs  |   添加日期时间和字符串 UDFs 以支持自定义 Pig 脚本。欲了解更多信息，请访问 [https://issues.apache。 org/jira/browse/PIG-1565](https://issues.apache.org/jira/browse/PIG-1565)。  **状态：**Not Committed (未提交)   **已在以下 Apache Pig 版本中修复：**不适用   | 

## 交互式的和批处理的 Pig 集群
<a name="emr-3x-pig-interactive-batch"></a>

Amazon EMR 可让您以两种模式运行 Pig 脚本：
+ 交互式
+ Batch

当你使用控制台或启动长时间运行的集群时 AWS CLI，你可以以 Hadoop 用户的身份使用连接到主节点，**ssh**然后使用 Grunt shell 以交互方式开发和运行 Pig 脚本。以交互方式使用 Pig，您就可以比批处理方式更轻松地修改 Pig 脚本。以交互模式成功修改 Pig 脚本之后，可以将脚本上传到 Amazon S3，并使用批处理模式在生产环境中运行该脚本。您还可以根据需要，在正在运行的集群中以交互方式提交 Pig 命令来分析和转换数据。

在批处理模式下，需要将 Pig 脚本上传到 Amazon S3，然后作为操作步骤将此工作提交到集群。Pig 步骤可提交到长时间运行的集群或临时集群。

# Amazon EMR 的早期 AMI 版本的 Spark 应用程序细节
<a name="emr-3x-spark"></a>

## 以交互方式或批处理模式使用 Spark
<a name="emr-3x-spark-interactive-batch"></a>

Amazon EMR 可让您以两种模式运行 Spark 应用程序：
+ 交互式
+ Batch

使用控制台或启动长时间运行的集群时 AWS CLI，您可以以 Hadoop 用户身份使用 SSH 连接到主节点，然后使用 Spark 外壳以交互方式开发和运行 Spark 应用程序。与批处理环境相比，以交互方式使用 Spark 能够让您更轻松地对 Spark 应用程序进行原型设计或测试。在交互模式下成功修改 Spark 应用程序后，您可以将该应用程序 JAR 或 Python 程序放到 Amazon S3 上集群主节点的本地文件系统上。然后，您可以将应用程序作为批处理工作流程提交。

在批处理模式中，将 Spark 脚本上传到 Amazon S3 或本地主节点文件系统，然后将此工作作为步骤提交到集群。Spark 步骤可提交到长时间运行的集群或暂时性集群。

## 创建安装了 Spark 的集群
<a name="emr-3x-spark-install"></a>

**使用控制台启动安装了 Spark 的集群**

1. 导航到 Amazon EMR 新控制台，然后从侧面导航栏中选择**切换到旧控制台**。有关切换到旧控制台后预期情况的更多信息，请参阅 [Using the old console](https://docs.aws.amazon.com/emr/latest/ManagementGuide/whats-new-in-console.html#console-opt-in)。

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

1. 对于 **Software Configuration (软件配置)**，请选择您需要的 AMI 发布版。

1.  对于 **Applications to be installed (要安装的应用程序)**，从列表中选择 **Spark**，然后选择 **Configure and add (配置并添加)**。

1. 添加参数以按需更改 Spark 配置。有关更多信息，请参阅 [配置 Spark](#emr-3x-spark-configure)。选择**添加**。

1.  根据需要选择其它选项，然后选择 **Create cluster (创建集群)**。

以下示例演示如何使用 Java 创建带 Spark 的集群：

```
AmazonElasticMapReduceClient emr = new AmazonElasticMapReduceClient(credentials);
SupportedProductConfig sparkConfig = new SupportedProductConfig()
			.withName("Spark");

RunJobFlowRequest request = new RunJobFlowRequest()
			.withName("Spark Cluster")
			.withAmiVersion("3.11.0")
			.withNewSupportedProducts(sparkConfig)
			.withInstances(new JobFlowInstancesConfig()
				.withEc2KeyName("myKeyName")
				.withInstanceCount(1)
				.withKeepJobFlowAliveWhenNoSteps(true)
				.withMasterInstanceType("m3.xlarge")
				.withSlaveInstanceType("m3.xlarge")
			);			
RunJobFlowResult result = emr.runJobFlow(request);
```

## 配置 Spark
<a name="emr-3x-spark-configure"></a>

您可以在创建集群时通过运行位于 [Github awslabs/emr-bootstrap-actions/spark 存储库](https://github.com/awslabs/emr-bootstrap-actions/tree/master/spark)中的引导操作来配置 Spark。有关引导操作接受的参数，请参阅存储库中的 [README](https://github.com/aws-samples/emr-bootstrap-actions/blob/master/spark/examples/README.md)。引导操作配置 `$SPARK_CONF_DIR/spark-defaults.conf` 文件中的属性。有关设置的更多信息，请参阅 Spark 文档中的 Spark 配置主题。您可以将以下 URL 中的“latest”替换为您要安装的 Spark 的版本号，例如，`2.2.0` [http://spark.apache.org/docs/latest/configuration.html](http://spark.apache.org/docs/latest/configuration.html)。

您也可以在每次提交应用程序时动态配置 Spark。使用 `spark` 配置文件提供了便于执行程序自动充分利用资源分配的设置。有关更多信息，请参阅 [覆盖 Spark 默认配置设置](#emr-3x-spark-dynamic-configuration)。

### 更改 Spark 默认设置
<a name="emr-3x-spark-default-settings"></a>

以下示例演示如何使用 AWS CLI创建 `spark.executor.memory` 设置为 2G 的集群。

**注意**  
为了便于读取，包含 Linux 行继续符（\$1）。它们可以通过 Linux 命令删除或使用。对于 Windows，请将它们删除或替换为脱字号（^）。

```
aws emr create-cluster --name "Spark cluster" --ami-version 3.11.0 \
--applications Name=Spark, Args=[-d,spark.executor.memory=2G] --ec2-attributes KeyName=myKey \
--instance-type m3.xlarge --instance-count 3 --use-default-roles
```

### 向 Spark 提交工作
<a name="emr-3x-spark-submit-work"></a>

要向集群提交工作，请使用步骤在 EMR 集群上运行 `spark-submit` 脚本。使用中的`addJobFlowSteps`方法添加步骤 [AmazonElasticMapReduceClient](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/elasticmapreduce/AmazonElasticMapReduceClient.html)：

```
AWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey);
AmazonElasticMapReduceClient emr = new AmazonElasticMapReduceClient(credentials);
StepFactory stepFactory = new StepFactory();
AddJobFlowStepsRequest req = new AddJobFlowStepsRequest();
req.withJobFlowId("j-1K48XXXXXXHCB");

List<StepConfig> stepConfigs = new ArrayList<StepConfig>();
		
StepConfig sparkStep = new StepConfig()
	.withName("Spark Step")
	.withActionOnFailure("CONTINUE")
	.withHadoopJarStep(stepFactory.newScriptRunnerStep("/home/hadoop/spark/bin/spark-submit","--class","org.apache.spark.examples.SparkPi","/home/hadoop/spark/lib/spark-examples-1.3.1-hadoop2.4.0.jar","10"));

stepConfigs.add(sparkStep);
req.withSteps(stepConfigs);
AddJobFlowStepsResult result = emr.addJobFlowSteps(req);
```

### 覆盖 Spark 默认配置设置
<a name="emr-3x-spark-dynamic-configuration"></a>

建议您为不同的应用程序覆盖 Spark 默认配置值。您可以在提交应用程序时使用步骤完成此操作 (实质上是向 `spark-submit` 传递选项)。例如，您可能需要通过更改 `spark.executor.memory` 来更改为执行者进程分配的内存。您可以为 `--executor-memory` 开关提供与下类似的参数：

```
/home/hadoop/spark/bin/spark-submit --executor-memory 1g --class org.apache.spark.examples.SparkPi /home/hadoop/spark/lib/spark-examples*.jar 10
```

同样地，您也可以调节 `--executor-cores` 和 `--driver-memory`。在步骤中，您可以向步骤提供以下参数：

```
--executor-memory 1g --class org.apache.spark.examples.SparkPi /home/hadoop/spark/lib/spark-examples*.jar 10
```

您还可以使用 `--conf` 选项调节没有内置开关的设置。有关可调节的其他设置的更多信息，请参阅 Apache Spark 文档中的[动态加载 Spark 属性](https://spark.apache.org/docs/latest/configuration.html#dynamically-loading-spark-properties)主题。

# S3 DistCp 实用程序与早期 AMI 版本的 Amazon EMR 的区别
<a name="emr-3x-s3distcp"></a>

## 亚马逊 EMR 支持的 S3 DistCp 版本
<a name="emr-s3distcp-verisons"></a>

亚马逊 EMR AMI DistCp 版本支持以下 S3 版本。1.0.7 之后的 S3 DistCp 版本可以直接在集群上找到。使用 `/home/hadoop/lib` 中的 JAR 以获得最新功能。


| 版本 | 说明 | 发行日期 | 
| --- | --- | --- | 
| 1.0.8 | 添加 --appendToLastFile、--requirePreviousManifest 和 --storageClass 选项。 | 2014 年 1 月 3 日 | 
| 1.0.7 | 添加了 --s3ServerSideEncryption 选项。 | 2013 年 5 月 2 日 | 
| 1.0.6 | 添加了 --s3Endpoint 选项。 | 2012 年 8 月 6 日 | 
| 1.0.5 | 提高了指定要运行哪个 S3 DistCp 版本的能力。 | 2012 年 6 月 27 日 | 
| 1.0.4 | 改进了 --deleteOnSuccess 选项。 | 2012 年 6 月 19 日 | 
| 1.0.3 | 添加了对于 --numberFiles 和 --startingIndex 选项的支持。 | 2012 年 6 月 12 日 | 
| 1.0.2 | 使用组时改进了文件命名。 | 2012 年 6 月 6 日 | 
| 1.0.1 | S3 的初始版本DistCp。 | 2012 年 1 月 19 日 | 

## 向集群添加 S3 DistCp 复制步骤
<a name="emr-3x-s3distcp-add-step"></a>

要向正在运行的集群添加 S3 DistCp 复制步骤，请键入以下命令，*j-3GYXXXXXX9IOK*替换为您的集群 ID，然后*amzn-s3-demo-bucket*替换为您的 Amazon S3 存储桶名称。

**注意**  
为了便于读取，包含 Linux 行继续符（\$1）。它们可以通过 Linux 命令删除或使用。对于 Windows，请将它们删除或替换为脱字号（^）。

```
aws emr add-steps --cluster-id j-3GYXXXXXX9IOK \
--steps Type=CUSTOM_JAR,Name="S3DistCp step",Jar=/home/hadoop/lib/emr-s3distcp-1.0.jar,\
Args=["--s3Endpoint,s3-eu-west-1.amazonaws.com",\
"--src,s3://amzn-s3-demo-bucket/logs/j-3GYXXXXXX9IOJ/node/",\
"--dest,hdfs:///output",\
"--srcPattern,.*[a-zA-Z,]+"]
```

**Example 将亚马逊 CloudFront 日志加载到 HDFS**  
此示例通过向正在运行的集群添加步骤将 Amazon CloudFront 日志加载到 HDFS 中。在此过程中，压缩格式由 Gzip ( CloudFront 默认格式) 更改为 LZO。这很有用，因为使用 LZO 压缩的数据在解压缩时能拆分成多个映射，所以，与 Gzip 格式不同，您不必等到压缩完成。当您使用 Amazon EMR 分析数据时，这可以提供更好的性能。此示例还通过以下方式提高性能：使用在 `--groupBy` 选项中指定的正则表达式，将给定小时内的所有日志组合成为单个文件。Amazon EMR 集群处理几个大型 LZO 压缩文件的效率比处理许多小型 Gzip 压缩文件的效率更高。要拆分 LZO 文件，您必须为这些文件编制索引并使用 hadoop-lzo 第三方库。  
要将亚马逊 CloudFront 日志加载到 HDFS 中，请键入以下命令，*j-3GYXXXXXX9IOK*替换为您的集群 ID，然后*amzn-s3-demo-bucket*替换为您的 Amazon S3 存储桶名称。  
为了便于读取，包含 Linux 行继续符（\$1）。它们可以通过 Linux 命令删除或使用。对于 Windows，请将它们删除或替换为脱字号（^）。

```
aws emr add-steps --cluster-id j-3GYXXXXXX9IOK \
--steps Type=CUSTOM_JAR,Name="S3DistCp step",Jar=/home/hadoop/lib/emr-s3distcp-1.0.jar,\
Args=["--src,s3://amzn-s3-demo-bucket/cf","--dest,hdfs:///local",\
"--groupBy,.*XABCD12345678.([0-9]+-[0-9]+-[0-9]+-[0-9]+).*",\
"--targetSize,128",
"--outputCodec,lzo","--deleteOnSuccess"]
```
考虑上述示例在以下 CloudFront 日志文件上运行的情况。  

```
s3://amzn-s3-demo-bucket/cf/XABCD12345678.2012-02-23-01.HLUS3JKx.gz
s3://amzn-s3-demo-bucket/cf/XABCD12345678.2012-02-23-01.I9CNAZrg.gz
s3://amzn-s3-demo-bucket/cf/XABCD12345678.2012-02-23-02.YRRwERSA.gz
s3://amzn-s3-demo-bucket/cf/XABCD12345678.2012-02-23-02.dshVLXFE.gz
s3://amzn-s3-demo-bucket/cf/XABCD12345678.2012-02-23-02.LpLfuShd.gz
```
S3 将文件DistCp 复制、连接和压缩到以下两个文件中，其中文件名由正则表达式的匹配确定。  

```
hdfs:///local/2012-02-23-01.lzo
hdfs:///local/2012-02-23-02.lzo
```