Repository navigation
feat(storage): Add HDFS support via opendal services-hdfs-native #3111
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
mixermt
wants to merge
68
commits into
apache:main
Choose a base branch
from
mixermt:feat-storage-hdfs-native
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
+2,466
−12
Open
Changes from all commits
Commits
Show all changes
68 commits
Select commit
Hold shift + click to select a range
6679a19
feat(storage): Add HDFS support via opendal services-hdfs-native
mixermt 4e0f745
Merge branch 'main' into feat-storage-hdfs-native
mixermt 2b0ca95
refactor: address review — Properties derive for HdfsConfig, drop HDF…
mixermt 7939b68
Merge remote-tracking branch 'origin/feat-storage-hdfs-native' into f…
mixermt 45bd68a
fix: reject non-hierarchical hdfs URLs; key delete_stream batches by …
mixermt 4141f4e
Merge branch 'main' into feat-storage-hdfs-native
mixermt 2578c03
Merge branch 'main' into feat-storage-hdfs-native
mixermt 13911c5
Merge remote-tracking branch 'apache/main' into feat-storage-hdfs-native
mixermt a4178fe
refactor(storage): rename hdfs module to hdfs_native, drop unused Hdf…
mixermt a9a6786
Merge branch 'main' into feat-storage-hdfs-native
mixermt 806bd89
Merge branch 'main' into feat-storage-hdfs-native
mixermt 9d7d2d8
ci: retrigger after setup-python manifest timeout on macos runner
mixermt c561cfc
Merge branch 'main' into feat-storage-hdfs-native
mixermt d17ae38
fix(storage): address review — cache newtype, build outside lock, sin…
mixermt b8cc860
chore(deps): bump rustls to 0.23.45 (RUSTSEC-2026-0285)
mixermt 587688c
Merge remote-tracking branch 'apache/main' into feat-storage-hdfs-native
mixermt 72305b6
Merge branch 'main' into feat-storage-hdfs-native
mixermt f8b6803
Merge branch 'main' into feat-storage-hdfs-native
mixermt ffee268
Merge branch 'main' into feat-storage-hdfs-native
mixermt eeca0d1
Merge branch 'main' into feat-storage-hdfs-native
mixermt 2068e83
Merge remote-tracking branch 'apache/main' into feat-storage-hdfs-native
mixermt 297afd6
test(storage): pin IPv6 authority handling in HDFS path parsing
mixermt c018cd1
fix(storage): resolve the HDFS NameNode in relativize_path too
mixermt 556a0f2
docs(storage): state the cost of the synchronous HDFS operator build
mixermt d3ef172
docs(storage): describe the HDFS operator cache lifecycle
mixermt 62ea36d
fix(storage): normalize each entry of the hdfs.name-node list
mixermt 3ab457a
feat(storage): accept PyIceberg's hdfs.host/hdfs.port for authority-l…
mixermt 74bb9b1
fix(storage): require a port in every hdfs.name-node entry
mixermt 0928265
docs(storage): state the runtime binding of cached HDFS operators
mixermt 089731f
test(storage): cover two-NameNode delete_stream batches and first-ins…
mixermt 22db8e6
test(utils): name the HDFS port constant like its siblings
mixermt 2f6a57d
Merge remote-tracking branch 'apache/main' into feat-storage-hdfs-native
mixermt 629cfc8
fix(storage): rebuild cached HDFS operators once their runtime is gone
mixermt e38bab2
fix(storage): resolve HDFS NameNodes like Hadoop does
mixermt cfe4ee7
refactor(storage): keep the HDFS operator cache out of the public API
mixermt 6603348
perf(storage): build HDFS operators on a blocking thread
mixermt ed23ab6
ci: run the HDFS integration tests in their own job
mixermt cc9dd91
fix(storage): stop dropping HDFS properties silently
mixermt f83db4e
test(storage): derive the second NameNode spelling from the endpoint …
mixermt 9c62f4c
chore: record tracing as a dependency of iceberg-storage-opendal in C…
mixermt a0d2194
fix(storage): report a missing tokio runtime instead of panicking in …
mixermt ca92240
fix(storage): normalize every HDFS NameNode spelling to hdfs://host:port
mixermt ce78ee3
feat(storage): declare HDFS nameservices with hdfs.name-node.<nameser…
mixermt 4a9cc25
fix(storage): require a declaration for every logical HDFS nameservice
mixermt 5870769
fix(storage): reject userinfo and port 0 in HDFS path authorities
mixermt b72d795
fix(storage): validate the NameNode composed from hdfs.host and hdfs.…
mixermt 7f2dc7f
test(storage): use an authority-less path in the cross-runtime HDFS test
mixermt b962408
test(storage): tighten the HDFS tests after review
mixermt ef451b6
Merge branch 'main' into feat-storage-hdfs-native
mixermt 1276d2d
fix(storage): mask userinfo in HDFS errors that echo a path or NameNode
mixermt 1fd3492
fix(storage): recover a poisoned HDFS operator cache lock
mixermt 894a8ed
test(storage): flush the fake NameNode before sampling dials
mixermt 30d74a8
docs(storage): state where portless HDFS authorities differ from Hadoop
mixermt 86d81b4
refactor(storage): rename the HDFS config module to hdfs_native
mixermt a347b84
test(storage): move the HDFS tests out of lib.rs into hdfs_native
mixermt 39b3cc5
refactor(storage): read HDFS properties through #[derive(Properties)]
mixermt 4ab34ee
ci: run the HDFS tests in the default suite like the other fixtures
mixermt 0bf5d5a
fix(storage): build HDFS clients in a crate-owned runtime
mixermt f092ea2
refactor(storage): type HDFS path authorities and validate declaratio…
mixermt 26aba03
refactor(storage): drop index slicing and combinator chains in the HD…
mixermt 80f2149
fix(storage): attach the hdfs.port parse error as the source
mixermt 323c94b
fix(storage): share one HDFS client across host name spellings
mixermt 63dbed2
docs(storage): note the upstream gap behind the HDFS client runtime
mixermt 7ac1f45
test(storage): make the HDFS HA test fail over for real
mixermt fdd9562
Merge apache/main into feat-storage-hdfs-native
mixermt 8aba12b
chore: retrigger CI
mixermt 650e793
chore: retrigger CI
mixermt 0145ca6
docs(storage): document how to enable and configure the HDFS backend
mixermt File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,45 @@ | ||
| // Licensed to the Apache Software Foundation (ASF) under one | ||
| // or more contributor license agreements. See the NOTICE file | ||
| // distributed with this work for additional information | ||
| // regarding copyright ownership. The ASF licenses this file | ||
| // to you under the Apache License, Version 2.0 (the | ||
| // "License"); you may not use this file except in compliance | ||
| // with the License. You may obtain a copy of the License at | ||
| // | ||
| // http://www.apache.org/licenses/LICENSE-2.0 | ||
| // | ||
| // Unless required by applicable law or agreed to in writing, | ||
| // software distributed under the License is distributed on an | ||
| // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | ||
| // KIND, either express or implied. See the License for the | ||
| // specific language governing permissions and limitations | ||
| // under the License. | ||
|
|
||
| //! HDFS storage configuration. | ||
|
|
||
| /// HDFS NameNode RPC endpoint(s) as `host:port`, e.g. `hdfs://namenode:8020`; | ||
| /// a comma-separated list enables HA failover. Serves authority-less paths | ||
| /// (`hdfs:///path`) only; a path authority with a port is used as is. A | ||
| /// portless authority (`hdfs://ns1/path`) must be a nameservice declared in | ||
| /// properties: `hdfs.name-node.<nameservice>` takes the same list and is | ||
| /// sugar for Hadoop's `dfs.ha.namenodes.<nameservice>` and | ||
| /// `dfs.namenode.rpc-address.<nameservice>.<id>`, which are honored as well | ||
| /// when passed through [`HDFS_HADOOP_CONF_PREFIX`]. Unlike Hadoop, an | ||
| /// undeclared one is an error: it is neither resolved from | ||
| /// `$HADOOP_CONF_DIR` nor dialed on the default port 8020. | ||
| pub const HDFS_NAME_NODE: &str = "hdfs.name-node"; | ||
|
mixermt marked this conversation as resolved.
|
||
| /// NameNode host for authority-less paths, as in PyIceberg; paths that carry | ||
| /// an authority ignore it, as they do there. Combined with [`HDFS_PORT`] into | ||
| /// Hadoop's `fs.defaultFS`. PyIceberg's `hdfs.user` and `hdfs.kerberos_ticket` | ||
| /// have no equivalent: the client reads `HADOOP_USER_NAME` and the default | ||
| /// Kerberos credential cache. | ||
| pub const HDFS_HOST: &str = "hdfs.host"; | ||
| /// NameNode port for [`HDFS_HOST`]; defaults to `8020` and has no effect | ||
| /// without the host. | ||
| pub const HDFS_PORT: &str = "hdfs.port"; | ||
| /// Prefix for properties forwarded to the HDFS client configuration with the | ||
| /// prefix stripped: `hadoop.dfs.client.failover.random.order` is forwarded as | ||
| /// `dfs.client.failover.random.order`. Forwarded values override those loaded | ||
| /// from `$HADOOP_CONF_DIR`; `hadoop.fs.defaultFS` also serves authority-less | ||
| /// paths. | ||
| pub const HDFS_HADOOP_CONF_PREFIX: &str = "hadoop."; | ||
|
mixermt marked this conversation as resolved.
|
||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.