我正在使用 Hive 流作业在 HDInsight 上处理 C# 中的一些数据。为了处理数据,脚本必须读取在 Azure 上存储为 blob 的 xml 文件,如下所示:
OperationContext oc = new OperationContext();
CloudStorageAccount account = new CloudStorageAccount(new StorageCredentials(asvAccount, asvKey), true);
CloudBlobClient client = account.CreateCloudBlobClient();
CloudBlobContainer container = client.GetContainerReference("myContainer");
CloudBlockBlob blob = container.GetBlockBlobReference("file/f.xml");
MemoryStream stream;
using (stream = new MemoryStream())
{
blob.DownloadToStream(stream);
stream.Seek(0, SeekOrigin.Begin);
string reader = new StreamReader(stream).ReadToEnd();
elem = XElement.Parse(reader);
return elem;
}
该代码在我的本地计算机上运行:它从存储帐户读取文件并正确返回 elem,但是当我尝试在集群上运行它时,即使我通过添加它,它也无法找到 Microsoft.WindowsAzure.Storage.dll fs.put() 到 /Hive/Resources/ 然后在 hive 门户中执行“添加文件”。
如果我尝试像这样访问文件:
XElement.Load("hdinsighttesting.blob.core.windows.net/repexdeema/pr/productGuidMapping.xml");
或者
XElement.Load("asv://myContainer@myCluster.blob.core.windows.net/file/f.xml"); then I get the following error:
Could not find a part of the path 'c:\hdfs\mapred\local\taskTracker\admin\jobcache\job_201307200714_0079\attempt_201307200714_0079_m_000000_0\work\storageAccount.blob.core.windows.net\myContainer\pr\productGuidMapping.xml
我不明白为什么它坚持在那个目录中查找,而不是直接进入 blob 存储。我试图去那个目录,但它不存在。
我也想过使用 LocalResource ,但在我的情况下这是不可能的,因为 Hive 拒绝找到我上传到 hdfs 的 dll 文件。
谢谢