我正在使用hive流式处理作业来处理c#on hdinsight中的一些数据。为了处理数据,脚本必须读取存储为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/然后在配置单元门户中执行“添加文件”。
如果我尝试这样访问文件:
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文件。
谢谢
1条答案
按热度按时间8ehkhllq1#
“添加文件”就足够了。它会将dll复制到工作文件夹中,并且应该对您的脚本可用。microsoft.windowsazure.storage.dll有自己的依赖项。我相信odata.dll和edm.dll。确保添加文件的所有依赖项,否则将无法加载。