2

我正在尝试使用 Apache Arrow 的 Java API 连接到内存存储。我已经按照此处的指南使用 Python API 成功地在 Python 中完成了此操作。

我还查看了C++ API 文档,但没有多大帮助。

Java Docs使它看起来与其他文档相似。

  1. 确保等离子对象存储正在运行(对于示例,通常是“/tmp/plasma”)。

    1. 创建客户端
    2. 通过为其他两个参数提供对象存储 ("/tmp/plasma") 和 ("", 0) 来连接到客户端。

但是,当尝试使用以下行时,我得到一个 UnsatisfiedLinkError,我在 Apache Arrow 文档中找不到任何引用。google 找到的其他解决方案(例如调用 System.load)也没有成功。

PlasmaClient client = new PlasmaClient("/tmp/plasma", "", 0);

我的错误消息的副本如下所示:

Exception in thread "main" java.lang.UnsatisfiedLinkError:org.apache.arrow.plasma.PlasmaClientJNI.connect(Ljava/lang/String;Ljava/lang/String;I)J at org.apache.arrow.plasma.PlasmaClientJNI.connect(Native Method) at org.apache.arrow.plasma.PlasmaClient.<init>(PlasmaClient.java:44) at plas.main(plas.java:11)


任何帮助表示赞赏。谢谢!

4

1 回答 1

2

我这样做已经有一段时间了,但问题很简单,虽然不容易找到。在测试例程中,您可以找到重要的一行:

System.loadLibrary("plasma_java");
val plasmaClient = new PlasmaClient("/tmp/plasma","",0);

共享库libplasma_java.so是在 CMake 中使用选项编译 C++ 扩展时创建的-DARROW_PLASMA_JAVA_CLIENT=on。在该arrow/java/plasma/test.sh文件中,您可以找到整个构建命令,但这是从该文件派生的命令:

cd arrow/cpp
mkdir release
cd release
cmake -DCMAKE_BUILD_TYPE=Release \
            -DCMAKE_C_FLAGS="-g -O3" \
            -DCMAKE_CXX_FLAGS="-g -O3" \
            -DARROW_BUILD_TESTS=off \
            -DARROW_HDFS=on \
            -DARROW_BOOST_USE_SHARED=on \
            -DARROW_PYTHON=on \
            -DARROW_PLASMA=on \
            -DPLASMA_PYTHON=on \
            -DARROW_JEMALLOC=off \
            -DARROW_WITH_BROTLI=off \
            -DARROW_WITH_LZ4=off \
            -DARROW_WITH_ZLIB=off \
            -DARROW_WITH_ZSTD=off \
            -DARROW_PLASMA_JAVA_CLIENT=on \
            ..
make VERBOSE=1 -j4
make install

我只是运行它,它按照需要构建了所有内容。如果你想在某个地方安装它,只需添加一个前缀-DCMAKE_INSTALL_PREFIX=/home/myuser/install-here

如果你运行System.loadLibrary("plasma_java")它,只有.so在你的系统某处可以找到它时它才有效(这些东西通常在 Linux 上由环境变量指定LD_LIBRARY_PATH)。请注意,这也需要libplasma.solibarrow.so在系统路径中。

于 2019-02-05T20:01:24.850 回答