From 6582c80067a523a32561528dcbf624ef41dbe7a2 Mon Sep 17 00:00:00 2001 From: Andy Grove Date: Thu, 30 May 2024 18:50:21 -0600 Subject: [PATCH] Update README to show current performance info --- README.md | 96 +++++++++++------- .../source/_static/images/tpch_allqueries.png | Bin 0 -> 23677 bytes .../_static/images/tpch_queries_compare.png | Bin 0 -> 27388 bytes .../_static/images/tpch_queries_speedup.png | Bin 0 -> 38821 bytes docs/source/contributor-guide/benchmarking.md | 85 +++++++++------- 5 files changed, 112 insertions(+), 69 deletions(-) create mode 100644 docs/source/_static/images/tpch_allqueries.png create mode 100644 docs/source/_static/images/tpch_queries_compare.png create mode 100644 docs/source/_static/images/tpch_queries_speedup.png diff --git a/README.md b/README.md index fb17535aa..30d94cbc9 100644 --- a/README.md +++ b/README.md @@ -19,58 +19,84 @@ under the License. # Apache DataFusion Comet -Apache DataFusion Comet is an Apache Spark plugin that uses [Apache DataFusion](https://datafusion.apache.org/) -as native runtime to achieve improvement in terms of query efficiency and query runtime. +Apache DataFusion Comet is a high-performance accelerator for Apache Spark, built on top of the powerful +[Apache DataFusion](https://datafusion.apache.org) query engine. Comet is designed to significantly enhance the +performance of Apache Spark workloads while leveraging existing commodity hardware and seamlessly integrating with the +Spark ecosystem without requiring any code changes. -Comet runs Spark SQL queries using the native DataFusion runtime, which is -typically faster and more resource efficient than JVM based runtimes. +# Benefits of Using Comet - +## Run Spark Queries at DataFusion Speeds -Comet aims to support: +Comet delivers a performance speedup for many queries, enabling faster data processing and shorter time-to-insights. -- a native Parquet implementation, including both reader and writer -- full implementation of Spark operators, including - Filter/Project/Aggregation/Join/Exchange etc. -- full implementation of Spark built-in expressions -- a UDF framework for users to migrate their existing UDF to native +The following chart shows the time it takes to run the 22 TPC-H queries against 100 GB of data in Parquet format +using a single executor with 8 cores. -## Architecture +When using Comet, the overall run time is reduced from 649 seconds to 440 seconds, which is 1.5x faster. -The following diagram illustrates the architecture of Comet: +When running DataFusion standalone (without Spark), the run time is 3.9x faster. - +Comet is not yet achieving full DataFusion speeds in all cases, but with future work we aim to provide a 2x-4x speedup +for many use cases. -## Current Status +![](docs/source/_static/images/tpch_allqueries.png) -The project is currently integrated into Apache Spark 3.2, 3.3, and 3.4. +Here is a breakdown showing relative performance of Spark, Comet, and DataFusion for each TPC-H query. -## Feature Parity with Apache Spark +![](docs/source/_static/images/tpch_queries_compare.png) -The project strives to keep feature parity with Apache Spark, that is, -users should expect the same behavior (w.r.t features, configurations, -query results, etc) with Comet turned on or turned off in their Spark -jobs. In addition, Comet extension should automatically detect unsupported -features and fallback to Spark engine. +The following chart shows how much Comet currently accelerates each query from the benchmark. Performance optimization +is an ongoing task, and we welcome contributions from the community to help achieve even greater speedups in the future. -To achieve this, besides unit tests within Comet itself, we also re-use -Spark SQL tests and make sure they all pass with Comet extension -enabled. +![](docs/source/_static/images/tpch_queries_speedup.png) -## Supported Platforms +These benchmarks can be reproduced in any environment using the documentation in the +[Comet Benchmarking Guide](https://datafusion.apache.org/comet/contributor-guide/benchmarking.html). We encourage +you to run your own benchmarks. -Linux, Apple OSX (Intel and M1) +## Use Existing Hardware -## Requirements +Comet leverages your existing hardware infrastructure, eliminating the need for costly hardware upgrades or +specialized hardware accelerators. By maximizing the utilization of commodity hardware, Comet ensures +cost-effectiveness and scalability for your Spark deployments. -- Apache Spark 3.2, 3.3, or 3.4 -- JDK 8, 11 and 17 (JDK 11 recommended because Spark 3.2 doesn't support 17) -- GLIBC 2.17 (Centos 7) and up +## Spark Compatibility -## Getting started +Comet aims for 100% compatibility with all supported versions of Apache Spark, allowing you to integrate Comet into +your existing Spark deployments and workflows seamlessly. With no code changes required, you can immediately harness +the benefits of Comet's acceleration capabilities without disrupting your Spark applications. -See the [DataFusion Comet User Guide](https://datafusion.apache.org/comet/user-guide/installation.html) for installation instructions. +## Tight Integration with Apache DataFusion + +Comet tightly integrates with the core Apache DataFusion project, leveraging its powerful execution engine. With +seamless interoperability between Comet and DataFusion, you can achieve optimal performance and efficiency in your +Spark workloads. + +## Active Community + +Comet boasts a vibrant and active community of developers, contributors, and users dedicated to advancing the +capabilities of Apache DataFusion and accelerating the performance of Apache Spark. + +## Getting Started + +To get started with Apache DataFusion Comet, follow the +[installation instructions](https://datafusion.apache.org/comet/user-guide/installation.html). Join the +[DataFusion Slack and Discord channels](https://datafusion.apache.org/contributor-guide/communication.html) to connect +with other users, ask questions, and share your experiences with Comet. ## Contributing -See the [DataFusion Comet Contribution Guide](https://datafusion.apache.org/comet/contributor-guide/contributing.html) -for information on how to get started contributing to the project. + +We welcome contributions from the community to help improve and enhance Apache DataFusion Comet. Whether it's fixing +bugs, adding new features, writing documentation, or optimizing performance, your contributions are invaluable in +shaping the future of Comet. Check out our +[contributor guide](https://datafusion.apache.org/comet/contributor-guide/contributing.html) to get started. + +## License + +Apache DataFusion Comet is licensed under the Apache License 2.0. See the [LICENSE.txt](LICENSE.txt) file for details. + +## Acknowledgments + +We would like to express our gratitude to the Apache DataFusion community for their support and contributions to +Comet. Together, we're building a faster, more efficient future for big data processing with Apache Spark. diff --git a/docs/source/_static/images/tpch_allqueries.png b/docs/source/_static/images/tpch_allqueries.png new file mode 100644 index 0000000000000000000000000000000000000000..a6788d5a402647856d59eab220c68b80b1a84e81 GIT binary patch literal 23677 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 Xlh?PuG~J4;z$tCb9U3>(t&jd+Y>naM literal 0 HcmV?d00001 diff --git a/docs/source/_static/images/tpch_queries_compare.png b/docs/source/_static/images/tpch_queries_compare.png new file mode 100644 index 0000000000000000000000000000000000000000..927680612fda7033541b09f9b158d2cc2e98e292 GIT binary patch literal 27388 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 Gm;VL$ZQ!r~ literal 0 HcmV?d00001 diff --git a/docs/source/_static/images/tpch_queries_speedup.png b/docs/source/_static/images/tpch_queries_speedup.png new file mode 100644 index 0000000000000000000000000000000000000000..fb417ff1db0f08ac92f69b1f084a15fde9147c97 GIT binary patch literal 38821 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 Y7*H}ec+^tKsFxxurEntQ*rnV511F5s9{>OV literal 0 HcmV?d00001 diff --git a/docs/source/contributor-guide/benchmarking.md b/docs/source/contributor-guide/benchmarking.md index 502b35c29..0d86e7692 100644 --- a/docs/source/contributor-guide/benchmarking.md +++ b/docs/source/contributor-guide/benchmarking.md @@ -19,44 +19,61 @@ under the License. # Comet Benchmarking Guide -To track progress on performance, we regularly run benchmarks derived from TPC-H and TPC-DS. Benchmarking scripts are -available in the [DataFusion Benchmarks](https://github.com/apache/datafusion-benchmarks) GitHub repository. +To track progress on performance, we regularly run benchmarks derived from TPC-H and TPC-DS. Data generation and +benchmarking documentation and scripts are available in the [DataFusion Benchmarks](https://github.com/apache/datafusion-benchmarks) GitHub repository. -Here is an example command for running the benchmarks. This command will need to be adapted based on the Spark -environment and location of data files. +Here are example commands for running the benchmarks against a Spark cluster. This command will need to be +adapted based on the Spark environment and location of data files. This command assumes that `datafusion-benchmarks` is checked out in a parallel directory to `datafusion-comet`. +## Running Benchmarks Against Apache Spark + ```shell -$SPARK_HOME/bin/spark-submit \ - --master "local[*]" \ - --conf spark.driver.memory=8G \ - --conf spark.executor.memory=64G \ - --conf spark.executor.cores=16 \ - --conf spark.cores.max=16 \ - --conf spark.eventLog.enabled=true \ - --conf spark.sql.autoBroadcastJoinThreshold=-1 \ - --jars $COMET_JAR \ - --conf spark.driver.extraClassPath=$COMET_JAR \ - --conf spark.executor.extraClassPath=$COMET_JAR \ - --conf spark.sql.extensions=org.apache.comet.CometSparkSessionExtensions \ - --conf spark.comet.enabled=true \ - --conf spark.comet.exec.enabled=true \ - --conf spark.comet.exec.all.enabled=true \ - --conf spark.comet.cast.allowIncompatible=true \ - --conf spark.comet.explainFallback.enabled=true \ - --conf spark.comet.parquet.io.enabled=false \ - --conf spark.comet.batchSize=8192 \ - --conf spark.comet.columnar.shuffle.enabled=false \ - --conf spark.comet.exec.shuffle.enabled=true \ - --conf spark.shuffle.manager=org.apache.spark.sql.comet.execution.shuffle.CometShuffleManager \ - --conf spark.sql.adaptive.coalescePartitions.enabled=false \ - --conf spark.comet.shuffle.enforceMode.enabled=true \ - ../datafusion-benchmarks/runners/datafusion-comet/tpcbench.py \ - --benchmark tpch \ - --data /mnt/bigdata/tpch/sf100-parquet/ \ - --queries ../datafusion-benchmarks/tpch/queries +$SPARK_HOME/bin/spark-submit \ + --master $SPARK_MASTER \ + --conf spark.driver.memory=8G \ + --conf spark.executor.memory=64G \ + --conf spark.executor.cores=16 \ + --conf spark.cores.max=16 \ + --conf spark.eventLog.enabled=true \ + --conf spark.sql.autoBroadcastJoinThreshold=-1 \ + tpcbench.py \ + --benchmark tpch \ + --data /mnt/bigdata/tpch/sf100/ \ + --queries ../../tpch/queries \ + --iterations 5 ``` -Comet performance can be compared to regular Spark performance by running the benchmark twice, once with -`spark.comet.enabled` set to `true` and once with it set to `false`. \ No newline at end of file +## Running Benchmarks Against Apache Spark with Apache DataFusion Comet Enabled + +```shell +$SPARK_HOME/bin/spark-submit \ + --master $SPARK_MASTER \ + --conf spark.driver.memory=8G \ + --conf spark.executor.memory=64G \ + --conf spark.executor.cores=16 \ + --conf spark.cores.max=16 \ + --conf spark.eventLog.enabled=true \ + --conf spark.sql.autoBroadcastJoinThreshold=-1 \ + --jars $COMET_JAR \ + --conf spark.driver.extraClassPath=$COMET_JAR \ + --conf spark.executor.extraClassPath=$COMET_JAR \ + --conf spark.sql.extensions=org.apache.comet.CometSparkSessionExtensions \ + --conf spark.comet.enabled=true \ + --conf spark.comet.exec.enabled=true \ + --conf spark.comet.exec.all.enabled=true \ + --conf spark.comet.cast.allowIncompatible=true \ + --conf spark.comet.explainFallback.enabled=true \ + --conf spark.comet.parquet.io.enabled=false \ + --conf spark.comet.batchSize=8192 \ + --conf spark.comet.exec.shuffle.enabled=true \ + --conf spark.comet.exec.shuffle.mode=auto \ + --conf spark.shuffle.manager=org.apache.spark.sql.comet.execution.shuffle.CometShuffleManager \ + --conf spark.sql.adaptive.coalescePartitions.enabled=false \ + tpcbench.py \ + --benchmark tpch \ + --data /mnt/bigdata/tpch/sf100/ \ + --queries ../../tpch/queries \ + --iterations 5 +``` \ No newline at end of file