1.从源码编译bench二进制文件。
下载datafusion源码, 解压到目录,比如/par/dafu,
cd /par/dafu/benchmarks
export CARGO_INCREMENTAL=1
export PATH=/par:/par/mold240/bin:$PATH
因为mold默认使用并行编译,而这些二进制文件很大,如果出现资源不足情况,就会编译失败:
(signal: 9, SIGKILL: kill)
warning: build failed, waiting for other jobs to finish...
error: could not compile `datafusion-benchmarks` (bin "external_aggr")
这时可以用如下命令,强制单任务编译
CARGO_BUILD_JOBS=1 cargo build --release
编译时间较长,最后会生成dfbench、tpch、imdb、parquet、external_aggr五个文件。
如果要进行全部基准测试,参考这篇文档。
如果只是做TPCH测试,参考如下步骤。
2.用tpchgen-rs生成parquet文件。
tpchgen-rs生成tpch的效率比官方的dbgen高出很多倍。而且支持多种格式,获取它的源码,
然后用如下命令解压缩编译
tar xf tpchgen-rs-1.1.1.tar.gz
mv tpchgen-rs-1.1.1 tpchgen-rs
cd tpchgen-rs
export CARGO_INCREMENTAL=1
export PATH=/par:/par/mold240/bin:$PATH
cargo build --release
用如下命令生成parquet格式的sf3规模数据文件。
time target/release/tpchgen-cli -s 3 --output-dir sf3-parquet --format=parquet
real 0m6.523s
user 0m27.516s
sys 0m1.740s
为了方便测试,把数据目录移动到/par/data/, 并输入如下脚本,将文件放置在各自的目录下,这是datafusion 的tpch二进制文件要求的,我开始不懂,出错了,在datafusion的github讨论区提问,得到以上的答案。
mv sf3-parquet /par/data/
cd /par/data/sf3-parquet
for tbl in customer lineitem nation orders part partsupp region supplier; do
mkdir -p "$tbl"
mv "${tbl}.parquet" "$tbl/"
done
3.执行测试
将当前目录切换到源代码benchmarks目录,这是必须的,因为要测试的sql脚本位于该目录的queries目录下。然后执行命令行,指定数据文件格式和文件目录, 更多的参数可参考本文第1部分的文档链接,也可以执行tpch --help选项查看。
cd /par/dafu/benchmarks
/par/dafu/target/release/tpch benchmark datafusion --path /par/data/sf3-parquet --format parquet
Running benchmarks with the following options: RunOpt { query: None, common: CommonOpt { iterations: 3, partitions: None, batch_size: None, mem_pool_type: "fair", memory_limit: None, sort_spill_reservation_bytes: None, debug: false }, path: "/par/data/sf3-parquet", file_format: "parquet", mem_table: false, output_path: None, disable_statistics: false, prefer_hash_join: true, sorted: false }
Query 1 iteration 0 took 1828.3 ms and returned 4 rows
Query 1 iteration 1 took 1124.3 ms and returned 4 rows
Query 1 iteration 2 took 1126.3 ms and returned 4 rows
Query 1 avg time: 1359.65 ms
...
Query 22 iteration 0 took 180.0 ms and returned 7 rows
Query 22 iteration 1 took 170.3 ms and returned 7 rows
Query 22 iteration 2 took 175.7 ms and returned 7 rows
Query 22 avg time: 175.32 ms