我正在编写一个处理来自 ADLS 的文件的应用程序。当尝试通过运行 spark-shell 中的代码从集群读取文件时,访问文件没有问题。但是,当我尝试在集群上运行 sbt 项目时,它会给我:
[错误] java.io.IOException:方案没有文件系统: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
最佳答案
在你的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 context 使用 RDD,您可以告诉 Hadoop Configuration在哪里可以找到你的 org.apache.hadoop.fs.adl.AdlFileSystem
的实现.
key 的格式为 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 session:
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")
关于scala - Spark on HDInsights - 方案 : adl 没有文件系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50913598/