使用不同的帐户向Azure添加存储容器?

时间:2015-05-19 06:42:08

标签: azure hive azure-storage azure-storage-blobs hdinsight

我们正在尝试为多个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)。

提前致谢。

2 个答案:

答案 0 :(得分:4)

如果只指向文件夹而不是特定文件,它是否有效? 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存储之间交互的相关信息:http://azure.microsoft.com/en-us/documentation/articles/hdinsight-hadoop-use-blob-storage/

答案 1 :(得分: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 portal 转到存储帐户,并将访问类型更改为“容器”(默认情况下为“私有”)