Amazon web services 基于EMR的火花批作业优化
我们正在EMR集群上运行spark作业,集群配置如下所示Amazon web services 基于EMR的火花批作业优化,amazon-web-services,apache-spark,apache-spark-sql,amazon-emr,Amazon Web Services,Apache Spark,Apache Spark Sql,Amazon Emr,我们正在EMR集群上运行spark作业,集群配置如下所示 Resources: Node Type:CORE - 2 INSTANCES OF r4.8xlarge 32 vCore, 244 GiB memory, EBS only storage EBS Storage:32 GiB Node Type: MASTER 1 Instance of r4.4xlarge 16 vCore, 122 GiB memory, EBS only storage EBS Storage:32 GiB
Resources:
Node Type:CORE - 2 INSTANCES OF
r4.8xlarge
32 vCore, 244 GiB memory, EBS only storage
EBS Storage:32 GiB
Node Type: MASTER
1 Instance of r4.4xlarge
16 vCore, 122 GiB memory, EBS only storage
EBS Storage:32 GiB
Node Type: TASK-
2 INSTANCES Of
r4.4xlarge
16 vCore, 122 GiB memory, EBS only storage
EBS Storage:32 GiB
我们在EMR控制台上使用以下参数执行spark submit:
/usr/bin/spark-submit --deploy-mode cluster --conf spark.sql.parquet.fs.optimized.committer.optimization-enabled=true --conf spark.sql.files.ignoreCorruptFiles=true --driver-memory 5g --master yarn --class class_name s3://location_of_jar -c s3://location of input to jar -w xyz.json
我们认为这些论点没有充分利用现有资源。任何人都可以建议是否有其他优化的方式在EMR上通过更改任何spark-defaults.conf文件或通过传递更多参数来执行spark submit,以便优化所有可用资源的利用率?我们一次运行一个作业。集群上没有并行作业运行如果不知道每个执行者分配的资源、作业的性质、正在处理的数据量等,很难给出正确的建议。我认为现在最好的方法是在创建EMR集群的同时安装ganglia。ganglia web ui可通过
http://master-public-dns-name/ganglia/
首先,看看cpu和内存的使用情况。这将给你一个足够好的主意,如果你正在为你的spark工作最佳地分配资源,然后相应地调整每个执行者的资源
可以使用以下方式在spark submit命令中设置执行器、执行器内存和内核的数量(这些是示例值):
看完ganglia图表后,您将了解到哪些资源利用不足/过度。相应地改变这些
如果您不想玩弄这些数字,让spark决定什么是最佳组合,那么使用以下行将dynamic resource allocation设置为true可能是值得的:
--conf spark.shuffle.service.enabled=true
--conf spark.dynamicAllocation.enabled=true
这里需要注意的一点是,纱线将获得分配给核心+任务节点的总内存的75%。此外,驱动程序和每个执行器都有与其相关联的内存开销。请查阅spark文档。手动将资源分配给驱动程序和执行程序时,请记住这一点。分析
spark作业的第一步是spark ui
。因此,使用跟踪url
,查看logs、作业、执行者、流媒体
http://cluster_manager_host:8088/
要更详细地分析内存和cpu利用率,您也可以使用Gangalia
工具
http://cluster_manager_host/Gangalia
在此之后,您可以做的是:
- 您必须选择自定义配置,如
(i) 执行器数量<代码>--conf num executors x
(ii)执行器存储器<代码>--配置执行器存储器y
(iii)核心数量<代码>--配置执行器核心z
(iv)启用动态资源分配--conf spark.dynamicAllocation.enabled=true
(v) 启用最大资源分配--conf maximizeResourceAllocation=true
(vi)将序列化
从默认更改为Kryo
,--conf org.apache.spark.serializer.KryoSerializer
(vii)根据您的配置将分区数从默认更改为自定义rdd=rdd.repatition(sparkConf.defaultParalallism*2)
http://cluster_manager_host/Gangalia