HDInsights上的Spark - 没有用于方案的FileSystem:adl

问题描述 投票:2回答:2

我正在编写一个处理ADLS文件的应用程序。通过在spark-shell中运行代码尝试从群集中读取文件时,访问文件没有问题。但是,当我尝试在集群上运行项目时,它给了我:

[error] java.io.IOException:没有用于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

scala apache-spark azure-data-lake hdinsight
2个回答
1
投票

好吧,我发现如果我打包jar并且火花 - 提交它它工作正常,这将适用于平均时间。我仍然感到惊讶它不会在本地[*]模式下工作。


0
投票

在你的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上下文:

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会话:

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")
© www.soinside.com 2019 - 2024. All rights reserved.