从c#(hdinsight)中的hive流脚本访问文件

eanckbw9  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(334)

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

8ehkhllq

8ehkhllq1#

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

相关问题