NativeAzureFileSystem无法识别其他容器

时间:2017-02-27 10:49:33

标签: azure hadoop apache-spark hdinsight

我的目标是从HD Insight实例的spark-shell访问位于创建群集的存储帐户内容器中的blob。

这是我采取的步骤:

  1. 在容器https://mystorage.blob.core.windows.net:443/ maincontainer 上创建了一个HD Insight群集。
  2. 在同一存储帐户中创建了另一个容器:https://mystorage.blob.core.windows.net:443/ extracontainer
  3. extracontainer 中创建了一个名为 person.json 的文件:https://mystorage.blob.core.windows.net:443/extracontainer/data/person.json
  4. 打开一个spark-shell会话
  5. 然后我执行了以下代码:

    scala> import org.apache.hadoop.fs._
    
    scala> val conf = sc.hadoopConfiguration
    conf: org.apache.hadoop.conf.Configuration = Configuration: core-default.xml, core-site.xml, mapred-default.xml, mapred-site.xml, yarn-default.xml, yarn-site.xml, hdfs-default.xml, hdfs-site.xml
    
    scala> val fs: FileSystem = FileSystem.newInstance(conf)
    fs: org.apache.hadoop.fs.FileSystem = org.apache.hadoop.fs.azure.NativeAzureFileSystem@417e5282
    
    scala> val files = fs.listFiles(new Path("wasbs://extracontainer@mystorage.blob.core.windows.net/data"), true)
    java.io.FileNotFoundException: Filewasbs://extracontainer@mystorage.blob.core.windows.net/data does not exist.
    

    然后我在 maincontainer 上创建了相同的文件夹和文件: https://mystorage.blob.core.windows.net:443/maincontainer/data/person.json我得到了以下结果:

    scala> val files = fs.listFiles(new Path("wasbs://extracontainer@mystorage.blob.core.windows.net/data"), true)
    scala> while( files.hasNext() ) { println(files.next().getPath) }
    wasb://maincontainer@mystorage.blob.core.windows.net/data/person.json
    

    它向我显示 maincontainer 中的文件,而不是 extracontainer 中的文件。

    有人知道发生了什么吗?

    我也尝试使用new Configuration()创建FileSystem对象,我也有同样的行为。

    使用hadoop fs命令行时获得了正确的行为:

    > hadoop fs -ls wasbs://extracontainer@mystorage.blob.core.windows.net/data/
    Found 1 item
    -rwxrwxrwx   1        977 2017-02-27 08:46 wasbs://extracontainer@mystorage.blob.core.windows.net/data/person.json
    

1 个答案:

答案 0 :(得分:0)

根据您的描述,根据我的理解,我认为您希望使用Spark从Azure Blob存储中读取数据,但是在创建时为fs.defaultFS设置了Hadoop配置的maincontainer设置HDInsight实例。

有两种方法可以满足您的需求。

  1. 使用类ConfigurationaddResource(new Path("wasbs://extracontainer@mystorage.blob.core.windows.net/data"))set("fs.defaultFS", "wasbs://extracontainer@mystorage.blob.core.windows.net/data")方法覆盖用于切换资源引用的fs.defaultFS值,如果fs.defaultFS属性core-site.xml中未标记为<final>true</final>。首先,您需要转到/etc/hadoop/conf进行更改。

  2. 请参阅类似的SO帖子Reading data from Azure Blob with Spark,您可以尝试使用以下代码来读取数据。

    conf.set("fs.azure", "org.apache.hadoop.fs.azure.NativeAzureFileSystem")
    conf.set("fs.azure.account.key.<youraccount>.blob.core.windows.net", "<yourkey>")
    
  3. 希望它有所帮助。