【问题标题】:NativeAzureFileSystem not recognizing other containersNativeAzureFileSystem 无法识别其他容器
【发布时间】:2017-07-17 22:51:04
【问题描述】:

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

这些是我采取的步骤:

  1. 在容器 https://mystorage.blob.core.windows.net:443/ma​​incontainer 上创建了 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 会话

然后我执行了以下代码:

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.

然后我在 ma​​incontainer 上创建了相同的文件夹和文件: 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

它显示了 ma​​incontainer 中的文件,而不是 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

【问题讨论】:

    标签: azure hadoop apache-spark azure-hdinsight


    【解决方案1】:

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

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

    1. 如果core-site.xml 中的fs.defaultFS 属性未标记为<final>true</final>,则使用Configuration 类的addResource(new Path("wasbs://extracontainer@mystorage.blob.core.windows.net/data"))set("fs.defaultFS", "wasbs://extracontainer@mystorage.blob.core.windows.net/data") 方法覆盖fs.defaultFS 值以切换资源引用.所以首先,您需要转到/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>")
      

    希望对你有帮助。

    【讨论】:

    • 嗨@peter-pan-msft,第一个和第三个解决方案(addResourceset("fs.azure", ...))不起作用。使用第二种解决方案,我可以看到来自 extracontainer 的数据,但我无法访问来自 maincontainer 的数据,这使我得出结论 NativeAzureFileSystem 一次只能看到一个容器(?)。但是,以下两个命令可以正常工作:hadoop fs -ls wasbs://extracontainer@mystorage.blob.core.windows.net/datahadoop fs -ls wasbs://maincontainer@mystorage.blob.core.windows.net/data
    猜你喜欢
    • 2022-12-01
    • 2015-05-04
    • 1970-01-01
    • 2021-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多