使用分布式缓存导入文件 - Amazon EMR

使用分布式缓存导入文件

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

有关更多信息,请转到 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。有关更多信息,请参阅创建引导操作以安装其它软件

受支持的文件类型

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

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

  • zip

  • tgz

  • tar.gz

  • tar

  • jar

缓存文件的位置

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 应用程序访问缓存文件

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

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

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

注意

我们重新设计了 Amazon EMR 控制台,以便其易于使用。请参阅 控制台中的新增功能,以了解有关新旧控制台体验差异的信息。

New console
使用新控制台指定分布式缓存文件
  1. 登录 AWS Management Console 并打开 Amazon EMR 控制台,网址为 https://console.aws.amazon.com/emr

  2. 在左侧导航窗格中的 EMR on EC2 下,选择 Clusters(集群),然后选择 Create cluster(创建集群)。

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

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

    -cacheFile \ s3://DOC-EXAMPLE-BUCKET/file-name#cache-file-name

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

    -cacheArchive \ s3://DOC-EXAMPLE-BUCKET/archive-name#cache-archive-name

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

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

  5. 要启动集群,选择 Create cluster(创建集群)。

Old console
使用旧控制台指定分布式缓存文件
  1. 导航到 Amazon EMR 新控制台,然后从侧面导航栏中选择切换到旧控制台。有关切换到旧控制台后预期情况的更多信息,请参阅 Using the old console

  2. 选择创建集群

  3. 选择 Step execution (步骤执行) 作为启动模式。

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

  5. Arguments(参数)字段,将要保存至缓存的文件和存档包含在内,然后选择 Add(添加)。文件大小 (或存档文件中文件的总计大小) 必须小于分配的缓存大小。

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

    -cacheFile \ s3://DOC-EXAMPLE-BUCKET/file_name#cache_file_name

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

    -cacheArchive \ s3://DOC-EXAMPLE-BUCKET/archive_name#cache_archive_name
  6. 继续配置和启动您的集群。在处理任何集群步骤前,您的集群会将文件复制到缓存位置。

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

    如果要将单个文件添加到分布式缓存,请指定 -cacheFile,后跟文件名称和位置、井号(#)以及将文件放入本地缓存时要为其指定的名称。

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

    有关在 AWS CLI 中使用 Amazon EMR 命令的更多信息,请参阅https://docs.aws.amazon.com/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 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 子命令。

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