我们有一个 Azure Hadoop HDI 系统,其中大部分文件都存储在 Azure 存储帐户 Blob 中。从 Hadoop 访问文件需要 WASBS:// 文件系统类型。
我想将 SQL 2016 Polybase 配置为将计算下推到 HDI 群集,以对存储在 Azure blob 中的数据进行某些查询。
可以在 Polybase 中使用 Hadoop 之外的 Azure Blob。我完全理解查询提示“选项(FORCE EXTERNLPUSHDOWN)”在 Blob 系统上不起作用。
是否可以配置外部数据源以使用 HDI 在 blob 上进行计算?
一个典型的外部数据源配置是:
CREATE EXTERNAL DATA SOURCE AzureStorage with (
TYPE = HADOOP,
LOCATION ='wasbs://clustername@storageaccount.blob.core.windows.net',
CREDENTIAL = AzureStorageCredential
);
我相信只要 WASBS 在那里,下推计算就不会起作用。
如果我将上面的内容更改为使用 HDFS,那么我当然可以指向我的 HDI 集群,但是 EXTERNAL TABLE 的 LOCATION 会是什么?
如果这是在 WASBS 中,那么如何在 HDFS 中找到它?LOCATION='/HdiSamples/HdiSamples/MahoutMovieData/'
当然,有一种方法可以让 Polybase 将计算下推到文件位于 WASBS 中的 HDI 集群。如果不支持,则 Polybase 不支持最常用和推荐的设置 HDI 的方法。
我知道以上内容需要考虑很多,我们将不胜感激。如果你真的确定这是不可能的,就回答 NO。请记住,尽管我意识到在 Azure Blob 上直接运行的 Polybase 无法下推计算。我希望 Polybase 连接到 HDI 并让 HDI 在 blob 上进行计算。
编辑
请考虑使用 HDI 在 Azure 中进行以下设置。
请注意,默认的 Hadoop 文件系统是 WASBS。这意味着使用 /HdiSamples/HdiSamples/MahoutMovieData/user-ratings.txt 等相对路径将解析为 wasbs://YourClusterName@YourStorageAccount.blob.core.windows.net/HdiSamples/HdiSamples/MahoutMovieData/user-ratings.txt .
CREATE EXTERNAL DATA SOURCE HadoopStorage with (
TYPE = HADOOP,
LOCATION ='hdfs://172.16.1.1:8020',
RESOURCE_MANAGER_LOCATION = '172.16.1.1:8050',
CREDENTIAL = AzureStorageCredential
);
CREATE EXTERNAL TABLE [user-ratings] (
Field1 bigint,
Field2 bigint,
Field3 bigint,
Field4 bigint
)
WITH ( LOCATION='/HdiSamples/HdiSamples/MahoutMovieData/user-ratings.txt',
DATA_SOURCE = HadoopStorage,
FILE_FORMAT = [TabFileFormat]
);
Hadoop 中的文件中有很多行。然而,这个查询返回 0。
select count(*) from [user-ratings]
当我检查远程查询执行计划时,它显示:
<external_uri>hdfs://172.16.1.1:8020/HdiSamples/HdiSamples/MahoutMovieData/user-ratings.txt</external_uri>
请注意,URI 是绝对路径,并根据外部数据源设置为 HDFS。
查询成功并返回零,因为它正在查找 HDFS 文件系统中不存在的文件/路径。如果没有表,则不返回“找不到表”。这是正常的。不好的是真正的表存储在 WASBS 中并且有很多行。
这意味着当使用 Azure Blobs 作为 Hadoop 默认文件系统时,不支持下推计算。推荐的设置是使用 Azure Blob,以便存储与计算分开。PolyBase 不支持这种设置是没有意义的,但截至目前它似乎不支持它。
如果我错了,我会留下这个问题。我真的想错了。