The SQL query engine Trino (formerly PrestoSQL) recaps a decade of innovation

96 points by simpligility 2 years ago | 66 comments
  • gavinray 2 years ago
    I recently had to write SQL query generation for AWS Athena, which is based off Presto 0.217

    It turns out that the dialect doesn't support LATERAL joins with a LIMIT in them. The below query only works if you remove the LIMIT clause.

    https://i.stack.imgur.com/rdB1s.png

    This makes saying things like "Fetch all artists where ..., for each artist fetch their first 3 albums where ..., and for each album fetch the top 10 tracks where ..." really difficult

    Does Trino support this out of curiosity?

    • jjoonathan 2 years ago
      AWS Athena: selling a buggy, old, stale copy of someone else's work (Presto / Trino) for high prices and getting away with it because you control the platform.

      If that's not peak Amazon, I don't know what is.

      • RobinL 2 years ago
        I think many users just see they can execute a query on huge data cheaply and incredibly quickly and are delighted. That's certainly my experience.

        It's one of the backends available in Splink, our FOSS record linkage software and it's revolutionary how it allows users to execute large scale probabilistic record linkage ridiculously cheaply. It wasn't long ago you needed very expensive proprietary software plus a big on prem cluster, costing in the hundreds of thousands, to achieve this.

        A lot of the magic for me is on the infrastructure side: how they can read/write large datasets from s3 so quickly, so the value isn't just in the SQL engine.

        • jfim 2 years ago
          The biggest value for corporate users is that they get everything already included as part of their existing cloud agreement.

          Adding a new vendor to the mix needs to involve procurement, the legal team, vendor negotiations, while using a new AWS feature is just a matter of using it, even if it's not as good as the original ISV's version and doesn't support the long term viability of the project.

          • pbronez 2 years ago
            Splink looks cool. I'm familiar with Tamr and Senzing, but this is the first FOSS option I've come across.
            • jjoonathan 2 years ago
              Yes, it's good to be platform king. We know. Low friction for you, high friction for everyone else.
            • dmitrykoval 2 years ago
              other arguments aside .. Athena costs $5 per 1TB scanned and also supports predicates pushdown to S3 Select. I wouldn't call this expensive, at least in comparison to self hosted Presto.
              • hashhar 2 years ago
                At a certain scale it does become very expensive. It's easy math.

                When your monthly Athena bill crosses whatever it would cost to have 5 or 10 EC2 machines it'll be cheaper to use Trino. At my previous workplace we moved from ~$40,000/month to ~$18,000/month by replacing Athena.

                Athena is a very good tool to start with - unless you have super large scale you'll probably not outgrow it. But when you do there's Trino.

                I do contribute to Trino - although I was merely a user when that cost reduction happened.

              • lopatin 2 years ago
                Can’t you say the same thing for EC2 but with Linux instead of Presto? Personally I like Athena. The fact that it’s in the Amazon platform and managed is a plus for me.
                • jjoonathan 2 years ago
                  EC2 involved substantial VM management and networking innovations that I respect. Ditto lambda and S3. I would not categorize any of these as OSS flips in nearly the way that I would categorize Athena as an OSS flip.
                • mr_toad 2 years ago
                  Setting up and maintaining your own Trino cluster isn’t exactly trivial. You pay a premium for not having to do that.
                  • slt2021 2 years ago
                    AWS is just managed open source as a service
                  • hashhar 2 years ago
                    Works just fine in Trino.

                      trino> USE memory.default;
                      USE
                      trino:default> create table artist (artistid int);
                      CREATE TABLE
                      trino:default> create table album (albumid int, artistid int);
                      CREATE TABLE
                      trino:default> insert into artist values 1, 2;
                      INSERT: 2 rows
                      
                      Query 20220804_182827_00005_n4rat, FINISHED, 1 node
                      Splits: 19 total, 19 done (100.00%)
                      0.52 [0 rows, 0B] [0 rows/s, 0B/s]
                      
                      trino:default> insert into album values (11, 1), (12, 1), (21, 2);
                      INSERT: 3 rows
                      
                      Query 20220804_182857_00006_n4rat, FINISHED, 1 node
                      Splits: 19 total, 19 done (100.00%)
                      0.18 [0 rows, 0B] [0 rows/s, 0B/s]
                      
                      trino:default> select * from (select * from artist limit 2) a cross join lateral (select * from album where album.artistid = a.artistid limit 2);
                       artistid | albumid | artistid
                      ----------+---------+----------
                              1 |      12 |        1
                              1 |      11 |        1
                              2 |      21 |        2
                      (3 rows)
                      
                      Query 20220804_182930_00007_n4rat, FINISHED, 1 node
                      Splits: 41 total, 41 done (100.00%)
                      0.35 [8 rows, 232B] [22 rows/s, 661B/s]
                    • bitsondatadev 2 years ago
                      Check out this PR. I believe we may have tackled this one but you'd need to try it out on Trino: https://github.com/trinodb/trino/pull/1415
                    • stevenmih 2 years ago
                      Steven here, I'm Ahana CEO (Managed Service for Presto) and member of Linux Foundation's Presto Foundation Since you asked about an alternative to AWS Athena, we offer a free-forever in-VPC Managed Service for Presto on AWS, which keeps up with the latest Presto releases.

                      Note: the original Presto continues to run in production at Meta (fmr. Facebook), Uber, and recently ByteDance TikTok data platform talked about running 1M queries a day with tens of thousands of cores. Some reasons to stay with Presto: - Reliability and scalability per above - Cutting edge innovations only in later versions of Presto: multi-level caching (project RaptorX) to boost query performance by 10X+ and table scan improvements (project Aria) to name a few - Only PrestoDB is hosted by Linux Foundation, giving confidence to community users that future releases will remain open.

                      • bitsondatadev 2 years ago
                        • DataGeekette 2 years ago
                          Or possibly he is just passionate about a project that he believes in, just like others in the larger Presto / Trino community. Personally, I think both Ahana and Starburst have interesting takes on how to monetize the original Presto platform. And like many, many other data projects, there is room in the market for different platforms. Long gone are the days where everyone was just stuck with a single RDMBS to do everything!
                          • DataGeekette 2 years ago
                            But IMO, personal attacks seem pretty off topic for a thread about cool tech.
                        • karma_fountain 2 years ago
                          Is it possible to achieve this with a window function?
                          • gavinray 2 years ago
                            I found out it is! Kudos to this kind internet stranger for telling me:

                            https://stackoverflow.com/a/73129836/13485494

                            But man is it a huge PITA (especially when doing programmatic code generation of the SQL) compared to LATERAL joins

                            Someone familiar with the CockroachDB query planner showed me that a window function like this is what Cockroach turns LATERAL joins into for instance:

                                demo@127.0.0.1:26257/movr> explain select * from abc, lateral (select * from xyz where x = a limit 2);
                            
                                • filter
                                │ estimated row count: 1
                                │ filter: row_num <= 2
                                │
                                └── • window
                                    │ estimated row count: 2
                                    │
                                    └── • hash join
                                        │ estimated row count: 2
                                        │ equality: (x) = (a)
                                        │
                                        ├── • scan
                                        │     estimated row count: 6 (100% of the table; stats collected 2 minutes ago)
                                        │     table: xyz@xyz_pkey
                                        │     spans: FULL SCAN
                                        │
                                        └── • scan
                                                estimated row count: 1 (100% of the table; stats collected 3 minutes ago)
                                                table: abc@abc_pkey
                                                spans: FULL SCAN
                        • tekkertje 2 years ago
                          One of my favorite OSS projects! Probably the most flexible and fully featured distributed SQL query engine around. Congrats and looking forward to the next decade!
                        • skadamat 2 years ago
                          Big shout out to Brian Olsen from the Trino community (and Starburst) for helping the Trino community be successful

                          - https://github.com/bitsondatadev

                          - https://www.linkedin.com/in/bitsondatadev/

                          I recommend the Trino Slack for people not already in it: https://trino.io/slack.html

                        • bitsondatadev 2 years ago
                          btw, if you want to know the backstory on why Presto is now called Trino, here's the article:

                          https://trino.io/blog/2022/08/02/leaving-facebook-meta-best-...

                          • jerryjerryjerry 2 years ago
                            One of the features I'm interested in (or would like to have) from Trino or Presto is the workload management which can better manage different types of queries and allocate resources accordingly. This becomes important when more applications adopt Trino or Presto as a distributed SQL database/platform, where the impact from different queries or workloads can be mitigated, besides the dedicated resources (CPU, MEM, etc.) can be allocated to high priority workloads. I'm really wondering if/when such capabilities may be provided.

                            BTW, purely curiosity, I compared Trino with Presto from OSS point of view (https://ossinsight.io/analyze/prestodb/presto?vs=trinodb%2Ft...), both communities are still popular but Trino seems more active than Presto now. I also wonder if two communities may reunion someday again to really boost its impact (comparing to Spark community).

                            • bitsondatadev 2 years ago
                              For managing difrerent workloads, check out this blogs and this videos from Shopify, Salesforce, Goldman Sachs, and Electronic Arts, respectively:

                              - https://engineering.salesforce.com/how-to-etl-at-petabyte-sc... - https://shopify.engineering/faster-trino-query-execution-inf... - https://trino.io/episodes/33.html - https://www.youtube.com/watch?v=-5mlZGjt6H4

                              All use the Lyft "Presto but really Trino"-Gateway project to run different clusters to handle various workloads. They go into various details for how this is achieved.

                              https://github.com/lyft/presto-gateway

                              Regarding the Trino/Presto split. I recommend looking at this blog to better understand why these two communities aren't mergeing. TL;DR Presto is a Facebook-driven project that mainly considers running on the Facebook infrastructure. Trino is community-driven that works on running well with all clouds and common infasturcture in the Trino community which is why you see a higher velocity there.

                              https://trino.io/blog/2022/08/02/leaving-facebook-meta-best-...https://trino.io/blog/2020/12/27/announcing-trino.html

                              Soon we anticipate that Trino will become the common name in the community space but we'll always love the origins of the Trino project being Presto.

                              • ambigali 2 years ago
                                Ali here, with a perspective about the split. Disclosure - I work at Ahana and am an active member of the Presto Foundation. When I see things like this, it appears that Trino/Starburst wants to continue to push the narrative that Presto is a Facebook-driven project to keep the communities fractured which is pretty unfortunate. In reality, Presto is a community-based open source project housed under The Linux Foundation and has dozens of companies actively contributing to it and using it - Uber, Bytedance, Intel, Twitter, Tencent, and many more. There's no reason why the 2 communities can't coexist peacefully.

                                For all intents and purposes, both projects are active and lively. It seems that Trino is more focused on federation and building out connectors. Presto is more focused on being the engine for the data lake/lakehouse. Both projects are doing well and solving different problems. There's been a lot of innovative features in the Presto project over the last year that are only in Presto, like Presto-on-Spark, disaggregated coordinator, Project Aria, etc. In fact we just hosted a fantastic user conference a few weeks ago that showcased a lot of that innovation and how companies are using Presto at massive scale today (if interested, check out the sessions: https://www.youtube.com/watch?v=Gi8i7eHqwyw&list=PLJVeO1NMmy...)

                                Long story short, Presto is alive and well, is not solely backed by 1 company (quite the opposite of Trino/Starburst), and has a lot of tech innovation on the roadmap. We're excited about the future of Presto.

                                • jerryjerryjerry 2 years ago
                                  Yes, definitely it may help if going with multiple clusters, however, there are also many scenarios that we don't want to maintain multiple clusters. For example, when we come to a SaaS platform, multi-tenant is pretty typical where different tenants may have different workloads, and workload management would be needed for different users, or even within the same tenant. So the "built-in" workload management (besides other features for multi-tenant) would be a big plus.
                              • simpligility 2 years ago
                                Also just to note.. I am currently working on a refresh of Trino: The Definitive Guide .. and would love to see you all at Trino Summit in November.

                                https://trino.io/blog/2022/06/30/trino-summit-call-for-speak...

                                • mrwnmonm 2 years ago
                                  We are building a SaaS BI tool.

                                  To enable the users to connect to their databases... we have a form that collects the database credentials from the user, saves it in a secure way, and when the user writes or uses an SQL query, we establish a database connection right away (from our server), execute it, and return the results, and we keep the connection alive for like 15mins.

                                  But with serverless architecture, first query could go to instance 1, so instance 1 will establish a db connection, then the second query could go to instance 2, so instance 2 will establish another one. You could end up with a lot of unnecessary connections.

                                  If you use AWS RDS (for yourself), beside lambda for example, AWS have RDS Proxy to solve this problem.

                                  So I was thinking about using Trino like the RDS Proxy, but for more databases, and for our customers database, not ours. Is that doable with Trino?

                                  • dmead 2 years ago
                                    I do the support for my department's trino cluster. We move ~1tb (and growing) in ETL jobs and support interactive queries for the data scientists/analysts.

                                    It would be super good if you guys added big query write support. Its really annoying to have to run a hive cluster in google to act as a proxy for this.

                                    • hashhar 2 years ago
                                      BigQuery very recently announced their Storage Write API which is one of the ways we were looking to implement this but there are some issues with the latency and consistency guarantees that it offers.

                                      But, yes, we do plan to add that eventually after ironing out all the kinks. See https://github.com/trinodb/trino/pull/13094

                                    • atwebb 2 years ago
                                      Any chance you have an overview of the architecture and operations support required? How many data sources are you pinging?
                                      • dmead 2 years ago
                                        like 20 different sources.

                                        I nag my service reps about it. I"m sure it's been filed in your jira.

                                    • georgewfraser 2 years ago
                                      The thing I wonder about with Presto and to a lesser extent Spark is, how many of their users adopted this tool because it was an easy migration path from Hive, and how many of those users will eventually re-platform to something else?
                                      • bitsondatadev 2 years ago
                                        I mean, the hive migration path is one thing. Now that Iceberg is taking over the old Hive model, data lakes are all the rage again.

                                        The other thing I would say is that Trino and Presto are not one-trick ponies or just hive replacements. There's also the ability to query across multiple systems that is, to me, the feature that future proofs a lot of architectures. It inherently frees you up to fiddle with your data in different systems but keep the access to that system in one location.

                                        • georgewfraser 2 years ago
                                          Yeah I think that is the key question: will data lakes become the dominant paradigm? There is certainly a lot of talk around them, though I see a ton of companies are still just going all in on a conventional data warehouse, but they tend not to talk about it because it’s not a new or interesting thing to do.
                                          • bitsondatadev 2 years ago
                                            Yeah, though a lot of Fivetran customers are likely the type that would go all in on paying for a conventional data warehouse where people using open source stacks may be the ones that are using open ingestion alternatives.

                                            We see a pretty even mix from the Trino/Starburst lens. Bigger companies like to mix and match.

                                      • simpligility 2 years ago
                                        Also working on a new edition for Trino: The Definitive Guide at the moment.
                                        • QuotedAtoms 2 years ago
                                          Can anyone clarify the differences between Trino and SparkSQL? Our company has used SparkSQL to aggressively replace use-cases that were based on PrestoSQL in the past.
                                          • ergocoder 2 years ago
                                            I can chime in in an okayish useful manner.

                                            Apart from implementation details, probably not much different. It is similar to mysql vs postgresql. You are probably okay with either.

                                            • hashhar 2 years ago
                                              I must disclaim that I contribute to Trino.

                                              I agree but it depends a bit on what purpose you are using them for. If you mainly use the tool to JOIN some data in bulk and then write output somewhere else (i.e. ETL) - either will serve you fine.

                                              If you write complex queries with multiple filters and want to JOIN across multiple datasets - sure Spark can do that as well but it's not as efficient in pushing down computation to the source.

                                              e.g. A query like SELECT c.custkey, sum(totalprice) FROM orders o INNER JOIN customer c ON o.custkey = c.custkey WHERE o.orderstatus = 'O' GROUP BY c.custkey; when ran on Spark will pull both tables into memory and then perform the join + filter for orderstatus = 'O' and then compute the sum.

                                              While in case of Trino it'll push down the entire query into the remote database (in this case, in other queries it'll push down some parts of the query) so the source database will not need to return gigabytes of data over the network every time the query runs (and hence finish faster as well).

                                              Trino tries to push-down some operations to the remote system which can be done more efficiently there. e.g. filtering on a column that has an index in the remote RDBMS will be faster than pulling all data and then filtering in Trino. Spark doesn't have strong pushdown and has to pull most of the raw data and then apply processing on top of it.

                                              That's one of the main differences. Spark is a distributed job execution framework first while Trino is a distributed federated query engine first and it shows in their strengths and weaknesses.

                                              If you want to run arbitrary user defined transformations on data then Spark definitely has much more to offer than Trino.

                                          • simpligility 2 years ago
                                            Its great to see how far the project has come from the humble beginnings to the current, rich open source ecosystem and community.
                                            • ck_one 2 years ago
                                              Can Trino be used as a Snowflake replacement? How is the query speed compared to Snowflake?
                                              • cpard 2 years ago
                                                Hey ck_one that's a hard question to answer and not get into "benchmarketing" territory.

                                                My suggestion is to try both under your own workloads and see the difference. Trino is also used by products like Athena (AWS) and Galaxy (Starburst) so if you want to play around and see how Trino performs without spending too much time on setting up clusters on your own, you can try these great products.

                                                Having said that, I'd like to add that building a performant distributed query engine is just hard. Trino has been in development for ten years and used by major companies in very demanding environments, these environments is where the technology has been defined and makes it what it is today and it is a proof of its performance and stability.

                                                (edited to add an important disclaimer that I work at Starburst)

                                                • simpligility 2 years ago
                                                  Also with Iceberg or Delta Lake and Trino you can basically run a full lakehouse architecture on open source and places like Bloomberg, Goldman Sachs and many others do just that.

                                                  https://trino.io/users.html

                                                  • dominotw 2 years ago
                                                    Not sure if those are comparable 1:1. Do you mean you have a datalake that you are using snowflake to query using 'external tables' that you want to replace with trino ?
                                                    • chrsig 2 years ago
                                                      i can't speak to trino, but with my experience with aws athena and snowflake, they're roughly on par with each other across the board.
                                                      • simpligility 2 years ago
                                                        Yes ... Starburst Enterprise, which is a commercial distribution of Trino, can in fact also query Snowflake, but also Delta Lake and many many other systems at the same time.
                                                        • dominotw 2 years ago
                                                          hey do you work for the company. Prbly add a disclaimer.
                                                          • simpligility 2 years ago
                                                            Yes... where would I put the disclaimer?
                                                      • tzury 2 years ago
                                                        Trino vs ClickHouse, can anyone tell from experience how those two compare?
                                                        • bitsondatadev 2 years ago
                                                          Clickhouse is a realtime system where Trino is a batch-oriented system. There are tradeoffs for doing realtime vs batch.

                                                          Realtime is generally more expensive to run as you process every individual row as it comes, batch is when you can deal with minute latency and want to handle a lot of data in chunks.

                                                          Trino is also a query engine rather than a database and it connects to many different systems: https://trino.io/docs/current/connector.html

                                                          It also happens to connect to Clickhouse and it's very common that people will use Trino to query clickhouse realtime data and join it with data in big query, an object store data lake, or Snowflake: https://trino.io/docs/current/connector/clickhouse.html

                                                          • qoega 2 years ago
                                                            You can consider that ClickHouse allows both to query a lot of supported external data sources(s3/hdfs/mysql/postgre/...) and to store data in pretty efficient columnar way with compression, indexes and all the bells and whistles. Native storage allows to use all the information about keys/indices to build query plan faster. With trino you can't store data inside trino. You can't even insert data using trino which allows you to solve scenarios like 'readonly analytics'. Trino allows you to use single query language for all the supported systems. So if you have a zoo of DBMS and object storages that you can just query it can help you to hide this complexity.
                                                            • 2 years ago
                                                            • kache_ 2 years ago
                                                              trino is awesome

                                                              can't believe this shit is free as in freedom

                                                              • mrwnmonm 2 years ago
                                                                Can you use Trino as a database proxy?
                                                                • simpligility 2 years ago
                                                                  Essentially yes ... it can be the query engine for many databases at the same time.