将数据从 Azure Data Lake 加载到 DSVM 上的 Jupyter notebook

Load data from Azure Data Lake to Jupyter notebook on DSVM

我正在尝试将数据从 Azure Data Lake 加载到我的 Data Science VM 中的 Jupyter notebook。请注意,我是数据湖存储的所有者,拥有读取、写入和执行权限。带有 Jupyter 的数据科学 VM 在同一订阅下 运行,并且在同一资源组下。我正在尝试以下两种方法,但都面临问题。它们基于 this 博客 post。


以下是我使用 PySpark 加载数据的代码:

hvacText = sc.textFile("adl://name.azuredatalakestore.net/file_to_read.csv")
hvacText.count()

抛出以下异常:

Py4JJavaError: An error occurred while calling o52.text.
: java.io.IOException: No FileSystem for scheme: adl
at org.apache.hadoop.fs.FileSystem.getFileSystemClass(FileSystem.java:2660)
at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2667)
at org.apache.hadoop.fs.FileSystem.access0(FileSystem.java:94)
at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:2703)
at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:2685)
at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:373)
at org.apache.hadoop.fs.Path.getFileSystem(Path.java:295)
at org.apache.spark.sql.execution.datasources.DataSource$.org$apache$spark$sql$execution$datasources$DataSource$$checkAndGlobPathIfNecessary(DataSource.scala:616)
at org.apache.spark.sql.execution.datasources.DataSource$$anonfun.apply(DataSource.scala:350)
at org.apache.spark.sql.execution.datasources.DataSource$$anonfun.apply(DataSource.scala:350)
at scala.collection.TraversableLike$$anonfun$flatMap.apply(TraversableLike.scala:241)
at scala.collection.TraversableLike$$anonfun$flatMap.apply(TraversableLike.scala:241)
at scala.collection.immutable.List.foreach(List.scala:381)
at scala.collection.TraversableLike$class.flatMap(TraversableLike.scala:241)
at scala.collection.immutable.List.flatMap(List.scala:344)
at org.apache.spark.sql.execution.datasources.DataSource.resolveRelation(DataSource.scala:349)
at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:178)
at org.apache.spark.sql.DataFrameReader.text(DataFrameReader.scala:623)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:244)
at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:357)
at py4j.Gateway.invoke(Gateway.java:280)
at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132)
at py4j.commands.CallCommand.execute(CallCommand.java:79)
at py4j.GatewayConnection.run(GatewayConnection.java:214)
at java.lang.Thread.run(Thread.java:748)

以下是我使用 SDK 访问数据的代码:

from azure.datalake.store import core, lib, multithread    
token = lib.auth()
# output: To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code XXXX to authenticate.
# here I open the link and enter the code successfully
adl = core.AzureDLFileSystem(token, store_name='store_name')
adl.ls('/')

发生以下异常:

DatalakeRESTException: Data-lake REST exception: LISTSTATUS, .

我对修复 Spark 解决方案更感兴趣,但我们将不胜感激。

您是否在 $SPARK_HOME/conf 中编辑或创建了 core-site.xml(必须是 /dsvm/tools/spark/current/conf)并添加了您链接的参考文章中指定的配置 属性与 ADLS 访问令牌和 ADL 架构详细信息? (为方便起见粘贴在这里)。

<configuration>
  <property>
        <name>dfs.adls.oauth2.access.token.provider.type</name>
        <value>ClientCredential</value>
  </property>

  <property>
      <name>dfs.adls.oauth2.refresh.url</name>
      <value>YOUR TOKEN ENDPOINT</value>
  </property>
  <property>
      <name>dfs.adls.oauth2.client.id</name>
      <value>YOUR CLIENT ID</value>
  </property>
  <property>
      <name>dfs.adls.oauth2.credential</name>
      <value>YOUR CLIENT SECRET</value>
  </property>
  <property>
      <name>fs.adl.impl</name>
      <value>org.apache.hadoop.fs.adl.AdlFileSystem</value>
  </property>
  <property>
      <name>fs.AbstractFileSystem.adl.impl</name>
      <value>org.apache.hadoop.fs.adl.Adl</value>
  </property>  
</configuration>

ADLS 连接 JAR 文件已预构建到 DSVM 中。

您需要做两件事才能在 DSVM 上使用 ADLS 连接器:

  1. 将两个 jar,hadoop-azure-datalake-3.0.0-alpha3.jar 和 azure-data-lake-store-sdk-2.1.5.jar 添加到 spark-defaults.conf,通过编辑 /dsvm/tools/spark/current/conf/spark-defaults.conf 并将两个 jar 添加到 spark.jars。我们默认不加载它们,因此用户可以获得更快的启动时间。
  2. 创建core-site.xml:同样是在conf目录下,将core-site.xml.template复制到core-site.xml。仅保留 ADLS 部分并输入您的值。

您还需要修复当前图像中损坏的符号链接:在 /dsvm/tools/spark/current/jars 中,有 azure-data-lake-store-sdk-2.0.11.jar 和 hadoop-azure- 的符号链接datalake-3.0.0-alpha2.jar。您应该删除这些并将符号链接添加到 /opt/adls-jars/hadoop-azure-datalake-3.0.0-alpha3.jar 和 /opt/adls-jars/azure-data-lake-store-sdk-2.1.5.jar。这是我们的一个错误。