3 个版本
0.1.6 | 2023 年 9 月 11 日 |
---|---|
0.1.5 | 2023 年 9 月 10 日 |
0.1.4 | 2023 年 9 月 10 日 |
#611 在 压缩
30KB
479 行
这个分支用于个人项目,并从原始分支 fork。在这个分支中,我们已移除自动化测试以供其他应用开发使用。
datafusion-objectstore-hdfs
HDFS 作为 Datafusion 的远程 ObjectStore。
使用 DataFusion 在 HDFS 上查询文件
此 crate 介绍了 HadoopFileSystem
作为远程 ObjectStore,它提供了在 HDFS 文件上查询的能力。
对于 HDFS 访问,我们利用库 fs-hdfs。基本上,该库仅提供 Rust FFI API,用于编译由 官方 Hadoop 社区 提供的 C 文件集的 libhdfs
。
先决条件
由于 libhdfs
也只是一个 C 接口包装器,而 HDFS 访问的真实实现是一组 Java Jars,为了使此 crate 工作正常,我们需要准备 Hadoop 客户端 Jars 和 JRE 环境。
准备 JAVA
-
安装 Java。
-
指定并导出
JAVA_HOME
。
准备 Hadoop 客户端
-
要获取 Hadoop 发行版,从 Apache 下载镜像 之一下载最新的稳定版本。目前,我们支持 Hadoop-2 和 Hadoop-3。
-
解压缩下载的 Hadoop 发行版。例如,文件夹是 /opt/hadoop。然后准备一些环境变量
export HADOOP_HOME=/opt/hadoop
export PATH=$PATH:$HADOOP_HOME/bin
准备 JRE 环境
- 首先,我们需要为 JVM 相关依赖项添加库路径。例如,对于 MacOS,
export DYLD_LIBRARY_PATH=$JAVA_HOME/jre/lib/server
- 由于我们编译的 libhdfs 是 JNI 本地实现,它需要适当的 CLASSPATH 来加载与 Hadoop 相关的 Jars。例如,
export CLASSPATH=$CLASSPATH:`hadoop classpath --glob`
示例
假设有一个 hdfs 目录,
let hdfs_file_uri = "hdfs://localhost:8020/testing/tpch_1g/parquet/line_item";
其中包含一系列 parquet 文件。然后我们可以按照以下方式查询这些 parquet 文件
let ctx = SessionContext::new();
let url = Url::parse("hdfs://").unwrap();
ctx.runtime_env().register_object_store(&url, Arc::new(HadoopFileSystem));
let table_name = "line_item";
println!(
"Register table {} with parquet file {}",
table_name, hdfs_file_uri
);
ctx.register_parquet(table_name, &hdfs_file_uri, ParquetReadOptions::default()).await?;
let sql = "SELECT count(*) FROM line_item";
let result = ctx.sql(sql).await?.collect().await?;
测试
- 首先克隆测试数据存储库
git submodule update --init --recursive
- 运行测试
cargo test
在测试过程中,将自动模拟并启动 HDFS 集群。
- 启用 hdfs3 功能运行测试
cargo build --no-default-features --features datafusion-objectstore-hdfs/hdfs3,datafusion-objectstore-hdfs-testing/hdfs3,datafusion-hdfs-examples/hdfs3
cargo test --no-default-features --features datafusion-objectstore-hdfs/hdfs3,datafusion-objectstore-hdfs-testing/hdfs3,datafusion-hdfs-examples/hdfs3
通过以下方式运行 ballista-sql 测试
cargo run --bin ballista-sql --no-default-features --features hdfs3
依赖关系
~7–18MB
~246K SLoC