【问题标题】:Apache Phoenix java.lang.OutOfMemoryError: unable to create new native threadApache Phoenix java.lang.OutOfMemoryError:无法创建新的本机线程
【发布时间】:2019-01-31 16:24:14
【问题描述】:

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

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

我通过 Phoenix Query Server 和“瘦”JDBC 客户端连接到 Apache Phoenix。 Phoenix Query Server 正在名称节点上运行。

我正在尝试 upsert ~2000 个元组,每 10 分钟 ~25 列,该表已经插入了超过 200 万个元组,但有时我会在表单中遇到异常:

原因:java.lang.OutOfMemoryError: 无法创建新的本地线程 [...] 原因:AvaticaClientRuntimeException:远程驱动程序错误:RuntimeException:org.apache.phoenix.execute.CommitException:java.lang.RuntimeException:java.lang.OutOfMemoryError:无法创建新的本机线程-> CommitException:java。 lang.RuntimeException:java.lang.OutOfMemoryError:无法创建新的本机线程-> RuntimeException:java.lang.OutOfMemoryError:无法创建新的本机线程-> OutOfMemoryError:无法创建新的本机线程。错误 -1 (00000) 空

Phoenix Query Server 正在名称节点上运行,我不确定出了什么问题。

这不是实际的 OutOfMemoryException,而是好像它正在创建许多线程并用完它们?

我尝试过 ps aux,但我看不到 Phoenix Query Server 进程创建了超过 50 个线程,这远远低于正常 Linux 安装中的线程限制。

也许它真的内存不足并且未能创建本机线程是一种症状?

【问题讨论】:

  • 旁注,ps aux 只会显示进程,而不是线程。试试ps -eLf,你可能会明白为什么会达到极限。
  • 我手头没有它,但是是的,我使用了一些命令来列出线程,并且通过一些行计数,我看到它达到了大约 700 个线程,仍然低于用户的 1k 限制.我让 Ganglia 监控集群并搜索进程历史记录,我意识到它在某个时间点进行插入时达到了 1k 的限制。 Ganglia 显示集群多次达到 1k 限制,然后由于异常而停止时突然下降。

标签: java hadoop hbase phoenix


【解决方案1】:

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

/etc/security/limits.conf

与:

user - nproc 32768

它奏效了。我没有看到特定的线程数限制,但增加进程数限制就可以了。

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

 user - nofile 32768

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

【讨论】:

    猜你喜欢
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 2015-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多