我的目标是从HD Insight实例的spark-shell访问位于创建群集的存储帐户内容器中的blob。
这是我采取的步骤:
然后我执行了以下代码:
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
答案 0 :(得分:0)
根据您的描述,根据我的理解,我认为您希望使用Spark从Azure Blob存储中读取数据,但是在创建时为fs.defaultFS
设置了Hadoop配置的maincontainer
设置HDInsight实例。
有两种方法可以满足您的需求。
使用类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
值,如果fs.defaultFS
属性core-site.xml
中未标记为<final>true</final>
。首先,您需要转到/etc/hadoop/conf
进行更改。
请参阅类似的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>")
希望它有所帮助。