Amazon EMR
管理指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 Amazon AWS 入门

使用分布式缓存导入文件

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

有关更多信息,请转到 http://hadoop.apache.org/docs/stable/api/org/apache/hadoop/filecache/DistributedCache.html

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

受支持的文件类型

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

存档是通过实用工具 (如 gzip) 打包的一个或多个文件。分布式缓存将压缩文件传递到每个从属节点,然后将存档作为缓存的一部分进行解压缩。分布式缓存支持以下压缩格式:

  • zip

  • tgz

  • tar.gz

  • tar

  • jar

缓存文件的位置

分布式缓存仅将文件复制到从属节点。如果集群中没有从属节点,分布式缓存会将文件复制到主节点。

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

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

仅当使用 Streaming 时,才可以使用分布式缓存。

从 Streaming 应用程序访问缓存文件

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

使用 Amazon EMR 控制台从 Streaming 应用程序访问缓存文件

您可以使用 Amazon EMR 控制台创建使用分布式缓存的集群。

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

  1. Open the Amazon EMR console at https://console.amazonaws.cn/elasticmapreduce/.

  2. 选择 Create cluster

  3. 选择 Step execution 作为启动模式。

  4. Steps (步骤) 部分的 Add step (添加步骤) 字段中,从列表中选择 Streaming program (流式程序),并单击 Configure and add (配置并添加)

  5. Arguments (参数) 字段,将要保存至缓存的文件和存档包含在内,然后单击 Add (添加)

    文件大小 (或存档文件中文件的总计大小) 必须小于分配的缓存大小。

    如果要... 操作 示例
    向分布式缓存添加单个文件 指定 -cacheFile,后面是文件名称和位置、井号 (#) 以及将文件放在本地缓存中时要给文件指定的名称。
    –cacheFile \ s3://bucket_name/file_name#cache_file_name
    向分布式缓存添加存档文件 输入 -cacheArchive,后面是文件在 Amazon S3 中的位置、井号 (#) 以及在本地缓存中要给文件集合指定的名称。
    –cacheArchive \ s3://bucket_name/archive_name#cache_archive_name
  6. 继续配置和启动您的集群。在处理任何集群步骤前,您的集群会将文件复制到缓存位置。

使用 AWS CLI 从流式处理应用程序访问缓存文件

您可以使用 CLI 创建使用分布式缓存的集群。

使用 AWS CLI 指定分布式缓存文件

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

    如果要... 将以下参数添加到集群...
    向分布式缓存添加单个文件 指定 -cacheFile,后面是文件名称和位置、井号 (#) 以及将文件放在本地缓存中时要给文件指定的名称。
    向分布式缓存添加存档文件 输入 -cacheArchive,后面是文件在 Amazon S3 中的位置、井号 (#) 以及在本地缓存中要给文件集合指定的名称。

    有关如何在 AWS CLI 中使用 Amazon EMR 命令的更多信息,请参阅 https://docs.amazonaws.cn/cli/latest/reference/emr

例 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 m4.large --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 子命令。

例 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 m4.large --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 子命令。