从本地Spark作业连接到Azure Data Lake Gen 2

时间:2019-09-11 16:12:30

标签: java azure apache-spark azure-databricks delta-lake

我正在尝试从本地Spark作业连接到我的ADLS Gen 2数据湖,以读取一些Databricks增量表,该表先前已通过Databricks Notebook存储,但是却遇到了一个非常奇怪的异常,该异常我无法解决:

Exception in thread "main" java.io.IOException: There is no primary group for UGI <xxx> (auth:SIMPLE)
    at org.apache.hadoop.security.UserGroupInformation.getPrimaryGroupName(UserGroupInformation.java:1455)
    at org.apache.hadoop.fs.azurebfs.AzureBlobFileSystemStore.<init>(AzureBlobFileSystemStore.java:136)
    at org.apache.hadoop.fs.azurebfs.AzureBlobFileSystem.initialize(AzureBlobFileSystem.java:108)
    at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:3303)
    at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:124)
    at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:3352)
    at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:3320)
    at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:479)
    at org.apache.hadoop.fs.Path.getFileSystem(Path.java:361)
    at org.apache.spark.sql.delta.DeltaTableUtils$.findDeltaTableRoot(DeltaTable.scala:94)

四处搜寻,但并未发现许多提示。我尝试过的一种方法是传递配置“ spark.hadoop.hive.server2.enable.doAs”,“ false”,但没有用。

我正在使用io.delta 0.3.0,Spark 2.4.2_2.12和azure-hadoop 3.2.0。 我可以通过Azure Databricks群集/笔记本连接到第二代帐户,而不会出现问题。

我正在使用以下代码:

 try(final SparkSession spark = SparkSession.builder().appName("DeltaLake").master("local[*]").getOrCreate()) {
            //spark.conf().set("spark.hadoop.hive.server2.enable.doAs", "false");
            spark.conf().set("fs.azure.account.key.stratify.dfs.core.windows.net", "my gen 2 key");
            spark.read().format("delta").load("abfss://myfs@myaccount.dfs.core.windows.net/Test");
}

1 个答案:

答案 0 :(得分:0)

ADLS Gen2需要Hadoop 3.2,Spark 3.0.0和Delta Lake 0.7.0。这些要求记录在https://docs.delta.io/latest/delta-storage.html#azure-data-lake-storage-gen2

ADLS Gen2 Hadoop连接器仅在Hadoop 3.2.0中可用,Spark 3.0.0是第一个支持Hadoop 3.2的Spark版本。

Databricks Runtime 6.x和更早版本运行Hadoop 2.7和Spark 2.4,但ADLS Gen2 Hadoop连接器在内部反向移植到此旧Hadoop版本。这就是为什么Delta Lake可以在不升级到Spark 3.0.0的情况下在Databricks中工作的原因。