S-JIS[2026-06-14/2026-06-19]

Apache Arrow Java

Apache ArrowJavaのメモ。

 

build.gradle

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オプションを指定しないとリフレクションでアクセスできない。ということらしい


Arrow目次へ戻る / Javaへ戻る / 技術メモへ戻る
メールの送信先:ひしだま