当我增加资源时,Spark Streaming Job OOM

时间:2017-01-12 17:41:56

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

我有一个4节点Spark Standalone集群,其上运行着一个火花流作业。

当我为每个执行者提交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并试图大幅度提升ulimits,但没有效果。

每个盒子有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。

1 个答案:

答案 0 :(得分:0)

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

稍微详细一点,Spark使用的核心数量与并行处理的信息量直接相关。您基本上可以将每个Core视为完整的Spark Partition数据,并且可能需要将整个内容驻留在内存中。

每个执行程序7个核心意味着7个Spark分区正在同时进行。 将此数字提高到24意味着将使用大约4倍的ram。这很容易在各个地方造成OOM。

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

  1. 为Executor JVM分配更多内存
  2. 缩小Spark分区的大小(较小的分区意味着在任何给定时间内存中的数据较少)
  3. 确保您没有在内存中缓存任何RDD(从而耗尽系统资源)
  4. 在点击火花之前减少您正在使用的数据量,获取子集或尝试在服务器上过滤。