presto 是不是需要配置单元元存储才能从 S3 读取镶木地板文件?

Posted

技术标签:

【中文标题】presto 是不是需要配置单元元存储才能从 S3 读取镶木地板文件?【英文标题】:Does presto require a hive metastore to read parquet files from S3?presto 是否需要配置单元元存储才能从 S3 读取镶木地板文件? 【发布时间】:2017-09-29 09:23:44 【问题描述】:

我正在尝试使用 spark 在 S3 文件中生成 parquet 文件,目的是稍后可以使用 presto 从 parquet 进行查询。基本上,它的样子,

Kafka-->Spark-->Parquet<--Presto

我可以使用 Spark 在 S3 中生成镶木地板,并且工作正常。现在,我正在查看 presto,我想我发现它需要 hive 元存储才能从 parquet 查询。即使 parquet 保存了架构,我也无法快速读取我的 parquet 文件。那么,这是否意味着在创建 parquet 文件时,spark 作业也必须将元数据存储在 hive 元存储中?

如果是这样,有人可以帮我找到一个如何完成的示例。为了增加这个问题,我的数据模式正在改变,所以为了处理它,我在 spark 作业中创建了一个编程模式,并在创建镶木地板文件时应用它。而且,如果我在 hive 元存储中创建模式,则需要考虑到这一点。

或者,如果有更好的替代方法,你能解释一下吗?

【问题讨论】:

"我的数据架构正在改变" -- 您添加 文件并修改架构,或者您覆盖 新架构中的新文件的所有文件? @PiotrFindeisen 我不确定我是否关注它,但我的用例是数据模式正在发生变化,因此意图是使用新模式生成新的镶木地板文件并更新配置单元元存储模式。 旧文件呢?新文件是否只是数据的一部分(所以旧文件和新文件一起构成一个表)?还是新文件替换旧文件(因此新架构取代旧架构)? 【参考方案1】:

您将 Parquet 文件保存在 S3 上。 Presto 的 S3 功能是 Hive 连接器的子组件。正如您所说,您可以让 Spark 在 Spark 中定义表,也可以使用 Presto 来实现,例如

create table hive.default.xxx (<columns>) 
with (format = 'parquet', external_location = 's3://s3-bucket/path/to/table/dir');

(根据 Hive 元存储版本及其配置,您可能需要使用 s3a 而不是 s3。)

从技术上讲,应该可以创建一个从 Parquet 标头推断表模式的连接器,但我不知道现有的连接器。

【讨论】:

感谢您的建议。我试图做同样的事情,但我面临的挑战是,我找不到一种方法来更新配置单元元存储模式并同时将文件生成到 s3。基本上,我找不到一个直接的方法来一次性完成这两项工作。我在 spark 中找到了这个 api,createExternalTable(),但没有太多关于它的文档。

以上是关于presto 是不是需要配置单元元存储才能从 S3 读取镶木地板文件?的主要内容,如果未能解决你的问题,请参考以下文章

无法从 sparksql 连接配置单元元存储 [重复]

查询远程配置单元元存储以获取表列表

Presto 和 Hive

Presto 无法查询配置单元表

Presto 和 hive 分区发现

无法使用 CSV 文件中的 Presto 创建 Hive 表