【发布时间】: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 限制,然后由于异常而停止时突然下降。