如何使用不同的帐户将存储容器添加到 Azure?

Posted

技术标签:

【中文标题】如何使用不同的帐户将存储容器添加到 Azure?【英文标题】:How can I add a storage container to Azure with different account? 【发布时间】:2015-07-30 20:35:39 【问题描述】:

我们正在尝试为多个 Outlook 帐户使用公共数据。假设数据存储在属于 data@outlook.com 的容器中,我想将其读取为 datasc1@outlook.com,我的朋友想从 datasc2@outlook.com 读取。

我有通用帐户的存储帐户名称、容器名称(这是公共容器),但是当我尝试使用 Hive 读取数据时,使用以下命令:

CREATE EXTERNAL TABLE deneme (t1 string, t2 string) ROW FORMAT DELIMITED FIELDS TERMINATED BY '|' STORED AS TEXTFILE LOCATION 'wasb://container@storageaccount.blob.core.windows.net/OUR_DATA.txt';

或者我也试试下面的命令

CREATE EXTERNAL TABLE deneme (t1 string, t2 string) ROW FORMAT DELIMITED FIELDS TERMINATED BY '|' STORED AS TEXTFILE LOCATION 'wasb://container@storageaccount.blob.core.windows.net/OUR_DATA.txt?sig=ACCESS_KEY_OF_CONTAINER';

我收到以下错误:

FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. MetaException(message:Got exception: org.apache.hadoop.fs.azure.AzureException Uploads to to public accounts using anonymous access is prohibited.)

我们尝试了一些方法,我们将容器类型设置为“Public Blob”,但它不起作用。我们将帐户添加到存储帐户默认目录中,但它也不起作用。我尝试用 PIG 加载数据,它似乎可以工作,但是当我转储时,PIG 也失败了。

对我来说很奇怪的是,当我在 Hadoop 命令行上运行以下代码时,它运行良好:

hadoop fs -lsr wasb://container@storageaccount.blob.core.windows.net/

输出是:

lsr: DEPRECATED: Please use 'ls -R' instead.
-rwxrwxrwx   1  145391417 2015-05-18 10:58 wasb://container@storageaccount.blob.core.windows.net/OUR_DATA.txt
-rwxrwxrwx   1   25634418 2015-05-18 10:44 wasb://container@storageaccount.blob.core.windows.net/OUR_OTHER_DATA.txt

总结我们的问题是使用我们的 Azure 帐户从另一个 Azure 帐户读取数据,使用 HDInsight (Hive/PIG/Hadoop)。

【问题讨论】:

【参考方案1】:

如果您只指向文件夹而不是特定文件,它是否有效? Hive 期望位置是文件夹路径,而不是特定文件。

CREATE EXTERNAL TABLE deneme (t1 string, t2 string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '|' 
STORED AS TEXTFILE
LOCATION 'wasb://container@storageaccount.blob.core.windows.net/';

我能够针对配置为“公共容器”的容器创建类似的外部表。

如果您不想使用公共容器,可以直接在 Hive 脚本中将存储密钥包含在配置变量中,例如:

set fs.azure.account.key.storageaccount.blob.core.windows.net=ACCESS_KEY_OF_CONTAINER;

或者,您可以使用自定义创建向导的其他存储帐户部分,或使用Add-AzureHDInsightStorage cmdlet 修改集群配置,在配置时配置集群以访问存储帐户在创建集群之前。

这篇文章有一堆关于HDInsight和Azure Blob Storage交互的相关资料:http://azure.microsoft.com/en-us/documentation/articles/hdinsight-hadoop-use-blob-storage/

【讨论】:

工作得很好,但我对此还有一个问题。正如我在上面的问题中所写,我的文件夹中有两个文件。 hive如何选择正确的文件?还是只是将两个文件连接到一个外部表中?因为我需要它们作为单独的表。 这个问题有一些关于将每个文件分开的选项的详细信息:***.com/questions/11269203/… INPUT__FILE__NAME 虚拟列将具有源文件的完整 wasb URI,所以如果你想做一个完全匹配,您必须执行以下操作:select * from deneme WHERE INPUT__FILE__NAME='wasb://container@storageaccount.blob.core.windows.net/OUR_DATA.txt';【参考方案2】:

我通过在 core-site.xml 中添加下面提到的属性解决了这个问题

<property>
        <name>fs.azure.account.key.<storage account name>.blob.core.windows.net</name>
        <value><account key value></value>
</property>

现在,从 azure 门户 转到 Storage 帐户并将访问类型更改为“container”(默认为“private”)

【讨论】:

以上是关于如何使用不同的帐户将存储容器添加到 Azure?的主要内容,如果未能解决你的问题,请参考以下文章

我们如何将 azure 存储帐户表复制到另一个存储帐户?

Azure:使用容器创建存储帐户并在 Python 中将 blob 上传到其中

Azure 存储帐户 - 容器级访问和 ACL

将 Parquet 文件从 Azure 数据湖存储帐户复制到 Synapse 数据仓库表失败

我们可以使用 Azure Active Directory 提供对 blob/容器/存储帐户的访问吗?

如何将所有文件从 blob 存储容器导入和处理到 azure databricks