手工编译duckdb anyblox插件

AnyBlox 是一个框架,用于使用与数据捆绑在一起的轻量级 WebAssembly 解码器读取任意数据集。

提出了一种不同的数据编码范式——让数据集自我解码。

AnyBlox 围绕四大支柱构建:可移植性、安全性、性能和可扩展性。

对于系统开发人员
构建新的数据系统时,需要编写代码来读取要单独支持的所有格式的数据集。Parquet、ORC、JSON、热门新事物™——每一种都需要时间、精力,并造成维护负担。使用 AnyBlox,只需要一个读取器。在的系统中启用 AnyBlox 非常简单,并且可以立即允许使用 AnyBlox 解码器读取任何未来的数据集。

为了证明易用性,将 AnyBlox 实施为:

DuckDB,
DataFusion,
Umbra,
Spark
在所有情况下,集成只需几百行代码,就可以访问尖端的数据格式,例如 Vortex、 奇异的、特定于域的格式,如 ROOT,甚至是针对的数据量身定制的实例优化编码。

对于格式/编码开发人员
一旦创建了新的、改变世界的数据格式,距离任何系统都可以立即读取它仅一步之遥——只需将解码器编译成 WebAssembly!AnyBlox 需要一个简单的导出函数,它从那里获取所有内容。框架允许与解码器沙箱无缝共享内存,从而使的数据可移植、安全且高效地解码。

用法
前往主要的 anyblox 存储库以使用库,或集成我们现有数据系统(DuckDB、DataFusion、Spark)的扩展之一。

最佳VLDB2025论文
论文被评为 VLDB 2025 最佳论文!你可以在这里阅读它。

我对DuckDB阅读器插件感兴趣,所以下载了相关的插件源代码,又因为不想从头编译,所以下载了他的Umbra例子中预编译的libAnyBloxCpp.so文件 。

这个插件基于DuckDB 1.3版,所以将包含目录指向DuckDB 1.3源码的include目录。再从anyblox源码中解压缩相关的hpp头文件放在上级目录。
编译命令行

/par/duckdb-anyblox/src# g++ -fPIC -shared -o libtest2.so anyblox_extension.cpp -I include -I /par/duck/src/include -I .. -std=c++20

报了两个arrow函数的错误。

anyblox_extension.cpp: In static member function 'static void duckdb::{anonymous}::AnyBloxLocalState::SetVectorStringView(duckdb::Vector&, duckdb::idx_t, ArrowArray&, duckdb::idx_t)':
anyblox_extension.cpp:461:109: error: passing 'const duckdb::arrow_string_view_t' as 'this' argument discards qualifiers [-fpermissive]
  461 |                        auto buffer_index = UnsafeNumericCast<uint32_t>(arrow_string[row_idx].GetBufferIndex());
      |                                                                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~

In file included from anyblox_extension.cpp:10:
/par/duck/src/include/duckdb/common/types/arrow_string_view_type.hpp:74:17: note:   in call to 'int32_t duckdb::arrow_string_view_t::GetBufferIndex()'
   74 |         int32_t GetBufferIndex() {
      |                 ^~~~~~~~~~~~~~
anyblox_extension.cpp:462:77: error: passing 'const duckdb::arrow_string_view_t' as 'this' argument discards qualifiers [-fpermissive]
  462 |                         int32_t str_offset = arrow_string[row_idx].GetOffset();
      |                                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~
/par/duck/src/include/duckdb/common/types/arrow_string_view_type.hpp:78:17: note:   in call to 'int32_t duckdb::arrow_string_view_t::GetOffset()'
   78 |         int32_t GetOffset() {
      |                 ^~~~~~~~~

暂时注释掉相关代码,就通过了编译,然后用python脚本加上插件元数据。

python3 /par/appendmetadata.py -l libtest2.so -n duckdb_anyblox -dv v1.3.0   --duckdb-platform linux_amd64 --extension-version 0.1 --abi-type ""

不能load,报缺少duckdb某个函数错误

root@6ae32a5ffcde:/par/duckdb-anyblox/src# /par/duckdb130 -unsigned
D load './duckdb_anyblox.duckdb_extension';
IO Error:
Extension "./duckdb_anyblox.duckdb_extension" could not be loaded: ./duckdb_anyblox.duckdb_extension: undefined symbol: _ZNK6duckdb28SimpleNamedParameterFunction8ToStringB5cxx11Ev

再设置环境变量,指向duckdb动态库目录,加-lduckdb重新编译

export LIBRARY_PATH=/par/libduckdb132:/par/anyb
export LD_LIBRARY_PATH=/par/libduckdb132:/par/anyb
g++ -fPIC -shared -o libtest2.so anyblox_extension.cpp -I include -I /par/duck/src/include -I .. -std=c++20 -lduckdb

重新加载,刚才的错误消失了,又报anyblox函数错误

/par/duckdb-anyblox/src# /par/duckdb130 -unsigned
D load './duckdb_anyblox.duckdb_extension';
IO Error:
Extension "./duckdb_anyblox.duckdb_extension" could not be loaded: ./duckdb_anyblox.duckdb_extension: undefined symbol: _ZN7anyblox13AnyBloxBundleD1Ev

因为/par/anyb目录下的文件不是so后缀,所以添加软连接

ln -s /par/anyb/libAnyBloxCpp.so.0.10.0 /usr/lib/x86_64-linux-gnu/libAnyBloxCpp.so

用类似duckdb的方式添加AnyBloxCpp动态链接库,编译通过了。

g++ -fPIC -shared -o libtest2.so anyblox_extension.cpp -I include -I /par/duck/src/include -I .. -std=c++20 -lduckdb -lAnyBloxCpp

重新加载,刚才的错误消失了,又报arrow库加载错误

root@6ae32a5ffcde:/par/duckdb-anyblox/src# /par/duckdb130 -unsigned
DuckDB v1.3.0 (Ossivalis) 71c5c07cdd
Enter ".help" for usage hints.
D load './duckdb_anyblox.duckdb_extension';
IO Error:
Extension "./duckdb_anyblox.duckdb_extension" could not be loaded: libarrow.so.1800: cannot open shared object file: No such file or directory

检查我的系统,arrrow库的版本不同,所以不能加载

root@6ae32a5ffcde:/par/duckdb-anyblox/src# whereis libarrow.so
libarrow.so: /usr/lib/x86_64-linux-gnu/libarrow.so
root@6ae32a5ffcde:/par/duckdb-anyblox/src# file /usr/lib/x86_64-linux-gnu/libarrow.so
/usr/lib/x86_64-linux-gnu/libarrow.so: symbolic link to libarrow.so.1900

使用预编译版本就是环境要相同才行。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值