如何使用不同的帐户将存储容器添加到 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:使用容器创建存储帐户并在 Python 中将 blob 上传到其中
将 Parquet 文件从 Azure 数据湖存储帐户复制到 Synapse 数据仓库表失败