我用Java创建了一个Apache Spark map reduce应用程序。 它从MongoDB集群读取数据并执行map-reduce。 我处理的数据大约是800万条记录。 Spark在java应用程序中以独立模式运行。
整个进口& map thing有效,但是一旦它在reduce部分中途抛出“java.lang.OutOfMemoryError:无法创建新的本机线程”。
我已为该程序分配了30GB的32GB可用空间。 打开文件限制设置得相对较高。 允许的线程似乎也很高。
$ cat /proc/sys/kernel/threads-max
257073
$ ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 128536
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 500000
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) 128536
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
有人可以提供有关如何摆脱这些例外的帮助吗?
修改
设置一个真正的Spark集群并将我的驱动程序连接到它而不是在驱动程序集群中运行它解决了我的问题。将分区数从15k减少到2k也有帮助。
如果有人知道答案,有人可能会发现这个问题,我会把这个打开。