#hdfs #store #hadoop #hdfs3

datafusion-objectstore-hdfs-no-test

实现了无 zip 测试的对象存储 HDFS

3 个版本

0.1.6 2023 年 9 月 11 日
0.1.5 2023 年 9 月 10 日
0.1.4 2023 年 9 月 10 日

#611压缩

Apache-2.0

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

  1. 安装 Java。

  2. 指定并导出 JAVA_HOME

准备 Hadoop 客户端

  1. 要获取 Hadoop 发行版,从 Apache 下载镜像 之一下载最新的稳定版本。目前,我们支持 Hadoop-2 和 Hadoop-3。

  2. 解压缩下载的 Hadoop 发行版。例如,文件夹是 /opt/hadoop。然后准备一些环境变量

export HADOOP_HOME=/opt/hadoop

export PATH=$PATH:$HADOOP_HOME/bin

准备 JRE 环境

  1. 首先,我们需要为 JVM 相关依赖项添加库路径。例如,对于 MacOS,
export DYLD_LIBRARY_PATH=$JAVA_HOME/jre/lib/server
  1. 由于我们编译的 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?;

测试

  1. 首先克隆测试数据存储库
git submodule update --init --recursive
  1. 运行测试
cargo test

在测试过程中,将自动模拟并启动 HDFS 集群。

  1. 启用 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