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

配置应用程序

您可覆盖应用程序的默认配置,方式是在创建集群时提供配置对象。配置对象作为 JSON 文件引用。配置对象包含分类、属性和可选的嵌套配置。属性是要在该文件中更改的设置。您可以在一个 JSON 对象中为多个应用程序指定多个分类。

可用的配置分类因 Amazon EMR 发布版本而异。有关 Amazon EMR 的每个发布版本可用的配置分类的列表,请参阅关于 Amazon EMR 版本

下面提供了配置列表的示例 JSON:

[ { "Classification": "core-site", "Properties": { "hadoop.security.groups.cache.secs": "250" } }, { "Classification": "mapred-site", "Properties": { "mapred.tasktracker.map.tasks.maximum": "2", "mapreduce.map.sort.spill.percent": "0.90", "mapreduce.tasktracker.reduce.tasks.maximum": "5" } } ]

配置分类通常可以映射到应用程序特定的配置文件。例如,hive-site 分类映射到 Hive 的 hive-site.xml 配置文件中的设置。此情况的一个例外是已弃用的引导操作 configure-daemons,它用于设置环境参数 (如 --namenode-heap-size)。现在,与此类似的选项已归入 hadoop-envyarn-env 分类并具有其自己的嵌套导出分类。如果任何分类以“env”结尾,则应使用导出子分类。另一个例外是 s3get,它用于将客户 EncryptionMaterialsProvider 对象放置在集群中的每个节点上以用于客户端加密。为了实现此目的,已向 emrfs-site 分类添加一个选项。

下面提供了 hadoop-env 分类的示例:

[ { "Classification": "hadoop-env", "Properties": { }, "Configurations": [ { "Classification": "export", "Properties": { "HADOOP_DATANODE_HEAPSIZE": "2048", "HADOOP_NAMENODE_OPTS": "-XX:GCTimeRatio=19" }, "Configurations": [ ] } ] } ]

下面提供了 yarn-env 分类的示例:

[ { "Classification": "yarn-env", "Properties": { }, "Configurations": [ { "Classification": "export", "Properties": { "YARN_RESOURCEMANAGER_OPTS": "-Xdebug -Xrunjdwp:transport=dt_socket" }, "Configurations": [ ] } ] } ]

以下设置不属于配置文件,但由 Amazon EMR 用来代表您设置多个设置。

Amazon EMR 辅助设置

应用程序 版本标签分类 有效属性 何时使用
Spark spark maximizeResourceAllocation 配置执行程序以利用每个节点的最大资源。

在控制台中提供配置

要提供配置,请导航至 Create cluster 页面并选择 Edit software settings。随后,您可以在控制台中直接输入配置 (使用 JSON 或用阴影文本显示的速记语法),也可以使用 JSON Configurations 对象为文件提供 Amazon S3 URI。

使用 CLI 提供配置

您可通过提供本地存储或在 Amazon S3 中存储的 JSON 文件的路径来为 create-cluster 提供配置。以下示例假定您为 Amazon EMR 使用默认角色,并且已创建角色。如果您需要创建角色,请先运行 aws emr create-default-roles

aws emr create-cluster --use-default-roles --release-label emr-5.13.0 --instance-type m4.large --instance-count 2 --applications Name=Hive --configurations https://s3.amazonaws.com/mybucket/myfolder/myConfig.json

如果您的配置在本地目录中,您可以使用以下内容:

aws emr create-cluster --use-default-roles --release-label emr-5.13.0 --applications Name=Hive \ --instance-type m4.large --instance-count 3 --configurations file://./configurations.json

使用 Java 开发工具包提供配置

以下程序摘要说明如何使用 AWS SDK for Java 提供配置:

Application hive = new Application().withName("Hive"); Map<String,String> hiveProperties = new HashMap<String,String>(); hiveProperties.put("hive.join.emit.interval","1000"); hiveProperties.put("hive.merge.mapfiles","true"); Configuration myHiveConfig = new Configuration() .withClassification("hive-site") .withProperties(hiveProperties); RunJobFlowRequest request = new RunJobFlowRequest() .withName("Create cluster with ReleaseLabel") .withReleaseLabel("emr-5.13.0") .withApplications(hive) .withConfigurations(myHiveConfig) .withServiceRole("EMR_DefaultRole") .withJobFlowRole("EMR_EC2_DefaultRole") .withInstances(new JobFlowInstancesConfig() .withEc2KeyName("myKey") .withInstanceCount(1) .withKeepJobFlowAliveWhenNoSteps(true) .withMasterInstanceType("m4.large") .withSlaveInstanceType("m4.large") );

配置应用程序以使用特定 Java 虚拟机

Java 8 是使用 Amazon EMR 4.9.2 版或更高版本创建的集群实例的默认 Java 虚拟机 (JVM)。要覆盖此 JVM 设置 (例如,使用包含用 Amazon EMR 4.8.0 版创建的集群的 Java 8),您可以为应用程序设置 JAVA_HOME,方法是为其环境分类 application-env 提供设置。对于 Hadoop 和 Hive,与以下内容类似:

[ { "Classification": "hadoop-env", "Configurations": [ { "Classification": "export", "Configurations": [], "Properties": { "JAVA_HOME": "/usr/lib/jvm/java-1.8.0" } } ], "Properties": {} } ]

对于 Spark,如果您要编写驱动程序以在集群模式下提交,则驱动程序将使用 Java 7,但设置环境可确保执行程序使用 Java 8。为此,建议同时设置 Hadoop 和 Spark 分类:

[ { "Classification": "hadoop-env", "Configurations": [ { "Classification": "export", "Configurations": [], "Properties": { "JAVA_HOME": "/usr/lib/jvm/java-1.8.0" } } ], "Properties": {} }, { "Classification": "spark-env", "Configurations": [ { "Classification": "export", "Configurations": [], "Properties": { "JAVA_HOME": "/usr/lib/jvm/java-1.8.0" } } ], "Properties": {} } ]

服务端口

以下是 YARN 和 HDFS 服务端口。这些设置反映 Hadoop 默认值。其他应用程序服务托管在默认端口上,除非另有指定。请参考应用程序的项目文档,以获取进一步信息。

YARN 和 HDFS 的端口设置

设置 主机名/端口
fs.default.name 默认值 (hdfs://emrDeterminedIP:8020)
dfs.datanode.address 默认值 (0.0.0.0:50010)
dfs.datanode.http.address 默认值 (0.0.0.0:50075)
dfs.datanode.https.address 默认值 (0.0.0.0:50475)
dfs.datanode.ipc.address 默认值 (0.0.0.0:50020)
dfs.http.address 默认值 (0.0.0.0:50070)
dfs.https.address 默认值 (0.0.0.0:50470)
dfs.secondary.http.address 默认值 (0.0.0.0:50090)
yarn.nodemanager.address 默认值 (${yarn.nodemanager.hostname}:0)
yarn.nodemanager.localizer.address 默认值 (${yarn.nodemanager.hostname}:8040)
yarn.nodemanager.webapp.address 默认值 (${yarn.nodemanager.hostname}:8042)
yarn.resourcemanager.address 默认值 (${yarn.resourcemanager.hostname}:8032)
yarn.resourcemanager.admin.address 默认值 (${yarn.resourcemanager.hostname}:8033)
yarn.resourcemanager.resource-tracker.address 默认值 (${yarn.resourcemanager.hostname}:8031)
yarn.resourcemanager.scheduler.address 默认值 (${yarn.resourcemanager.hostname}:8030)
yarn.resourcemanager.webapp.address 默认值 (${yarn.resourcemanager.hostname}:8088)
yarn.web-proxy.address 默认值 (无值)
yarn.resourcemanager.hostname emrDeterminedIP

注意

术语 emrDeterminedIP 意指由 Amazon EMR 控制面板生成的 IP 地址。在更新的版本中,此约定已消除 (yarn.resourcemanager.hostnamefs.default.name 设置除外)。

应用程序用户

应用程序以自己用户的身份运行进程。例如,Hive JVM 将以用户 hive 的身份运行,MapReduce JVM 将以 mapred 的身份运行,等等。以下进程状态演示此情况:

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND hive 6452 0.2 0.7 853684 218520 ? Sl 16:32 0:13 /usr/lib/jvm/java-openjdk/bin/java -Xmx256m -Dhive.log.dir=/var/log/hive -Dhive.log.file=hive-metastore.log -Dhive.log.threshold=INFO -Dhadoop.log.dir=/usr/lib/hadoop hive 6557 0.2 0.6 849508 202396 ? Sl 16:32 0:09 /usr/lib/jvm/java-openjdk/bin/java -Xmx256m -Dhive.log.dir=/var/log/hive -Dhive.log.file=hive-server2.log -Dhive.log.threshold=INFO -Dhadoop.log.dir=/usr/lib/hadoop/l hbase 6716 0.1 1.0 1755516 336600 ? Sl Jun21 2:20 /usr/lib/jvm/java-openjdk/bin/java -Dproc_master -XX:OnOutOfMemoryError=kill -9 %p -Xmx1024m -ea -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode -Dhbase.log.dir=/var/ hbase 6871 0.0 0.7 1672196 237648 ? Sl Jun21 0:46 /usr/lib/jvm/java-openjdk/bin/java -Dproc_thrift -XX:OnOutOfMemoryError=kill -9 %p -Xmx1024m -ea -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode -Dhbase.log.dir=/var/ hdfs 7491 0.4 1.0 1719476 309820 ? Sl 16:32 0:22 /usr/lib/jvm/java-openjdk/bin/java -Dproc_namenode -Xmx1000m -Dhadoop.log.dir=/var/log/hadoop-hdfs -Dhadoop.log.file=hadoop-hdfs-namenode-ip-10-71-203-213.log -Dhadoo yarn 8524 0.1 0.6 1626164 211300 ? Sl 16:33 0:05 /usr/lib/jvm/java-openjdk/bin/java -Dproc_proxyserver -Xmx1000m -Dhadoop.log.dir=/var/log/hadoop-yarn -Dyarn.log.dir=/var/log/hadoop-yarn -Dhadoop.log.file=yarn-yarn- yarn 8646 1.0 1.2 1876916 385308 ? Sl 16:33 0:46 /usr/lib/jvm/java-openjdk/bin/java -Dproc_resourcemanager -Xmx1000m -Dhadoop.log.dir=/var/log/hadoop-yarn -Dyarn.log.dir=/var/log/hadoop-yarn -Dhadoop.log.file=yarn-y mapred 9265 0.2 0.8 1666628 260484 ? Sl 16:33 0:12 /usr/lib/jvm/java-openjdk/bin/java -Dproc_historyserver -Xmx1000m -Dhadoop.log.dir=/usr/lib/hadoop/logs -Dhadoop.log.file=hadoop.log -Dhadoop.home.dir=/usr/lib/hadoop