-
Notifications
You must be signed in to change notification settings - Fork 5.5k
feat: Add support for Azure Blob Storage and ADLS Gen2 in Hive connector #25107
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
base: master
Are you sure you want to change the base?
Conversation
|
@imjalpreet imported this issue as lakehouse/presto #25107 |
imjalpreet
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@mehradpk Thank you for the PR, I have taken an initial pass on the PR.
Have you carried out some actual tests with Azure?
| { | ||
| return optional.filter(value -> !value.isEmpty()); | ||
| } | ||
| private static Proxy proxyForHost(HostAndPort address) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nit: this is unused
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thank you for reviewing the PR. I have carried out real test with Azure storage account.
The method proxyForHost was unused, so I’ve removed it. It likely came in earlier as part of the ADLS Gen1 support, which has since been removed in this implementation.
| configBinder(binder).bindConfig(HiveAzureConfig.class); | ||
| binder.bind(AzureConfigurationInitializer.class).to(HiveAzureConfigurationInitializer.class).in(Scopes.SINGLETON); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
As we have already created HiveAzureModule, please re-use that. You can bind it in DeltaConnectorFactory
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks for the suggestion. I’ve now removed the separate binding and reused the existing HiveAzureModule by binding it in DeltaConnectorFactory as recommended.
| public HiveAzureConfigurationInitializer(HiveAzureConfig config) | ||
| { | ||
| this.wasbAccessKey = dropEmpty(config.getWasbAccessKey()); | ||
| this.wasbStorageAccount = dropEmpty(config.getWasbStorageAccount()); | ||
| if (wasbAccessKey.isPresent() || wasbStorageAccount.isPresent()) { | ||
| checkArgument( | ||
| wasbAccessKey.isPresent() && wasbStorageAccount.isPresent(), | ||
| "If WASB storage account or access key is set, both must be set"); | ||
| } | ||
|
|
||
| this.abfsAccessKey = dropEmpty(config.getAbfsAccessKey()); | ||
| this.abfsStorageAccount = dropEmpty(config.getAbfsStorageAccount()); | ||
| this.abfsOAuthClientEndpoint = dropEmpty(config.getAbfsOAuthClientEndpoint()); | ||
| this.abfsOAuthClientId = dropEmpty(config.getAbfsOAuthClientId()); | ||
| this.abfsOAuthClientSecret = dropEmpty(config.getAbfsOAuthClientSecret()); | ||
| if (abfsOAuthClientEndpoint.isPresent() || abfsOAuthClientSecret.isPresent() || abfsOAuthClientId.isPresent()) { | ||
| checkArgument( | ||
| abfsOAuthClientEndpoint.isPresent() && abfsOAuthClientId.isPresent() && abfsOAuthClientSecret.isPresent(), | ||
| "If any of ABFS OAuth2 Client endpoint, ID, and secret are set, all must be set."); | ||
| } | ||
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Do we allow the same catalog to have both WASB and ABFS configs? Is it supported?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Currently, the implementation accepts both WASB and ABFS configs if all their required fields are present. However, there's no specific logic that handles what happens if both are configured — it depends on the Hadoop file system behavior. If we want to restrict using both in a single catalog, I can add a validation check to ensure only one type is configured.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Would you be able to validate what happens if we configure both of them simultaneously? Based on that, we can decide whether or not to restrict this behavior.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Please add a UT for this class
| configBinder(binder).bindConfig(HiveAzureConfig.class); | ||
| binder.bind(GcsConfigurationInitializer.class).to(HiveGcsConfigurationInitializer.class).in(Scopes.SINGLETON); | ||
| binder.bind(AzureConfigurationInitializer.class).to(HiveAzureConfigurationInitializer.class).in(Scopes.SINGLETON); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Same here, as we have already created HiveAzureModule, please re-use that. You can bind it in HudiConnectorFactory
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Updated.
| configBinder(binder).bindConfig(HiveAzureConfig.class); | ||
| binder.bind(GcsConfigurationInitializer.class).to(HiveGcsConfigurationInitializer.class).in(Scopes.SINGLETON); | ||
| binder.bind(AzureConfigurationInitializer.class).to(HiveAzureConfigurationInitializer.class).in(Scopes.SINGLETON); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
As we have already created HiveAzureModule, please re-use that. You can bind it in InternalIcebergConnectorFactory
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Code updated.
|
@mehradpk, can you please help rebase this PR on master? Hadoop Upgrade is merged to master, so we can mark this PR as ready for review. Thanks! |
64eff1c to
b221385
Compare
Reviewer's GuideAdds Azure Blob Storage (wasb://) and ADLS Gen2 (abfs://) support to the Hive connector by introducing new Azure-specific configuration classes and modules, and integrating them into existing HDFS configuration initializers, connector factories, and tests. Class diagram for updated HdfsConfigurationInitializer and connector factoriesclassDiagram
class HdfsConfigurationInitializer {
-AzureConfigurationInitializer azureConfigurationInitialize
+HdfsConfigurationInitializer(..., AzureConfigurationInitializer)
+updateConfiguration(Configuration)
}
HdfsConfigurationInitializer o-- AzureConfigurationInitializer
class HiveConnectorFactory {
+create(...)
}
HiveConnectorFactory --> HiveAzureModule
class HiveAzureModule {
+setup(Binder)
}
HiveAzureModule --> HiveAzureConfig
HiveAzureModule --> HiveAzureConfigurationInitializer
class IcebergNativeCatalogFactory {
-AzureConfigurationInitializer azureConfigurationInitialize
+IcebergNativeCatalogFactory(..., AzureConfigurationInitializer)
+getHadoopConfiguration()
}
IcebergNativeCatalogFactory o-- AzureConfigurationInitializer
class IcebergNessieCatalogFactory {
+IcebergNessieCatalogFactory(..., AzureConfigurationInitializer)
}
IcebergNessieCatalogFactory o-- AzureConfigurationInitializer
class IcebergRestCatalogFactory {
+IcebergRestCatalogFactory(..., AzureConfigurationInitializer)
}
IcebergRestCatalogFactory o-- AzureConfigurationInitializer
File-Level Changes
Tips and commandsInteracting with Sourcery
Customizing Your ExperienceAccess your dashboard to:
Getting Help
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hey there - I've reviewed your changes and they look great!
Prompt for AI Agents
Please address the comments from this code review:
## Individual Comments
### Comment 1
<location> `presto-hive/src/main/java/com/facebook/presto/hive/azure/HiveAzureConfigurationInitializer.java:72-77` </location>
<code_context>
+ config.set("fs.abfs.impl", AzureBlobFileSystem.class.getName());
+ }
+
+ if (abfsOAuthClientEndpoint.isPresent() && abfsOAuthClientId.isPresent() && abfsOAuthClientSecret.isPresent()) {
+ config.set(format("fs.azure.account.auth.type.%s.dfs.core.windows.net", abfsStorageAccount.get()), "OAuth");
+ config.set("fs.azure.account.oauth.provider.type", "org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider");
+ config.set(format("fs.azure.account.oauth2.client.endpoint.%s.dfs.core.windows.net", abfsStorageAccount.get()), abfsOAuthClientEndpoint.get());
+ config.set(format("fs.azure.account.oauth2.client.id.%s.dfs.core.windows.net", abfsStorageAccount.get()), abfsOAuthClientId.get());
+ config.set(format("fs.azure.account.oauth2.client.secret.%s.dfs.core.windows.net", abfsStorageAccount.get()), abfsOAuthClientSecret.get());
+ }
+
</code_context>
<issue_to_address>
**issue (bug_risk):** Potential NPE if abfsStorageAccount is not present when setting OAuth config.
Please add an explicit check to ensure abfsStorageAccount is present before calling get(), or include it in the earlier checkArgument for OAuth parameters to prevent a NullPointerException.
</issue_to_address>
### Comment 2
<location> `presto-hive/src/main/java/com/facebook/presto/hive/azure/HiveAzureConfigurationInitializer.java:67-70` </location>
<code_context>
+
+ if (abfsAccessKey.isPresent() && abfsStorageAccount.isPresent()) {
+ config.set(format("fs.azure.account.key.%s.dfs.core.windows.net", abfsStorageAccount.get()), abfsAccessKey.get());
+ config.set("fs.abfs.impl", AzureBlobFileSystem.class.getName());
+ }
+
</code_context>
<issue_to_address>
**suggestion:** Setting 'fs.abfs.impl' may override user configuration.
Check if 'fs.abfs.impl' is already set in the configuration before assigning it, or clearly document that this will override any existing value.
```suggestion
if (abfsAccessKey.isPresent() && abfsStorageAccount.isPresent()) {
config.set(format("fs.azure.account.key.%s.dfs.core.windows.net", abfsStorageAccount.get()), abfsAccessKey.get());
if (config.get("fs.abfs.impl") == null) {
config.set("fs.abfs.impl", AzureBlobFileSystem.class.getName());
}
}
```
</issue_to_address>Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.
presto-hive/src/main/java/com/facebook/presto/hive/azure/HiveAzureConfigurationInitializer.java
Outdated
Show resolved
Hide resolved
presto-hive/src/main/java/com/facebook/presto/hive/azure/HiveAzureConfigurationInitializer.java
Show resolved
Hide resolved
|
Should any documentation be added? Perhaps some examples? https://github.com/prestodb/presto/blob/master/presto-docs/src/main/sphinx/connector/hive.rst |
Yes, documentation should be updated. Since ADLS support is being added, we should document the required configuration properties (e.g., fs.azure.account.key, fs.azure.account.auth.type, etc.), how users can enable it, and any limitations. I can add a new subsection under the Hive connector. |
46c87ca to
f98eb88
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
New security issues found
f98eb88 to
9025dd1
Compare
|
@imjalpreet All changes addressed. Re-requested review but it may not have triggered properly - could you please review the changes? @steveburnett Documentation has been added, Could you please review? |
steveburnett
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks for the doc! The content looks good, but there are several formatting errors.
You might find https://github.com/prestodb/presto/tree/master/presto-docs#building-the-documentation and https://github.com/prestodb/presto/tree/master/presto-docs#viewing-the-documentation helpful to run local doc builds and test your documentation format locally.
| ------------------- | ||
|
|
||
| The Hive connector supports Azure Blob Storage (``wasb://``) and Azure Data Lake Storage Gen2 (``abfs://``). | ||
| Configure Azure storage access in your catalog properties file (e.g., ``etc/catalog/hive.properties``). |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
| Configure Azure storage access in your catalog properties file (e.g., ``etc/catalog/hive.properties``). | |
| Configure Azure storage access in your catalog properties file, such as in ``etc/catalog/hive.properties``. |
Avoid Latin abbreviations. See the GitLab documentation style guide recommended word list entry for e.g. for alternatives. I've suggested one alternative here, please revise it if a different alternative fits better.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
fixed
| Configuration Properties | ||
| ^^^^^^^^^^^^^^^^^^^^^^^^ | ||
|
|
||
| ================================================= ===================================================================== |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
| Property Name Description | ||
| ================================================= ===================================================================== | ||
| ``hive.azure.wasb.storage-account`` Azure Blob Storage account name | ||
| (without ``.blob.core.windows.net suffix``) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
suffix should not be within the formatting ticks
| ``hive.azure.wasb.access-key`` Azure Blob Storage access key | ||
|
|
||
| ``hive.azure.abfs.storage-account`` ADLS Gen2 storage account name | ||
| (without ``.blob.core.windows.net suffix``) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
suffix should not be within the formatting ticks
| * WASB requires both ``wasb.storage-account`` and ``wasb.access-key`` to be set | ||
| * ABFS with shared key requires both ``abfs.storage-account`` and ``abfs.access-key`` to be set | ||
| * ABFS with OAuth requires ``abfs.storage-account``, ``abfs.oauth.client-endpoint``, ``abfs.oauth.client-id``, and | ||
| ``abfs.oauth.client-secret`` (all four properties) to be set |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
| abfs://<container>@<storage-account>.dfs.core.windows.net/<path> | ||
|
|
||
| Usage Examples | ||
| ^^^^^^^^^^ |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
| ^^^^^^^^^^ | |
| ^^^^^^^^^^^^^^ |
| ##################### | ||
|
|
||
| If you see ``403 Forbidden`` or ``401 Unauthorized``: | ||
| * Verify storage account names are correct (without .blob.core.windows.net or .dfs.core.windows.net suffix) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
fixed all doc related issues.
imjalpreet
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thank you, @mehradpk. I finished another round of review. It mostly looks good now, with some minor suggestions.
|
|
||
| configBinder(binder).bindConfig(HiveGcsConfig.class); | ||
| binder.bind(GcsConfigurationInitializer.class).to(HiveGcsConfigurationInitializer.class).in(Scopes.SINGLETON); | ||
|
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nit: unrelated, please revert
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
done
| if (wasbAccessKey.isPresent() || wasbStorageAccount.isPresent()) { | ||
| checkArgument( | ||
| wasbAccessKey.isPresent() && wasbStorageAccount.isPresent(), | ||
| "If WASB storage account or access key is set, both must be set"); | ||
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
| if (wasbAccessKey.isPresent() || wasbStorageAccount.isPresent()) { | |
| checkArgument( | |
| wasbAccessKey.isPresent() && wasbStorageAccount.isPresent(), | |
| "If WASB storage account or access key is set, both must be set"); | |
| } | |
| checkArgument( | |
| wasbAccessKey.isPresent() == wasbStorageAccount.isPresent(), | |
| "If WASB storage account or access key is set, both must be set"); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
updated
| this.abfsOAuthClientEndpoint = dropEmpty(config.getAbfsOAuthClientEndpoint()); | ||
| this.abfsOAuthClientId = dropEmpty(config.getAbfsOAuthClientId()); | ||
| this.abfsOAuthClientSecret = dropEmpty(config.getAbfsOAuthClientSecret()); | ||
| if (abfsOAuthClientEndpoint.isPresent() || abfsOAuthClientSecret.isPresent() || abfsOAuthClientId.isPresent()) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
abfsStorageAccount.isPresent() is missing in the if condition
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Refactored this piece of code to handle all scenarios. Previously, including abfsStorageAccount in the OAuth check can result in error if a user intended to use only the access key. Now the code separately validates - access key and OAuth.
| public HiveAzureConfigurationInitializer(HiveAzureConfig config) | ||
| { | ||
| this.wasbAccessKey = dropEmpty(config.getWasbAccessKey()); | ||
| this.wasbStorageAccount = dropEmpty(config.getWasbStorageAccount()); | ||
| if (wasbAccessKey.isPresent() || wasbStorageAccount.isPresent()) { | ||
| checkArgument( | ||
| wasbAccessKey.isPresent() && wasbStorageAccount.isPresent(), | ||
| "If WASB storage account or access key is set, both must be set"); | ||
| } | ||
|
|
||
| this.abfsAccessKey = dropEmpty(config.getAbfsAccessKey()); | ||
| this.abfsStorageAccount = dropEmpty(config.getAbfsStorageAccount()); | ||
| this.abfsOAuthClientEndpoint = dropEmpty(config.getAbfsOAuthClientEndpoint()); | ||
| this.abfsOAuthClientId = dropEmpty(config.getAbfsOAuthClientId()); | ||
| this.abfsOAuthClientSecret = dropEmpty(config.getAbfsOAuthClientSecret()); | ||
| if (abfsOAuthClientEndpoint.isPresent() || abfsOAuthClientSecret.isPresent() || abfsOAuthClientId.isPresent()) { | ||
| checkArgument( | ||
| abfsOAuthClientEndpoint.isPresent() && abfsOAuthClientId.isPresent() && abfsOAuthClientSecret.isPresent(), | ||
| "If any of ABFS OAuth2 Client endpoint, ID, and secret are set, all must be set."); | ||
| } | ||
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Would you be able to validate what happens if we configure both of them simultaneously? Based on that, we can decide whether or not to restrict this behavior.
| } | ||
| } | ||
|
|
||
| if (abfsOAuthClientEndpoint.isPresent() && abfsOAuthClientId.isPresent() && abfsOAuthClientSecret.isPresent()) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
abfsStorageAccount.isPresent() check is missing here as well
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
added.
| import static com.facebook.airlift.configuration.ConfigBinder.configBinder; | ||
|
|
||
| public class HiveAzureModule | ||
| extends AbstractConfigurationAwareModule |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We don't need to use AbstractConfigurationAwareModule here, as we are not binding based on the value of any configuration.
You can implement com.google.inject.Module
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
updated
| configBinder(binder).bindConfig(MetastoreClientConfig.class); | ||
| configBinder(binder).bindConfig(ThriftHiveMetastoreConfig.class); | ||
| configBinder(binder).bindConfig(HiveGcsConfig.class); | ||
| // configBinder(binder).bindConfig(HiveAzureConfig.class); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nit: remove commented code
| configBinder(binder).bindConfig(HiveGcsConfig.class); | ||
| // configBinder(binder).bindConfig(HiveAzureConfig.class); | ||
| binder.bind(GcsConfigurationInitializer.class).to(HiveGcsConfigurationInitializer.class).in(Scopes.SINGLETON); | ||
| // binder.bind(AzureConfigurationInitializer.class).to(HiveAzureConfigurationInitializer.class).in(Scopes.SINGLETON); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nit: remove commented code
| configBinder(binder).bindConfig(FileMergeCacheConfig.class); | ||
| binder.bind(CacheStats.class).in(Scopes.SINGLETON); | ||
| configBinder(binder).bindConfig(HiveGcsConfig.class); | ||
| // configBinder(binder).bindConfig(HiveAzureConfig.class); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nit: remove commented code
| configBinder(binder).bindConfig(HiveGcsConfig.class); | ||
| // configBinder(binder).bindConfig(HiveAzureConfig.class); | ||
| binder.bind(GcsConfigurationInitializer.class).to(HiveGcsConfigurationInitializer.class).in(Scopes.SINGLETON); | ||
| // binder.bind(AzureConfigurationInitializer.class).to(HiveAzureConfigurationInitializer.class).in(Scopes.SINGLETON); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nit: remove commented code
Introduce support for Azure storage backends including Azure Blob Storage (using the wasbs:// scheme) and Azure Data Lake Storage Gen2 (using the abfss:// scheme) in the Hive connector. Key changes: - Added HiveAzureConfigurationInitializer to inject relevant Azure configurations into Hadoop Configuration - Introduced HiveAzureConfig to allow catalog-level configuration of Azure properties - Updated HdfsConfigurationInitializer and HiveConnectorFactory to delegate Azure-specific config setup - Registered configuration initializer in Hive module Supports shared key and OAuth2-based authentication.
9025dd1 to
a65a447
Compare
|
@imjalpreet #25107 (comment) --> Yes. After testing the behavior of the
|
steveburnett
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM! (docs)
Pull updated branch, new local doc build. Looks good, thanks!



Description
Introduce support for Azure storage backends including Azure Blob Storage (using the wasb:// scheme) and Azure Data Lake Storage Gen2 (using the abfs:// scheme) in the Hive connector.
Key changes:
Added HiveAzureConfigurationInitializer to inject relevant Azure configurations into Hadoop Configuration
Introduced HiveAzureConfig to allow catalog-level configuration of Azure properties
Updated HdfsConfigurationInitializer and HiveConnectorFactory to delegate Azure-specific config setup
Registered configuration initializer in Hive module
Supports shared key and OAuth2-based authentication.
##Motivation and Context
Several enterprise data lake workloads are hosted on Azure storage platforms. This change allows Presto to directly query data from Azure Blob Storage and ADLS Gen2, bringing Azure compatibility in line with other cloud storage systems like Amazon S3 and Google Cloud Storage.
Impact
Adds support for Azure cloud storage within the Hive connector
Introduces new configuration properties under HiveAzureConfig
No breaking changes to existing Hive catalogs or connectors
Test Plan
Test done via Hive Connector.
Contributor checklist
== RELEASE NOTES ==