我们有一个azure hadoop hdi系统,其中大多数文件存储在一个azure存储帐户blob中。从hadoop访问文件需要wasbs://文件系统类型。
我想配置SQL2016Polybase,以便将计算下推到hdi集群,以查询存储在azure blob中的某些数据。
可以在polybase中使用hadoop之外的azure blob。我完全理解查询提示“option(force externalpushdown)”在blob系统上不起作用。
是否可以将外部数据源配置为使用hdi在blob上进行计算?
典型的外部数据源配置是:
CREATE EXTERNAL DATA SOURCE AzureStorage with (
TYPE = HADOOP,
LOCATION ='wasbs://clustername@storageaccount.blob.core.windows.net',
CREDENTIAL = AzureStorageCredential
);
我相信只要wasbs还在里面,下推计算就不会工作。
如果我将上述内容更改为使用hdfs,那么我当然可以指向我的hdi集群,但是外部表的位置是什么?
如果这是在wasbs中,那么如何在hdfs中找到它呢?location='/hdisamples/hdisamples/mahoutmoviedata/'
当然,有一种方法可以让polybase将compute下推到文件位于wasb中的hdi集群。如果不支持,则polybase不支持最常见和推荐的hdi设置方法。
我知道以上是很多考虑和任何帮助是感激的。如果你真的确定这是不可能的,只需回答“不”。请记住,尽管我意识到polybase直接在azure blob上操作不能下推计算。我希望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文件系统中不存在的文件/路径。“如果没有表,则不返回“找不到表”。这很正常。糟糕的是,真正的表存储在wasb中,并且有很多行。
这意味着当使用azure blob作为hadoop默认文件系统时,不支持下推计算。建议的设置是使用azure blob,以便存储与计算分离。polybase不支持此设置毫无意义,但到目前为止,它似乎不支持此设置。
万一我错了,这个问题我就不提了。我真的想犯错。
1条答案
按热度按时间avwztpqn1#
如果希望polybase将计算下推到任何hadoop/hdi集群,则需要在创建外部数据源时指定资源管理器的位置。资源管理器位置告诉SQLServer在何处提交mr作业。