From 6b7452e0d4d17c98162f7abdc200307ba6b0ad62 Mon Sep 17 00:00:00 2001 From: EthanRosenthal Date: Tue, 15 Nov 2022 21:25:17 -0500 Subject: [PATCH] Add column projection to dask --- README.md | 16 +++++++++------- assets/benchmark.png | Bin 17811 -> 0 bytes assets/benchmark_50.png | Bin 0 -> 21721 bytes assets/partition_benchmark.png | Bin 20694 -> 23958 bytes assets/results.csv | 6 ------ assets/results_50.csv | 7 +++++++ src/medium_data_bakeoff/bakeoff.py | 5 +---- src/medium_data_bakeoff/ingredients/dask.py | 8 +++++++- 8 files changed, 24 insertions(+), 18 deletions(-) delete mode 100644 assets/benchmark.png create mode 100644 assets/benchmark_50.png delete mode 100644 assets/results.csv create mode 100644 assets/results_50.csv diff --git a/README.md b/README.md index b11607a..4f25f84 100644 --- a/README.md +++ b/README.md @@ -2,23 +2,26 @@ A simple benchmark for python-based data processing libraries. -Guiding Principles: +## Guiding Principles: - Python Only: I have no intention of using another language to process data. That said, non-Python implementations with Python bindings are perfectly fine (e.g. Polars). - Single Node: I'm not interested in benchmarking performance on clusters of multiple machines. - Simple Implementation: I'm not interested in heavily optimizing the benchmarking implementations. My target user is myself: somebody who largely uses pandas but would like to either speed up their computations or work with larger datasets than fit in memory on their machine. -Libraries: +## Libraries: -- ~~[Dask](https://www.dask.org/)~~ Not currently working on my machine (OOM) +- [Dask*](https://www.dask.org/) - [dask-sql](https://dask-sql.readthedocs.io/en/latest/) - [DuckDB](https://duckdb.org/) - [Polars](https://www.pola.rs/) - [Spark](https://spark.apache.org/docs/latest/api/python/) - [Vaex](https://vaex.io/) -Results: +\*Dask required a slight, non-beginner optimization to successfully run it on my machine. Specifically, I had to do "manual column projection" by passing in the relevant calculation columns when reading in the dataset. I consider the Dask results to be slightly cheating, although this hack [may be resolved](https://github.com/dask/dask/issues/7933) natively in Dask in the not so distant future. + + +## Results: The following results are from running the benchmark locally on my desktop that has: - Intel Core i7-7820X 3.6 GHz 8-core Processor (16 virtual cores, I think) @@ -27,7 +30,7 @@ The following results are from running the benchmark locally on my desktop that Original 50-partition dataset: -![assets/benchmark.png](assets/benchmark.png) +![assets/benchmark_50.png](assets/benchmark_50.png) Bakeoff as a function of partitions: @@ -43,7 +46,7 @@ Since 2016, I have been pinging the public API every 2 minutes and storing the r For the benchmark, I first convert the CSVs to snappy-compressed parquet files. This reduces the dataset down to ~4GB in size on disk. -# Computation +## Computation To start, the bakeoff computation is extremely simple. It's almost "word count". I calculate the average number of bikes available at each station across the full time period of the dataset. In SQL, this is basically @@ -108,7 +111,6 @@ docker cp medium-data-bakeoff:/app/results/* . - Run benchmarks on AWS for reproducibility. - Run benchmarks as a function of number of CPUs. -- Run benchmarks as a function of number of parquet files. - Add some harder benchmark computations. - Add more libraries (e.g. `cudf`). - Benchmark memory usage. diff --git a/assets/benchmark.png b/assets/benchmark.png deleted file mode 100644 index 6a27ee36d2756466318ea8c2f741e754f2ee7bc4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17811 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 diff --git a/assets/benchmark_50.png b/assets/benchmark_50.png new file mode 100644 index 0000000000000000000000000000000000000000..9f05c3dcb7388ac19ec924a28bad40266f5d4f9a GIT binary patch literal 21721 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 hGY`d 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 None: bakeoff = {} recipe = [ - # Dask was working on 2022.10.2. It got downgraded to 2022.10.0 after - # installing dask-sql, and the benchmark no longer works on my machine. I think - # it's running out of memory. - # ("dask", bake_dask), + ("dask* (slightly optimized)", bake_dask), ("dask_sql", bake_dask_sql), ("duckdb", bake_duckdb), ("polars", bake_polars), diff --git a/src/medium_data_bakeoff/ingredients/dask.py b/src/medium_data_bakeoff/ingredients/dask.py index 71912d9..f55896e 100644 --- a/src/medium_data_bakeoff/ingredients/dask.py +++ b/src/medium_data_bakeoff/ingredients/dask.py @@ -10,7 +10,13 @@ def bake(dataset: str) -> float: client = Client(cluster) ProgressBar().register() start = time.time() - df = dd.read_parquet(dataset, index=False) + # NOTE: We pass in the relevant columns for the calculation because Dask + # currently does not do predicate pushdown. This is noticeably a bit of a cheat + # and not fully in the spirit of the bakeoff given that this is somewhat + # advanced knowledge that a user coming from pandas may not have. + df = dd.read_parquet( + dataset, index=False, columns=["station_id", "num_bikes_available"] + ) df.groupby("station_id")["num_bikes_available"].mean().compute() stop = time.time() client.close()