在HDInsights上使用Spark - 没有适用于方案“adl”的文件系统

3

我正在编写一个应用程序,处理来自ADLS的文件。当尝试通过在spark-shell中运行代码从集群中读取文件时,它没有问题访问文件。然而,当我尝试在集群上使用sbt运行该项目时,它会给我以下错误:

[error] java.io.IOException: No FileSystem for scheme: adl

implicit val spark = SparkSession.builder().master("local[*]").appName("AppMain").getOrCreate()
import spark.implicits._

val listOfFiles = spark.sparkContext.binaryFiles("adl://adlAddressHere/FolderHere/")

val fileList = listOfFiles.collect()

这是关于在HDI 3.6上运行Spark 2.2的说明。
2个回答

2
在你的build.sbt文件中添加以下内容:
libraryDependencies += "org.apache.hadoop" % "hadoop-azure-datalake" % "2.8.0" % Provided

我使用Spark 2.3.1而不是2.2。那个版本能够很好地与hadoop-azure-datalake 2.8.0配合使用。

接下来,配置你的Spark context:

(注:Original Answer翻译成“最初的回答”)

val spark: SparkSession = SparkSession.builder.master("local").getOrCreate()
import spark.implicits._

val hadoopConf = spark.sparkContext.hadoopConfiguration
hadoopConf.set("fs.adl.impl", "org.apache.hadoop.fs.adl.AdlFileSystem")
hadoopConf.set("fs.AbstractFileSystem.adl.impl", "org.apache.hadoop.fs.adl.Adl")
hadoopConf.set("dfs.adls.oauth2.access.token.provider.type", "ClientCredential")
hadoopConf.set("dfs.adls.oauth2.client.id", clientId)
hadoopConf.set("dfs.adls.oauth2.credential", clientSecret)
hadoopConf.set("dfs.adls.oauth2.refresh.url", s"https://login.microsoftonline.com/$tenantId/oauth2/token")

TL;DR;

如果您正在通过Spark上下文使用RDD,您可以告诉Hadoop Configuration 您的 org.apache.hadoop.fs.adl.AdlFileSystem 实现在哪里。

关键字的格式为fs.<fs-prefix>.impl,值是实现类org.apache.hadoop.fs.FileSystem 的完整类名。

在您的情况下,您需要fs.adl.impl,由org.apache.hadoop.fs.adl.AdlFileSystem 实现。

val spark: SparkSession = SparkSession.builder.master("local").getOrCreate()
import spark.implicits._

val hadoopConf = spark.sparkContext.hadoopConfiguration
hadoopConf.set("fs.adl.impl", "org.apache.hadoop.fs.adl.AdlFileSystem")

我通常使用Spark SQL,因此我需要配置Spark会话:

我经常使用Spark SQL,所以我也需要配置Spark会话:

val spark: SparkSession = SparkSession.builder.master("local").getOrCreate()
spark.conf.set("fs.adl.impl", "org.apache.hadoop.fs.adl.AdlFileSystem")
spark.conf.set("dfs.adls.oauth2.access.token.provider.type", "ClientCredential")
spark.conf.set("dfs.adls.oauth2.client.id", clientId)
spark.conf.set("dfs.adls.oauth2.credential", clientSecret)
spark.conf.set("dfs.adls.oauth2.refresh.url", s"https://login.microsoftonline.com/$tenantId/oauth2/token")

1

我发现如果将jar打包并通过spark-submit提交,它可以正常工作,所以暂时可以这样做。但我仍然很惊讶为什么它不能在本地[*]模式下工作。


你找到实际的根本原因了吗?你知道有哪些公共包可以通过spark-submit使用吗? - raga
我没有弄清楚为什么会发生这种情况。抱歉。 - Leyth G

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接