【问题标题】:Spark Streaming Job OOM when I increase resources当我增加资源时,Spark Streaming Job OOM
【发布时间】:2017-05-27 22:38:04
【问题描述】:

我有一个 4 节点 Spark Standalone 集群,上面运行了一个 Spark 流作业。

当我提交每个执行器有 7 个核心的作业时,一切运行顺利:

spark-submit --class com.test.StreamingJob --supervise --master spark://{SPARK_MASTER_IP}:7077 --executor-memory 30G --executor-cores 7 --total-executor-cores 28 /path/to/jar/spark-job.jar

当我将每个执行程序的核心增加到 24 个时,没有任何批次得到处理,并且我看到 java.lang.OutOfMemoryError:无法在执行程序日志中创建新的本机线程。然后执行者继续失败:

spark-submit --class com.test.StreamingJob --supervise --master spark://{SPARK_MASTER_IP}:7077 --executor-memory 30G --executor-cores 24 --total-executor-cores 96 /path/to/jar/spark-job.jar

错误:

17/01/12 16:01:00 ERROR SparkUncaughtExceptionHandler: Uncaught exception in thread Thread[Shutdown-checker,5,main]
java.lang.OutOfMemoryError: unable to create new native thread
        at java.lang.Thread.start0(Native Method)
        at java.lang.Thread.start(Thread.java:714)
        at io.netty.util.concurrent.SingleThreadEventExecutor.shutdownGracefully(SingleThreadEventExecutor.java:534)
        at io.netty.util.concurrent.MultithreadEventExecutorGroup.shutdownGracefully(MultithreadEventExecutorGroup.java:146)
        at io.netty.util.concurrent.AbstractEventExecutorGroup.shutdownGracefully(AbstractEventExecutorGroup.java:69)
        at com.datastax.driver.core.NettyOptions.onClusterClose(NettyOptions.java:190)
        at com.datastax.driver.core.Connection$Factory.shutdown(Connection.java:844)
        at com.datastax.driver.core.Cluster$Manager$ClusterCloseFuture$1.run(Cluster.java:2488)

我找到了这个question 并尝试大幅增加 ulimit,但没有任何效果。

每个盒子有 32 个内核和 61.8 GB 内存。流作业是用 java 编写的,在 Spark 2.0.0 上运行,使用 spark-cassandra-connector-java_2.10 1.5.0-M2 连接到 Cassandra 3.7.0。

数据是非常小的涓涓细流,每​​秒不到 100 个事件,每个事件小于 200B。

【问题讨论】:

  • 数据的大小是多少?您能否检查集群中每个节点的总内存和每个节点的核心数?
  • 所以问题是您分配了 24 个 executor core/ machine 和 30 GB memory per executor 。所以你分配的总内存是 720GB。您的集群只有 247GB 内存,因此您遇到内存不足异常:)
  • @sandeep-singh 每个工人只有一个执行者。这些是每个执行者的限制。
  • 是的..您的数据很小,因此您不应该分配更多执行程序,但您正在运行流式作业,因此您可以增加但分配更多核心会更有益。
  • 您还可以通过增加递减执行器来衡量时间并判断最佳性能。

标签: java apache-spark cassandra spark-cassandra-connector


【解决方案1】:

听起来您的内存不足;)。

更详细地说,Spark 使用的内核数量与并行处理的信息量直接相关。您基本上可以将每个核心视为处理完整的 Spark 分区数据,并且可能需要将完整的东西驻留在内存中。

每个执行程序 7 个核心意味着同时处理 7 个 Spark 分区。 将此数字增加到 24 意味着大约 4 倍的内存将被使用。这很容易在各个地方引起OOM。

有几种方法可以解决这个问题。

  1. 为 Executor JVM 分配更多内存
  2. 缩小 Spark 分区的大小(更小的分区意味着在任何给定时间内存中的数据更少)
  3. 确保您没有在内存中缓存任何 RDD(从而耗尽系统资源)
  4. 减少您正在处理的数据量,获取子集或尝试在服务器上进行过滤,然后再触发 spark。

【讨论】:

  • 感谢 Russ,将尝试缩小分区。即使要处理的数据很少,也会发生这种情况,所以我认为不可能。
  • 嗨,Russ,在独立集群模式下,如何为 Executes 分配更多内存?
  • 文档总是很有帮助 spark.apache.org/docs/latest/… spark.executor.memory 1g 每个执行程序进程使用的内存量(例如 2g、8g)。
猜你喜欢
  • 2017-11-26
  • 2018-04-05
  • 2018-05-07
  • 2016-06-07
  • 1970-01-01
  • 2019-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多