如何限制EMR集群中spark作业的最大内存消耗?

How to restrict the maximum memory consumption of spark job in EMR cluster?

我 运行 在同一个 EMR 集群中有多个流式 spark 作业和批处理 spark 作业。最近有一个batch spark job 程序写错了,消耗了很多内存。导致master节点没有响应,其他spark作业都卡住了,也就是说整个EMR集群基本宕机了。

有没有什么方法可以限制 spark 作业可以消耗的最大内存?如果 spark 作业消耗太多内存,它可能会失败。但是,我们并不希望整个 EMR 集群都宕机。

火花作业 运行 在客户端模式下,火花提交命令如下。

spark-submit --driver-memory 2G --num-executors 1 --executor-memory 2G --executor-cores 1 --class test.class s3://test-repo/mysparkjob.jar
 'Classification':'yarn-site',
        'Properties':{
            'yarn.nodemanager.disk-health-checker.enable':'true',
            'yarn.nodemanager.disk-health-checker.max-disk-utilization-per-disk-percentage':'95.0',
            'yarn.nodemanager.localizer.cache.cleanup.interval-ms': '100000',
            'yarn.nodemanager.localizer.cache.target-size-mb': '1024',
            'yarn.nodemanager.pmem-check-enabled': 'false',
            'yarn.nodemanager.vmem-check-enabled': 'false',
            'yarn.log-aggregation.retain-seconds': '12000',
            'yarn.log-aggregation-enable': 'true',
            'yarn.nodemanager.log-aggregation.roll-monitoring-interval-seconds': '3600',
           'yarn.resourcemanager.scheduler.class': 'org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler'

谢谢!

您可以利用yarn.nodemanager.resource.memory-mb

The total amount of memory that YARN can use on a given node.

示例:如果您的机器有 16 GB Ram, 并且您将此 属性 设置为 12GB ,最多 6 个执行程序或驱动程序将启动(因为您每个 executor/driver 使用 2gb)并且 4 GB 将是免费的并且可以使用用于后台进程。

选项 1: 您可以 运行 您的 spark-submitcluster 模式而不是 client 模式。这样,您的主人将始终可以自由地执行其他工作。如果你想节省成本,你可以选择一个较小的主实例。

优点:由于 spark 驱动程序将在 CORE 上创建,您可以为其添加自动缩放。并且您将能够使用 100% 的集群资源。在这里阅读更多


选项 2: 您可以创建纱线队列,并将内存繁重的作业提交到单独的队列。

假设您配置了 2 个队列,Q1Q2。并且您将 Q1 配置为最多占用总资源的 80%,并且您将正常作业提交给 Q2,因为它没有最大限制。但是对于内存繁重的作业,您可以选择队列 Q1.


看到您的要求,我认为方案1更适合您。而且它易于实施,无需基础设施更改。
但是当我们在 emr-5.26.0 中使用选项 2 时,我们在配置纱线队列时遇到了许多挑战。