Java作业不一致地给出OOM错误

标签 java linux hadoop memory

我已经在 Linux 机器上计划(cron)了一个 jar 文件。 jar 通过 JDBC 与 Hive 服务器连接并运行选择查询,之后我将所选数据写入 csv 文件。每天的数据量约为 1.5 亿条记录,csv 文件约为。大小为 30GB。

现在,这个作业并不是每次调用都完成,导致写入部分数据。我用 dmesg | 检查了 PID 是否有错误grep -E 31866 我可以看到:

[1208443.268977] Out of memory: Kill process 31866 (java) score 178 or sacrifice child
[1208443.270552] Killed process 31866 (java) total-vm:25522888kB, anon-rss:11498464kB, file-rss:104kB, shmem-rss:0kB

我正在使用内存选项调用我的 jar,例如: java -Xms5g -Xmx20g -XX:+UseG1GC -cp jarFile

我想知道错误文本的确切含义,是否可以应用任何解决方案来确保我的作业不会运行 OOM。有线的事情是每次行为不一致时作业都不会失败。

最佳答案

该消息实际上来自 linux 内核,而不是您的工作。这意味着您的系统内存不足,内核已经终止了您解决问题的工作(否则您可能会遇到内核崩溃)。

您可以尝试修改您的应用程序以降低内存需求(例如,增量加载数据或编写分布式作业以在集群上完成所需的转换,而不仅仅是一台机器)。

关于Java作业不一致地给出OOM错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45046461/

相关文章:

java - 带有 Java 分页的迭代器设计模式

java - JSF 2.2 - 未找到 "link"标签

linux - 如何为 mogrify 添加后缀 - imagemagick

linux - 为什么 perf record 和 annotate 不起作用?

java - 如何优雅地终止 hadoop 作业/拦截 `hadoop job -kill`

python - 从双引号包含的csv文件格式配置单元数据加载

Java XHTML Doclet : fatal exception

java - 除非在双引号中,否则在空格上拆分字符串,但双引号可以附加一个前面的字符串

linux - 从磁盘读取单个扇区

Hadoop LZO native 库和 JAR 不可用