Facebook PrestoDB

您是否应该考虑使用Presto查询Hadoop?介绍
本文旨在回答我们问自己的3个问题:
·PrestoDB可以替代ApacheImpala吗?
·为什么?
·Presto比Impala更好吗?
在本文中 , 我将根据发现的相关参数检查PrestoDB , 并在摘要中回答以上每个问题 。 什么是Presto?
Presto是一个开放源代码的分布式SQL查询引擎 , 用于对大小从GB到PB的各种数据源运行交互式分析查询 。
它是在Facebook上开发的 , 他们在生产中使用了它 , 以及Airbnb , Dropbox , Netflix , Uber , AWS(EMR和AmazonAthena)以及更多知名企业 。 文献资料
Presto的官方网站上有不错的文档 , 但没有Cloudera网站上的Impala文档那么详细 。 该代码比Impala的代码要少得多 。 社区
由于Presto已在许多大型互联网公司中使用 , 因此存在一个相当不错的社区:
·Github上有7.2k星(Impala则为2k)
·Google取得83k的搜索结果(Impala则为186k)
·3.2kStackoverflow问题(Impala则为2.6k)
·在db-engines人气排名中排名第126(与Impala相比排名第33)
我们仍然可以看到 , 虽然Presto在github上更受欢迎 , 但根据db-engines(根据Google趋势 , Impala拥有更多的Google搜索结果和更受欢迎的排名)(考虑到Google趋势 , 相关的工作机会数量 , linkedin提及 , 推文和技术讨论)) 。
更新(感谢JamesTaylor的评论):Impala是一个Apache项目 , 因此活动在Apache开发人员和用户邮件列表中进行 。 该项目仅镜像到Github , 因此用户通常不会在镜像上加注星标 。 支持
当前 , 对Presto唯一可靠的企业支持是由一家名为Starburst的公司提供的 , 该公司也为Presto的代码做出了贡献 , 并在Presto官方网站上推荐使用 。 Presto架构
Presto有2个主要组件:协调器和工作器 。
与ApacheImpala不同 , 虽然每个集群都可以配置多个协调器 , 但通常每个集群不使用多个协调器 。
架构很简单:
Facebook PrestoDB
文章图片
协调器由3个组件组成:解析器 , 计划器和调度器 。
它与Impala非常相似 , 因为它们都基于GoogleDremel 。
Presto的连接器为解析器提供元数据API , 为调度程序提供数据位置API , 为工作人员提供数据流API , 以便在多个数据源之上执行查询 。 单个查询可以从多个来源读取数据-这是Presto的主要优势 , 它具有超强的可插拔性 。 Hadoop集成—Hive连接器
Hive连接器允许查询存储在HDFS中并与HiveMetastore映射的数据 。
很明显 , 但是执行引擎不是ApacheHive或MapReduce , 而是Presto 。
支持的文件类型为:ORC , ApacheParquet , Avro , RCFile , SequenceFile , JSON , 文本 。
它支持ApacheHadoop2.x和CDH4和5 。 但是Cloudera在ClouderaManager中不支持Presto(因为它们具有Impala) 。
由于Presto可插拔 , 因此可以配置多个Hadoop集群进行查询 。 元数据缓存机制
Presto具有元数据缓存机制 , 该机制的文档非常少 , 并且在Web上并未真正讨论 。 我将在这里写下我发现的内容以及对我的理解 。
Presto的元数据缓存位于协调器中 , 因此 , 如果用户仅通过Presto更改对象 , 就不会遇到缓存一致性问题 。 但是 , 如果用户还通过Hive更改了元存储中的对象 , 那么它将遭受不一致的困扰 , 直到刷新发生为止 。
Presto没有Impala所拥有的REFRESH语句 , 而是在Hive连接器属性文件中有2个参数:
·hive.metastore刷新间隔
·hive.metastore-cache-ttl
这意味着对于缓存中的每个条目 , 刷新每X次发生一次 , 并且在Y次之后刷新会从缓存中逐出 。 在0.174版中 , 这些参数的默认值设置为0 , 以"禁用跨事务元数据缓存" 。
存在刷新间隔和缓存超时的事实有其优点和缺点:
优点:
·不需要像Impala中那样的元数据刷新管理 。
·如果将刷新间隔配置为较小的值 , 则元数据缓存可能不会出现不一致问题 。
·cache-ttl参数是解决当前Impala中元数据爆炸(主题大小)问题的好方法 。
缺点:
·刷新可能很繁琐 , 而不必要的刷新可能会成为瓶颈 , 也许自己执行刷新是更有效的解决方案 。
·在Impala2.7中 , 刷新可以在特定的分区上进行 , 因此 , 它比对整个表的刷新要轻得多 。 我不知道Presto中的刷新是否有效 。
·cache-ttl参数可能会导致经常使用的元数据从缓存中逐出 。 但是它可能在版本0.154中得到了修复 , 并且在每次查询后都将重置缓存超时 。 这意味着缓存条目可能永远不会过期(如果这样做的话 , 那是个好习惯 , 因为它们经常被使用)
Presto元数据缓存采用基于Guava的LRU缓存 , 其默认过期时间为1h , 默认最大条目为10,000(可调) 。 如果我们想进一步了解Presto的元数据缓存机制 , 可以阅读Guava缓存 。
就像我说的那样 , 关于此主题的文档不多 , 甚至我所谈论的两个参数都没有在Presto网站上记录 , 我在网上的讨论中发现了它们 。 Parquet
Presto有2个parquet阅读器 , 第一个由Presto团队开发 , 第二个在0.138版本中添加 , 是在Uber开发的 。
在Uber关于Presto和ApacheParquet的博客文章中 , 他们说他们选择Parquet作为其柱状格式以实现高性能 。 但是Presto的Parquet阅读器并没有充分利用Parquet的所有优势 , 而是他们自己编写了一个 。
【Facebook PrestoDB】UberParquet阅读器默认情况下未启用 , 可以通过config属性启用:hive.parquet-optimized-reader.enabled=true
新的Parquet阅读器的改进包括:
·嵌套列修剪
·列状读
·谓词下推
·字典下推式
·懒读
新型Presto阅读器的速度比原始阅读器快2-10倍 。
要启用Parquet谓词下推 , 有一个配置属性:hive.parquet-predicate-pushdown.enabled=true
在我们去过的一次AWS会议上 , Presto推荐的文件格式是Parquet , 所以我认为Presto总体上针对Parquet格式进行了优化 。 杠杆统计
当前 , 唯一支持统计信息的连接器是Hive连接器 。
如果可用 , Presto将利用Hive的表统计信息 , 并且无法在Presto本身中计算统计信息(与Impala不同) 。 通过Hive收集表统计信息 。
Parquet格式中包含列级统计信息 , 新的Parquet阅读器正在利用它们进行谓词/词典下推和惰性读取 。 数据局部性
当工作程序与HDFS数据节点安装在同一台计算机上时 , Presto可以支持数据本地化 。 如果您设置"node-scheduler.network-topology=flat" , Presto将尝试在具有数据的计算机上计划拆分 。 请参阅https://prestosql.io/docs/current/admin/properties.html#node-scheduler-network-topology
但重要的是要了解 , 数据局部性已不再是当今带宽(10GbE)的重要概念 。 我认为 , 至少在临时查询中 , 计算和存储应完全分开 。 因此 , 如果我们使用Presto , 它将位于专用于Presto的单独群集中 。 查询界面
要查询Presto , 可以使用JDBC/ODBC , 这意味着每种SQL客户端和编程语言都可以查询Presto 。
但是我认为分析人员应使用这些工具来查询Presto:
·DataGrip—出色的JetBrains产品 , 我们已经使用它来查询Impala 。
·Airpal—Airbnb在Presto之上构建的基于Web的查询界面工具 。 就我们的用例而言 , 它相当于Hue , 就我所见而言 , 它非常人性化 。 管理
如"Hadoop集成"部分所述 , Cloudera在其ClouderaManager中不支持Presto 。 因此 , 如果要使用Presto , 我们需要使用适当的管理工具 。
我发现用于Presto管理的2个主要工具是:
·PrestoWebUI:Presto提供了用于监视和挂起查询的Web界面 。 它基本上具有与ImpalaWebUI相同的功能并显示相同的数据(在协调器级别) 。
·PrestoAdmin:Presto建议使用此工具在群集上安装和管理Presto 。 它提供了易于使用的命令来:
·在整个群集中安装和卸载Presto
·配置您的Presto集群
·启动和停止Presto服务器
·从Presto集群中收集状态和日志信息摘要
Presto可以替代Impala 。 原因很简单:它是为与Impala完全相同的任务而设计的MPP引擎 , 并且拥有许多主要用户 , 包括Facebook , Airbnb , Uber , Netflix , Dropbox等 。 与Impala相比 , 它的主要优势在于它具有超级可插拔性 。
但是就Hadoop的性能而言-最新版本的Impala可能比Presto更好 。
在网上阅读了有关Presto的所有内容之后 , 我相信我们应该在半产品环境中对其进行正确的测试 , 并查看其实际性能 。
(本文翻译自AdirMashiach的文章《FacebookPrestoDB—FullReview》 , 参考:https://medium.com/@adirmashiach/facebook-prestodb-full-review-4ba59720a92)


    推荐阅读