出现这个错误的原因是JDK 17中移除了sun.misc.Unsafe类,导致直接调用ByteBuffer类的unsafe()方法失败。而Apache Spark 3.3.0使用了UnsafeByteBufferAccess类来支持DirectByteBuffer的使用。解决方法是在启动Spark时添加一个JVM参数,将UnsafeByteBufferAccess替换为ByteBufferSupport。示例代码如下:
bin/spark-shell --conf spark.executor.extraJavaOptions="-Dio.netty.tryReflectionSetAccessible=true -Dio.netty.noUnsafe=true -Dio.netty.noUnsafeMemory=true" --conf spark.driver.extraJavaOptions="-Dio.netty.tryReflectionSetAccessible=true"
通过设置这些参数,就可以避免在Java 17上出现“无法访问类sun.nio.ch.DirectBuffer”的错误。