Apache ArrowのJavaのメモ。
|
plugins {
id 'java'
}
group = 'com.example.arrow'
repositories {
mavenCentral()
}
java {
toolchain {
languageVersion = JavaLanguageVersion.of(25)
}
}
dependencies {
implementation "org.apache.arrow:arrow-vector:19.0.0"
implementation "org.apache.arrow:arrow-memory-unsafe:19.0.0"
}
メモリーを扱うライブラリーにはarrow-memory-nettyというものもあるが、19.0.0はJava25には対応していないらしい。
arrow-memory-nettyをJava25で実行するとメモリー確保時に以下のような例外が発生する。
Caused by: java.lang.UnsupportedOperationException at io.netty.buffer.EmptyByteBuf.memoryAddress(EmptyByteBuf.java:961) at io.netty.buffer.DuplicatedByteBuf.memoryAddress(DuplicatedByteBuf.java:115) at io.netty.buffer.UnsafeDirectLittleEndian.(UnsafeDirectLittleEndian.java:45) at io.netty.buffer.PooledByteBufAllocatorL. (PooledByteBufAllocatorL.java:47) at org.apache.arrow.memory.netty.NettyAllocationManager. (NettyAllocationManager.java:54)
Java21ならOK。
それと、MessageSerializerを使ったときに以下のような例外が発生することがある。
Exception in thread "main" java.lang.UnsupportedOperationException: sun.misc.Unsafe or java.nio.DirectByteBuffer.(long, int) not available at org.apache.arrow.memory.util.MemoryUtil.directBuffer(MemoryUtil.java:193) at org.apache.arrow.memory.ArrowBuf.getDirectBuffer(ArrowBuf.java:211) at org.apache.arrow.memory.ArrowBuf.nioBuffer(ArrowBuf.java:206) at org.apache.arrow.vector.ipc.WriteChannel.write(WriteChannel.java:115) at org.apache.arrow.vector.ipc.message.MessageSerializer.writeBatchBuffers(MessageSerializer.java:297) at org.apache.arrow.vector.ipc.message.MessageSerializer.serialize(MessageSerializer.java:269) at org.apache.arrow.vector.ipc.message.MessageSerializer.serialize(MessageSerializer.java:228)
実行時のJavaVMオプションで「--add-opens=java.base/java.nio=ALL-UNNAMED」を指定すると発生しなくなる。
(DirectByteBufferはモジュール的に非公開なので、VMオプションを指定しないとリフレクションでアクセスできない。ということらしい)