0

我正在使用 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 文件。

谢谢

4

1 回答 1

0

“添加文件”应该足够了。它将 dll 复制到工作文件夹中,并且应该可用于您的脚本。Microsoft.WindowsAzure.Storage.dll 有自己的依赖项。我相信 OData.dll 和 edm.dll。确保添加文件的所有依赖项,否则将无法加载。

于 2013-07-24T16:26:43.100 回答