在 DBFS 上为 Databricks 安装 ADLS 时出错(错误:NullPointerException)

时间:2021-02-06 15:34:54

标签: azure azure-active-directory databricks azure-data-lake

我正在尝试在 Databricks 中安装 Azure Data Lake Gen 2,出现如下错误。

<块引用>

java.lang.NullPointerException: authEndpoint

我使用的代码如下所示

configs = {
  "fs.azure.account.auth.type": "OAuth",
  "fs.azure.account.auth.provider.type": "org.apache.hadoop.fs.azurebfs.ClientCredsTokenProvider",
  "fs.azure.account.auth2.client.id": "<client-id>",
  "fs.azure.account.auth2.client.secret": dbutils.secrets.get(scope = "scope1", key = "kvsecretfordbricks"),
  "dfs.adls.oauth2.refresh.url": "https://login.microsoftonline.com/<tenant-id>/oauth2/token"}

dbutils.fs.mount(
    source = "abfss://starter1@newresourcegroupadcadls.dfs.core.windows.net/",
    mount_point = "/mnt/demo",
  extra_configs = configs)

下面给出了完整的错误

<块引用>

----------------------------------------------- ---------------------------- ExecutionError Traceback(最近一次调用 最后)在 9 源 = "abfss://starter1@newresourcegroupadcadls.dfs.core.windows.net/", 10 mount_point = "/mnt/demo", ---> 11 extra_configs = configs)

/local_disk0/tmp/1612619970782-0/dbutils.py 中 f_with_exception_handling(*args, **kwargs) 312 exc.上下文 = 无 313 exc.原因 = 无 --> 314 提高排除 第315回 316

ExecutionError:调用 o271.mount 时出错。 : java.lang.NullPointerException: authEndpoint at shaded.databricks.v20180920_b33d810.com.google.common.base.Preconditions.checkNotNull(Preconditions.java:204) 在 shaded.databricks.v20180920_b33d810.org.apache.hadoop.fs.azurebfs.oauth2.AzureADAuthenticator.getTokenUsingClientCreds(AzureADAuthenticator.java:84) 在 com.databricks.backend.daemon.dbutils.DBUtilsCore.verifyAzureOAuth(DBUtilsCore.scala:477) 在 com.databricks.backend.daemon.dbutils.DBUtilsCore.verifyAzureFileSystem(DBUtilsCore.scala:488) 在 com.databricks.backend.daemon.dbutils.DBUtilsCore.mount(DBUtilsCore.scala:446) 在 sun.reflect.GeneratedMethodAccessor292.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:498) 在 py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:244) 在 py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:380) 在 py4j.Gateway.invoke(Gateway.java:295) 在 py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132) 在 py4j.commands.CallCommand.execute(CallCommand.java:79) 在 py4j.GatewayConnection.run(GatewayConnection.java:251) 在 java.lang.Thread.run(Thread.java:748)

任何帮助将不胜感激

当我跑步时

dbutils.fs.unmount("/mnt")

没有以“/mnt”开头的挂载点

--

更新

dfs.adls.oauth2.refresh.url 更新为 fs.azure.account.oauth2.client.endpoint 后的其他错误消息

<块引用>

ExecutionError Traceback(最近一次调用 最后)在 9 源 = "abfss://starter1@newresourcegroupadcadls.dfs.core.windows.net/", 10 mount_point = "/mnt/demo", ---> 11 extra_configs = configs)

/local_disk0/tmp/1612858508533-0/dbutils.py 中 f_with_exception_handling(*args, **kwargs) 312 exc.上下文 = 无 313 exc.原因 = 无 --> 314 提高排除 第315回 316

ExecutionError:调用 o275.mount 时出错。 : java.lang.NullPointerException: clientId at shaded.databricks.v20180920_b33d810.com.google.common.base.Preconditions.checkNotNull(Preconditions.java:204) 在 shaded.databricks.v20180920_b33d810.org.apache.hadoop.fs.azurebfs.oauth2.AzureADAuthenticator.getTokenUsingClientCreds(AzureADAuthenticator.java:85) 在 com.databricks.backend.daemon.dbutils.DBUtilsCore.verifyAzureOAuth(DBUtilsCore.scala:477) 在 com.databricks.backend.daemon.dbutils.DBUtilsCore.verifyAzureFileSystem(DBUtilsCore.scala:488) 在 com.databricks.backend.daemon.dbutils.DBUtilsCore.mount(DBUtilsCore.scala:446) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:498) 在 py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:244) 在 py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:380) 在 py4j.Gateway.invoke(Gateway.java:295) 在 py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132) 在 py4j.commands.CallCommand.execute(CallCommand.java:79) 在 py4j.GatewayConnection.run(GatewayConnection.java:251) 在 java.lang.Thread.run(Thread.java:748)

1 个答案:

答案 0 :(得分:0)

如果要将 Azure Data Lake Storage Gen2 帐户挂载到 DBFS,请将 dfs.adls.oauth2.refresh.url 更新为 fs.azure.account.oauth2.client.endpoint。有关详细信息,请参阅 official documenthere

例如

  1. 创建 Azure Data Lake Storage Gen2 帐户。
az login
az storage account create \
    --name <account-name> \
    --resource-group <group name> \
    --location westus \
    --sku Standard_RAGRS \
    --kind StorageV2 \
    --enable-hierarchical-namespace true
  1. 创建服务主体并将存储 Blob 数据贡献者分配给 Data Lake Storage Gen2 存储帐户范围内的 sp
az login

az ad sp create-for-rbac -n "MyApp" --role "Storage Blob Data Contributor" \
    --scopes /subscriptions/<subscription>/resourceGroups/<resource-group>/providers/Microsoft.Storage/storageAccounts/<storage-account>
  1. 在 Azure Databricks 中创建 Spark 群集

  2. 在 Azure 数据块(python)中安装 Azure 数据湖 gen2

configs = {"fs.azure.account.auth.type": "OAuth",
           "fs.azure.account.oauth.provider.type": "org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider",
           "fs.azure.account.oauth2.client.id": "<application-id>",
           "fs.azure.account.oauth2.client.secret": dbutils.secrets.get(scope="<scope-name>",key="<service-credential-key-name>"),
           "fs.azure.account.oauth2.client.endpoint": "https://login.microsoftonline.com/<directory-id>/oauth2/token"}

# Optionally, you can add <directory-name> to the source URI of your mount point.
dbutils.fs.mount(
  source = "abfss://<file-system-name>@<storage-account-name>.dfs.core.windows.net/",
  mount_point = "/mnt/demo",
  extra_configs = configs)

enter image description here

  1. 检查
dbutils.fs.ls("/mnt/demo")

enter image description here

相关问题