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

使用 Amazon EMR 的早期 AMI 版本自定义集群和应用程序配置

Amazon EMR 发行版 4.0.0 引入了使用配置分类的精简应用程序配置方法。有关更多信息,请参阅 配置应用程序。当使用 AMI 版本时,使用引导操作以及您传递的参数配置应用程序。例如,configure-hadoopconfigure-daemons 引导操作设置特定于 Hadoop 和 YARN 的环境属性(如 --namenode-heap-size)。在更新的版本中,这些属性是使用 hadoop-envyarn-env 配置分类配置的。有关执行常见配置的引导操作,请参阅 Github 上的 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 ${MY_HIVE_SITE_FILE} 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)

有关所有分类的列表,请参阅配置应用程序

应用程序环境变量

当使用 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/ 中由应用程序 RPM 安装的包装脚本还可以在涉及实际 bin 脚本之前设置其他环境变量。

服务端口

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

端口设置中的更改

设置 AMI 版本 3.x 开源默认值
fs.default.name hdfs://emrDeterminedIP:9000 默认值 (hdfs://emrDeterminedIP:8020)
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 默认值 (${yarn.nodemanager.hostname}:0)
yarn.nodemanager.localizer.address 0.0.0.0:9033 默认值 (${yarn.nodemanager.hostname}:8040)
yarn.nodemanager.webapp.address 0.0.0.0:9035 默认值 (${yarn.nodemanager.hostname}:8042)
yarn.resourcemanager.address emrDeterminedIP:9022 默认值 (${yarn.resourcemanager.hostname}:8032)
yarn.resourcemanager.admin.address emrDeterminedIP:9025 默认值 (${yarn.resourcemanager.hostname}:8033)
yarn.resourcemanager.resource-tracker.address emrDeterminedIP:9023 默认值 (${yarn.resourcemanager.hostname}:8031)
yarn.resourcemanager.scheduler.address emrDeterminedIP:9024 默认值 (${yarn.resourcemanager.hostname}:8030)
yarn.resourcemanager.webapp.address 0.0.0.0:9026 默认值 (${yarn.resourcemanager.hostname}:8088)
yarn.web-proxy.address emrDeterminedIP:9046 默认值 (无值)
yarn.resourcemanager.hostname 0.0.0.0 (默认值) emrDeterminedIP

注意

emrDeterminedIP 是 Amazon EMR 生成的 IP 地址。

用户

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

安装顺序、安装的构件和日志文件位置

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

Amazon S3 上的日志位置的更改

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

Command Runner

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

重复因子

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

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

注意

包含了 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"]