Apache Phoenix java.lang.OutOfMemoryError: unable to create new native thread

Apache Phoenix java.lang.OutOfMemoryError: unable to create new native thread

我有一个带有 5 个数据节点和 1 个名称节点的小型 Hadoop 集群,所有 4 个 core/4 线程机器每个都有 4GB 内存,除了一个数据节点有 8GB 内存。

它们都是 运行 RHEL 6 x86_64。 HBase版本为1.2,Phoenix版本为4.14

我正在通过 Phoenix 查询服务器和 "thin" JDBC 客户端连接到 Apache Phoenix。 Phoenix 查询服务器在名称节点上 运行。

我正在尝试插入 ~2000 个元组,每 10 分钟 ~25 列,table 已经插入了超过 200 万个元组,但有时我会收到以下形式的异常:

Caused by: java.lang.OutOfMemoryError: unable to create new native thread [...] Caused by: AvaticaClientRuntimeException: Remote driver error: RuntimeException: org.apache.phoenix.execute.CommitException: java.lang.RuntimeException: java.lang.OutOfMemoryError: unable to create new native thread -> CommitException: java.lang.RuntimeException: java.lang.OutOfMemoryError: unable to create new native thread -> RuntimeException: java.lang.OutOfMemoryError: unable to create new native thread -> OutOfMemoryError: unable to create new native thread. Error -1 (00000) null

Phoenix 查询服务器 运行 在名称节点上,我不确定哪里出了问题。

这不是真正的 OutOfMemoryException,而是好像它正在创建许多线程并且 运行 从它们中脱离出来?

我试过 ps aux,但我看不到 Phoenix Query Server 进程创建了超过 ~50 个线程,据我所知,这比正常情况下的线程限制要少得多Linux 安装。

也许真的 运行 内存不足并且无法创建本机线程是一个症状?

原来 Hadoop 进程的用户 运行 对新进程的限制太低,我编辑了

/etc/security/limits.conf

与:

user - nproc 32768

它奏效了。我没有看到具体的线程数限制,但增加进程数限制可以解决问题。

我还了解到集群也需要增加打开文件数限制:

 user - nofile 32768

我这样设置是为了避免将来出现问题。