我们在AWS中运行了一个EMR集群,我们正在努力调整性能。在阅读了很多文章和帖子(AWS和community)后,我们陷入困境,不知道如何更快地更改Yarn配置参数。
我们正在使用的机器:
3 x c5.large(4个CPU,每个8GB内存) 此实例类型的yarn.nodemanager.resource.memory-mb的默认值为5,5GB。
这项任务基本上是从S3中的数千个CSV文件中读取数百万行,在多个作业中以级联方式处理数据,并在S3中输出结果(似乎比行动更多的转换)。
我们正在使用aws emr create-cluster
每项工作的配置:
{"Args":["spark-submit","--deploy-mode","cluster","--class","com.xxx.IngestionDriver","--conf", "spark.num.executors=2","--conf", "spark.executor.memory=4G", "--conf", "spark.executor.cores=2", "--conf", "spark.driver.memory=2G"
,"s3://xxx-data-29-jan/jars/xxx-cdr-ingestor-assembly-0.1-SNAPSHOT.jar","--configFile","s3a://xxx-data-29-jan/config/xxx_client_csv.config","--postgres","false"],"Type":"CUSTOM_JAR","ActionOnFailure":"TERMINATE_CLUSTER","Jar":"command-runner.jar","Properties":"","Name":"xxx-client-csv"}
该命令的其余配置:
]' --instance-groups '[{"InstanceCount":1,"EbsConfiguration":{"EbsBlockDeviceConfigs":[{"VolumeSpecification":{"SizeInGB":32,"VolumeType":"gp2"},"VolumesPerInstance":1}]},"InstanceGroupType":"MASTER","InstanceType":"c5.xlarge","Name":"Master Instance Group"},{"InstanceCount":2,"EbsConfiguration":{"EbsBlockDeviceConfigs":[{"VolumeSpecification":{"SizeInGB":32,"VolumeType":"gp2"},"VolumesPerInstance":1}]},"InstanceGroupType":"CORE","InstanceType":"c5.xlarge","Name":"Core Instance Group"}]' --configurations '[{"Classification":"spark","Properties":{"maximizeResourceAllocation":"true"},"Configurations":[]}]' --auto-terminate --service-role EMR_DefaultRole --enable-debugging --name 'CLUSTER-29-JAN' --region eu-west-3
在做了一些数字之后,我们计算出最好的选择是将num-executors设置为2,每个执行器有4G内存,每个执行器有2个内核,驱动程序有2G。这样运行正常,但是在集群中运行所花费的时间比我们在现有的较小集群中看到的时间要多,并且用于测试。此外,我们在Cloud Watch中看到的CPU使用率较低(0-40%),并且群集统计信息/ IO中指示的总内存仅显示8GB(当群集总计为24GB且3台计算机时)。这似乎表明我们没有使用硬件的所有容量。
我们已经使用该内存的不同组合进行了测试,没有指定执行程序的数量,也没有为执行者打开/关闭内存而没有运气。任何建议将不胜感激!