apache-spark - 在 Docker 中运行 Spark 时出现 java.lang.OutOfMemoryError

标签 apache-spark docker jvm

我正在尝试在 Docker 中运行 Spark 实例,并且经常抛出此异常:

16/10/30 23:20:26 ERROR SparkUncaughtExceptionHandler: Uncaught exception in thread Thread[Executor task launch worker-1,5,main]
java.lang.OutOfMemoryError: unable to create new native thread

我正在使用这个 Docker 镜像 https://github.com/sequenceiq/docker-spark .

我的 ulimit 在容器内似乎没问题:
bash-4.1# ulimit -a
core file size          (blocks, -c) unlimited
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 29747
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1048576
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 1048576
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

它们在容器外,在主机上也很好看:
kane@thinkpad ~> ulimit -a
core file size          (blocks, -c) unlimited
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 29747
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 29747
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

我的谷歌搜索告诉我 systemd 可以限制任务并导致此问题,但我将任务限制设置为无穷大:
kane@thinkpad ~> grep TasksMax /usr/lib/systemd/system/docker.service 
20:TasksMax=infinity

kane@thinkpad ~> systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
   Active: active (running) since Mon 2016-10-31 08:22:39 AWST; 3h 14min ago
     Docs: http://docs.docker.com
 Main PID: 1107 (docker-current)
    Tasks: 56
   Memory: 34.9M
      CPU: 30.292s

有任何想法吗?我的 Spark 代码只是从 Kafka 实例中读取(在单独的 Docker 容器中运行)并执行基本的 map/reduce。没有什么花哨。

最佳答案

该错误表明您无法创建更多 native 线程,因为您没有足够的内存。这并不一定意味着您达到了 ulimits,但您没有足够的内存来创建更多线程。

在 JVM 中创建线程的内存大小由 -XSS 标志控制,如果我没记错的话,默认为 1024k。如果您没有大量的递归调用,您可以尝试减少 XSS 标志并能够创建更多具有相同可用内存量的线程。如果 XSS 太小,会遇到 StackOverFlowError

docker-spark 镜像使用包含 HDFS 和 Yarn 服务的 hadoop-docker 镜像
您可能从容器中为 JVM 堆大小(hdfs、 yarn )分配了太多内存,因此没有足够的内存来分配新线程。

希望它会有所帮助

关于apache-spark - 在 Docker 中运行 Spark 时出现 java.lang.OutOfMemoryError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40336281/

相关文章:

scala - 如何在 Spark 中显示 KeyValueGroupedDataset?

apache-spark - 如何加载 word2vec 模型并将其函数调用到映射器中

docker - 如何让环境变量持久化到导入的 Docker 镜像中

bash - ECS/Fargate 容器定义命令参数

.net - .NET垃圾收集器的内部工作原理?

java - 将类对象转换为 Java RDD

java - 获取异常 "java.lang.NoSuchFieldError: METASTORE_CLIENT_SOCKET_LIFETIME"或 "Required field ' client_protocol' 未设置!”

ruby-on-rails - 基于 Docker 的 Rails 应用程序的 nginx 维护页面

java - 在java中设置两个数组彼此相等

java - 运行在 Jenkins 下运行 JVM 的批处理文件时的堆大小