You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从边缘节点向Dataproc集群提交作业时遇JNI及堆内存错误

从边缘节点向Dataproc集群提交作业时的JNI错误与堆内存溢出解决

问题详情

尝试从边缘节点向Dataproc集群提交作业时触发错误,本地Java环境信息:

  • 执行which java返回路径:/usr/bin/java
  • OpenJDK版本:1.8.0_332
  • OpenJDK运行时环境(Temurin):build 1.8.0_332-b09
  • OpenJDK 64位服务端VM(Temurin):build 25.332-b09,混合模式

错误日志:

错误:发生JNI错误,请检查您的安装并重试
Exception in thread "main" java.lang.OutOfMemoryError: Java堆空间
at sun.misc.IOUtils.readNBytes(IOUtils.java:213)
at sun.misc.IOUtils.readAllBytes(IOUtils.java:116)
at java.util.jar.JarFile.getBytes(JarFile.java:441)
at java.util.jar.JarFile.checkForSpecialAttributes(JarFile.java:575)
at java.util.jar.JarFile.hasClassPathAttribute(JarFile.java:538)
at java.util.jar.JavaUtilJarAccessImpl.jarFileHasClassPathAttribute(JavaUtilJarAccessImpl.java:37)
at sun.misc.URLClassPath$JarLoader.getClassPath(URLClassPath.java:1212)
at sun.misc.URLClassPath.getLoader(URLClassPath.java:533)
at sun.misc.URLClassPath.getNextLoader(URLClassPath.java:495)
at sun.misc.URLClassPath.getResource(URLClassPath.java:249)
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:363)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:362)
at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352)
at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:756)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:473)
at java.net.URLClassLoader.access$100(URLClassLoader.java:74)
at java.net.URLClassLoader$1.run(URLClassLoader.java:369)
at java.net.URLClassLoader$1.run(URLClassLoader.java:363)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:362)
at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352)
at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:601)

解决方案

1. 增大客户端JVM堆内存

错误核心是客户端加载Jar时堆内存不足,提交作业时通过JVM参数调整堆大小:

  • 若使用gcloud命令提交:
    gcloud dataproc jobs submit spark --cluster=你的集群名 --class=主类全路径 --jars=作业Jar包路径 --properties spark.driver.extraJavaOptions=-Xmx4g,spark.executor.extraJavaOptions=-Xmx4g
    
  • 若直接用Java命令提交:
    java -Xmx4g -jar 提交工具Jar包.jar
    
    注:-Xmx4g可根据边缘节点可用内存调整,比如8g表示分配8GB堆内存。

2. 优化Jar包大小

从错误栈看是读取Jar时溢出,可尝试:

  • 精简Jar包,移除无用依赖
  • 使用瘦Jar(仅包含自有代码),通过--jars参数指定外部依赖的路径,避免一次性加载大文件

3. 验证Java版本兼容性

确保边缘节点Java版本与Dataproc集群一致,避免JNI兼容问题。可通过以下命令查看集群Java配置:

gcloud dataproc clusters describe 你的集群名

4. 检查边缘节点资源

用free -h查看边缘节点内存使用情况,确保有足够可用内存分配给JVM堆空间。

内容的提问来源于stack exchange,提问作者kant

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 08:35:30