

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

# 使用 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`）按发行版来引用版本。当您以编程方式使用 Amazon CLI 或创建集群时，这种变化最为明显。

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

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

**注意**  
为了便于读取，包含 Linux 行继续符（\\）。它们可以通过 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.13.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` \* 集群中的映射槽位数
+ `mapred.reduce.tasks` = `mapred.reduce.tasksperslot` \* 集群中的 reduce 槽位

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

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

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