

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

# 使用 Amazon EMR 分布式缓存导入文件
<a name="emr-plan-input-distributed-cache"></a>

DistributedCache 是一种 Hadoop 功能，可以在映射或归约任务需要访问通用数据时提高效率。如果集群所依赖的现有应用程序或二进制文件在创建集群时尚未安装，您可以使用 DistributedCache 导入这些文件。此功能让集群节点可以从它的本地文件系统中读取导入的文件，而不是从其它集群节点中检索文件。

欲了解更多信息，请访问 [http://hadoop.apache。 org/docs/stable/api/org/apache/hadoop/filecache/DistributedCache.html。](http://hadoop.apache.org/docs/stable/api/org/apache/hadoop/filecache/DistributedCache.html)

创建集群时，可以调用 DistributedCache。在即将开始 Hadoop 作业前，将文件读入缓存区，并且在作业持续期间文件会保留在缓存中。您可以对存储在任何 Hadoop 兼容文件系统（如 HDFS 或 Amazon S3）上的文件执行缓存操作。文件缓存的默认大小是 10 GB。要更改缓存大小，可使用引导操作重新配置 Hadoop 参数 `local.cache.size`。有关更多信息，请参阅[创建引导操作以使用 Amazon EMR 集群安装其他软件](emr-plan-bootstrap.md)。

**Topics**
+ [支持的文件类型](#emr-dev-supported-file-types)
+ [缓存文件的位置](#locationofcache)
+ [从 Streaming 应用程序访问缓存文件](#cachemapper)
+ [从 Streaming 应用程序访问缓存文件](#cacheinconsole)

## 支持的文件类型
<a name="emr-dev-supported-file-types"></a>

DistributedCache 适用于单个文件和存档。单个文件缓存为只读模式。可执行文件和二进制文件具有执行权限设置。

存档是使用实用程序打包的一个或多个文件，例如 `gzip`。DistributedCache 将压缩文件传递到每个核心节点，然后将存档作为缓存的一部分进行解压缩。DistributedCache 支持以下压缩格式：
+ zip
+ tgz
+ tar.gz
+ tar
+ jar

## 缓存文件的位置
<a name="locationofcache"></a>

DistributedCache 仅将文件复制到核心节点。如果集群中没有核心节点，DistributedCache 会将文件复制到主节点。

利用符号链接，DistributedCache 将缓存文件与映射器和折叠器（reducer）的当前工作目录相关联。符号链接是文件位置的一个别名，而不是实际的文件位置。参数值（`yarn-site.xml` 中的 `yarn.nodemanager.local-dirs`），可指定临时文件的位置。Amazon EMR 或基于实例类型和 EMR 版本的某些变体，将此参数设置为 `/mnt/mapred`。例如，某个设置可能包含 `/mnt/mapred` 和 `/mnt1/mapred`，因为此实例类型有两个短暂卷。缓存文件位于临时文件位置的子目录中：`/mnt/mapred/taskTracker/archive`。

如果您将单个文件读入缓存，那么 DistributedCache 会将此文件放在 `archive` 目录下。如果您将一份归档读入缓存，那么 DistributedCache 会解压缩该文件，然后使用与归档文件相同的名称在 `/archive` 下创建子目录。单个文件位于新的子目录下。

仅当使用 Streaming 时，才可以使用 DistributedCache。

## 从 Streaming 应用程序访问缓存文件
<a name="cachemapper"></a>

要从映射器或 Reducer 应用程序中访问缓存文件，您需要确保已将当前工作目录 (./) 添加到应用程序路径中，并引用了缓存文件，就好像这些文件存在于当前工作目录下一样。

## 从 Streaming 应用程序访问缓存文件
<a name="cacheinconsole"></a>

您可以使用 AWS 管理控制台 和 AWS CLI 来创建使用分布式缓存的集群。

------
#### [ Console ]

**使用新控制台指定分布式缓存文件**

1. [登录 AWS 管理控制台，然后在 /emr 上打开亚马逊 EMR 控制台。https://console.aws.amazon.com](https://console.aws.amazon.com/emr)

1. 在左侧导航窗格中的 **EMR on EC2** 下，选择 **Clusters**（集群），然后选择 **Create cluster**（创建集群）。

1. 在 **Steps**（步骤）下，选择 **Add step**（添加步骤）。**Add step**（添加步骤）对话框随即打开。在 **Arguments**（参数）字段，将要保存至缓存的文件和存档包含在内。文件大小 (或存档文件中文件的总计大小) 必须小于分配的缓存大小。

   如果要将单个文件添加到分布式缓存，请指定 `-cacheFile`，后跟文件名称和位置、井号（\$1）以及将文件放入本地缓存时要为其指定的名称。以下示例说明了如何将单个文件添加到分布式缓存。

   ```
   -cacheFile \
   s3://amzn-s3-demo-bucket/file-name#cache-file-name
   ```

   如果要将存档文件添加到分布式缓存，请输入 `-cacheArchive`，后跟文件在 Amazon S3 中的位置、井号（\$1）以及您要为本地缓存中的文件集合指定的名称。以下示例说明了如何将存档文件添加到分布式缓存。

   ```
   -cacheArchive \
   s3://amzn-s3-demo-bucket/archive-name#cache-archive-name
   ```

   在其他对话框字段中输入相应值。选项因步骤类型而异。要添加步骤并退出对话框，请选择 **Add step**（添加步骤）。

1. 选择适用于集群的任何其他选项。

1. 要启动集群，选择 **Create cluster**（创建集群）。

------
#### [ CLI ]

**使用指定分布式缓存文件 AWS CLI**
+ 要在创建集群时提交 Streaming 步骤，请键入带 `create-cluster` 参数的 `--steps` 命令。要使用指定分布式缓存文件 AWS CLI，请在提交 Streaming 步骤时指定相应的参数。

  如果要将单个文件添加到分布式缓存，请指定 `-cacheFile`，后跟文件名称和位置、井号（\$1）以及将文件放入本地缓存时要为其指定的名称。

  如果要将存档文件添加到分布式缓存，请输入 `-cacheArchive`，后跟文件在 Amazon S3 中的位置、井号（\$1）以及您要为本地缓存中的文件集合指定的名称。以下示例说明了如何将存档文件添加到分布式缓存。

  有关在中使用 Amazon EMR 命令的更多信息 AWS CLI，请参阅。[https://docs.aws.amazon.com/cli/latest/reference/emr](https://docs.aws.amazon.com/cli/latest/reference/emr)

**Example 1**  
键入以下命令启动集群并提交一个 Streaming 步骤，该步骤使用 `-cacheFile` 将文件 `sample_dataset_cached.dat` 添加到缓存。  

```
aws emr create-cluster --name "Test cluster" --release-label emr-4.0.0 --applications Name=Hive Name=Pig --use-default-roles --ec2-attributes KeyName=myKey --instance-type m5.xlarge --instance-count 3 --steps Type=STREAMING,Name="Streaming program",ActionOnFailure=CONTINUE,Args=["--files","s3://my_bucket/my_mapper.py s3://my_bucket/my_reducer.py","-mapper","my_mapper.py","-reducer","my_reducer.py,"-input","s3://my_bucket/my_input","-output","s3://my_bucket/my_output", "-cacheFile","s3://my_bucket/sample_dataset.dat#sample_dataset_cached.dat"]
```
如果不使用 `--instance-groups` 参数指定实例计数，则将启动单个主节点，其余实例将作为核心节点启动。所有节点都使用该命令中指定的实例类型。  
如果您之前未创建默认 EMR 服务角色和 EC2 实例配置文件，请先键入 `aws emr create-default-roles` 创建它们，然后再键入 `create-cluster` 子命令。

**Example 2**  
以下命令显示了流式集群的创建过程，并使用 `-cacheArchive` 将一份存档的文件添加到缓存。  

```
aws emr create-cluster --name "Test cluster" --release-label emr-4.0.0 --applications Name=Hive Name=Pig --use-default-roles --ec2-attributes KeyName=myKey --instance-type m5.xlarge --instance-count 3 --steps Type=STREAMING,Name="Streaming program",ActionOnFailure=CONTINUE,Args=["--files","s3://my_bucket/my_mapper.py s3://my_bucket/my_reducer.py","-mapper","my_mapper.py","-reducer","my_reducer.py,"-input","s3://my_bucket/my_input","-output","s3://my_bucket/my_output", "-cacheArchive","s3://my_bucket/sample_dataset.tgz#sample_dataset_cached"]
```
如果不使用 `--instance-groups` 参数指定实例计数，则将启动单个主节点，其余实例将作为核心节点启动。所有节点都使用该命令中指定的实例类型。  
如果您之前未创建默认 EMR 服务角色和 EC2 实例配置文件，请先键入 `aws emr create-default-roles` 创建它们，然后再键入 `create-cluster` 子命令。

------