我正在编写一个处理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
好吧,我发现如果我打包jar并且火花 - 提交它它工作正常,这将适用于平均时间。我仍然感到惊讶它不会在本地[*]模式下工作。
在你的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")
如果你通过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")