Skip to content

Commit 1816b06

Browse files
committed
Prepare release 0.25
1 parent 8053e71 commit 1816b06

18 files changed

Lines changed: 145 additions & 106 deletions

README.md

Lines changed: 42 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ making it a practical choice for both developers and data engineers.
1414
With sparkMeasure, users can obtain a clearer understanding of their Spark job performance,
1515
facilitating smoother and more reliable data processing operations.
1616

17-
### Key Features
17+
### ✨ Highlights
1818
- **Interactive Troubleshooting:** Ideal for real-time analysis of Spark workloads in notebooks
1919
and spark-shell/pyspark environments.
2020
- **Development & CI/CD Integration:** Facilitates testing, measuring, and comparing execution metrics
@@ -28,7 +28,7 @@ and spark-shell/pyspark environments.
2828
- **Language Compatibility:** Fully supports Scala, Java, and Python, making it versatile for a wide range
2929
of Spark applications.
3030

31-
### Contents
31+
### 📚 Table of Contents
3232
- [Getting started with sparkMeasure](#getting-started-with-sparkmeasure)
3333
- [Demo](#demo)
3434
- [Examples of sparkMeasure on notebooks](#examples-of-sparkmeasure-on-notebooks)
@@ -40,7 +40,6 @@ and spark-shell/pyspark environments.
4040
- [Architecture diagram](#architecture-diagram)
4141
- [Concepts and FAQ](#main-concepts-underlying-sparkmeasure-implementation)
4242

43-
4443
### Resources
4544
- Blog on [building an Apache Spark Performance Lab](https://db-blog.web.cern.ch/node/195)
4645
- [TPCDS PySpark](https://github.com/LucaCanali/Miscellaneous/tree/master/Performance_Testing/TPCDS_PySpark) - A tool you can use run TPCDS with PySpark, instrumented with sparkMeasure
@@ -52,13 +51,11 @@ and spark-shell/pyspark environments.
5251
Main author and contact: Luca.Canali@cern.ch
5352

5453
---
55-
### Getting started with sparkMeasure
56-
57-
#### Demo
54+
## 🚀 Quick start
5855

5956
[![Watch the video](https://www.youtube.com/s/desktop/050e6796/img/favicon_32x32.png) Watch sparkMeasure's getting started demo tutorial](https://www.youtube.com/watch?v=NEA1kkFcZWs)
6057

61-
#### Examples of sparkMeasure on notebooks
58+
### Examples of sparkMeasure on notebooks
6259
- Run locally or on hosted resources like Google Colab, Databricks, GitHub Codespaces, etc on Jupyter notebooks
6360

6461
- [<img src="https://raw.githubusercontent.com/googlecolab/open_in_colab/master/images/icon128.png" height="50"> Jupyter notebook on Google Colab Research](https://colab.research.google.com/github/LucaCanali/sparkMeasure/blob/master/examples/SparkMeasure_Jupyter_Colab_Example.ipynb)
@@ -70,26 +67,29 @@ Main author and contact: Luca.Canali@cern.ch
7067
- [<img src="https://upload.wikimedia.org/wikipedia/commons/thumb/3/38/Jupyter_logo.svg/250px-Jupyter_logo.svg.png" height="50"> Local Python/Jupyter Notebook](examples/SparkMeasure_Jupyter_Python_getting_started.ipynb)
7168

7269

73-
#### Examples of sparkMeasure on the CLI
70+
### Examples of sparkMeasure on the CLI
7471
- Run locally or on hosted resources
7572
- [![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/LucaCanali/sparkMeasure)
76-
```
77-
# Scala CLI
78-
spark-shell --packages ch.cern.sparkmeasure:spark-measure_2.12:0.24
7973

80-
val stageMetrics = ch.cern.sparkmeasure.StageMetrics(spark)
81-
stageMetrics.runAndMeasure(spark.sql("select count(*) from range(1000) cross join range(1000) cross join range(1000)").show())
82-
```
74+
#### Python CLI
8375
```
8476
# Python CLI
8577
# pip install pyspark
8678
pip install sparkmeasure
87-
pyspark --packages ch.cern.sparkmeasure:spark-measure_2.12:0.24
79+
pyspark --packages ch.cern.sparkmeasure:spark-measure_2.12:0.25
8880
8981
from sparkmeasure import StageMetrics
9082
stagemetrics = StageMetrics(spark)
9183
stagemetrics.runandmeasure(globals(), 'spark.sql("select count(*) from range(1000) cross join range(1000) cross join range(1000)").show()')
9284
```
85+
#### Scala CLI
86+
```
87+
spark-shell --packages ch.cern.sparkmeasure:spark-measure_2.12:0.25
88+
89+
val stageMetrics = ch.cern.sparkmeasure.StageMetrics(spark)
90+
stageMetrics.runAndMeasure(spark.sql("select count(*) from range(1000) cross join range(1000) cross join range(1000)").show())
91+
```
92+
9393
The output should look like this:
9494
```
9595
+----------+
@@ -143,11 +143,8 @@ Stage 1 duration => 411 (0.4 s)
143143
Stage 3 duration => 98 (98 ms)
144144
```
145145

146-
- Stage metrics collection mode has an optional memory report command
147-
- this is available in sparkMeasure since version 0.21, it requires Spark versions 3.1 or higher
148-
- note: this report makes use of per-stage memory (executor metrics) data which is sent by the
149-
executors at each heartbeat to the driver, there could be a small delay or the order of
150-
a few seconds between the end of the job and the time the last metrics value is received.
146+
### Memory report
147+
Stage metrics collection mode has an optional memory report command:
151148
```
152149
(scala)> stageMetrics.printMemoryReport
153150
(python)> stagemetrics.print_memory_report()
@@ -161,12 +158,17 @@ Stage 1 OnHeapExecutionMemory maxVal bytes => 0 (0 Bytes)
161158
Stage 3 JVMHeapMemory maxVal bytes => 322888344 (307.9 MB)
162159
Stage 3 OnHeapExecutionMemory maxVal bytes => 0 (0 Bytes)
163160
```
161+
Notes:
162+
- this is available in sparkMeasure since version 0.21, it requires Spark versions 3.1 or higher
163+
- note: this report makes use of per-stage memory (executor metrics) data which is sent by the
164+
executors at each heartbeat to the driver, there could be a small delay or the order of
165+
a few seconds between the end of the job and the time the last metrics value is received.
164166

165-
#### Command line example for Task Metrics:
167+
### CLI example for Task Metrics:
166168
This is similar but slightly different from the example above as it collects metrics at the Task-level rather than Stage-level
167169
```
168170
# Scala CLI
169-
spark-shell --packages ch.cern.sparkmeasure:spark-measure_2.12:0.24
171+
spark-shell --packages ch.cern.sparkmeasure:spark-measure_2.12:0.25
170172
171173
val taskMetrics = ch.cern.sparkmeasure.TaskMetrics(spark)
172174
taskMetrics.runAndMeasure(spark.sql("select count(*) from range(1000) cross join range(1000) cross join range(1000)").show())
@@ -175,41 +177,42 @@ This is similar but slightly different from the example above as it collects met
175177
# Python CLI
176178
# pip install pyspark
177179
pip install sparkmeasure
178-
pyspark --packages ch.cern.sparkmeasure:spark-measure_2.12:0.24
180+
pyspark --packages ch.cern.sparkmeasure:spark-measure_2.12:0.25
179181
180182
from sparkmeasure import TaskMetrics
181183
taskmetrics = TaskMetrics(spark)
182184
taskmetrics.runandmeasure(globals(), 'spark.sql("select count(*) from range(1000) cross join range(1000) cross join range(1000)").show()')
183185
```
186+
---
187+
## Spark configuration
184188

185-
### Spark configuration
186-
187-
* Choose the sparkMeasure version suitable for your environment:
189+
* Choose sparkMeasure version suitable for your environment:
188190
* For Spark 3.x, please use the latest version
191+
* For Spark 4.x, please use the latest version and scala 2.13
189192
* For Spark 2.4 and 2.3, use version 0.19
190193
* For Spark 2.1 and 2.2, use version 0.16
191194

192195
* Where to get sparkMeasure:
193196
* [sparkMeasure on Maven Central](https://mvnrepository.com/artifact/ch.cern.sparkmeasure/spark-measure)
194-
* Jars in sparkMeasure's [release notes](https://github.com/LucaCanali/sparkMeasure/releases/tag/v0.24)
197+
* Jars in sparkMeasure's [release notes](https://github.com/LucaCanali/sparkMeasure/releases/tag/v0.25)
195198
* Bleeding edge jars as artifacts in [GitHub actions](https://github.com/LucaCanali/sparkMeasure/actions)
196199
* Build jars from master using sbt: `sbt +package`
197200

198201
* Choose your preferred method to include sparkMeasure in your Spark environment:
199-
* `--packages ch.cern.sparkmeasure:spark-measure_2.12:0.24`
200-
* `--jars /path/to/spark-measure_2.12-0.24.jar`
201-
* `--jars https://github.com/LucaCanali/sparkMeasure/releases/download/v0.24/spark-measure_2.12-0.24.jar`
202-
* `--conf spark.driver.extraClassPath=/path/to/spark-measure_2.12-0.24.jar`
202+
* `--packages ch.cern.sparkmeasure:spark-measure_2.12:0.25`
203+
* `--jars /path/to/spark-measure_2.12-0.25.jar`
204+
* `--jars https://github.com/LucaCanali/sparkMeasure/releases/download/v0.25/spark-measure_2.12-0.25.jar`
205+
* `--conf spark.driver.extraClassPath=/path/to/spark-measure_2.12-0.25.jar`
203206

204207
Examples:
205208
* Spark with Scala 2.12:
206-
- **Scala:** `spark-shell --packages ch.cern.sparkmeasure:spark-measure_2.12:0.24`
207-
- **Python:** `pyspark --packages ch.cern.sparkmeasure:spark-measure_2.12:0.24`
209+
- **Scala:** `spark-shell --packages ch.cern.sparkmeasure:spark-measure_2.12:0.25`
210+
- **Python:** `pyspark --packages ch.cern.sparkmeasure:spark-measure_2.12:0.25`
208211
- note: you also need `pip install sparkmeasure` to get the [Python wrapper API](https://pypi.org/project/sparkmeasure/)
209212

210213
* Spark with Scala 2.13:
211-
- Scala: `spark-shell --packages ch.cern.sparkmeasure:spark-measure_2.13:0.24`
212-
- Python: `pyspark --packages ch.cern.sparkmeasure:spark-measure_2.13:0.24`
214+
- Scala: `spark-shell --packages ch.cern.sparkmeasure:spark-measure_2.13:0.25`
215+
- Python: `pyspark --packages ch.cern.sparkmeasure:spark-measure_2.13:0.25`
213216
- note: `pip install sparkmeasure` to get the Python wrapper API
214217

215218
* Spark 2.4 and 2.3 with Scala 2.11:
@@ -218,7 +221,7 @@ Examples:
218221
- note: `pip install sparkmeasure==0.19` to get the Python wrapper API
219222

220223
---
221-
### Notes on Spark Metrics
224+
## Notes on Spark Metrics
222225
Spark is instrumented with several metrics, collected at task execution, they are described in the documentation:
223226
- [Spark Task Metrics docs](https://spark.apache.org/docs/latest/monitoring.html#executor-task-metrics)
224227

@@ -234,7 +237,7 @@ To learn more about the metrics, I advise you set up your lab environment and ru
234237
A good place to start with is [TPCDS PySpark](https://github.com/LucaCanali/Miscellaneous/tree/master/Performance_Testing/TPCDS_PySpark) - A tool you can use run TPCDS with PySpark, instrumented with sparkMeasure
235238

236239
---
237-
### Documentation, API, and examples
240+
## Documentation, API, and examples
238241
SparkMeasure is one tool for many different use cases, languages, and environments:
239242
* [![API Documentation](https://img.shields.io/badge/API-Documentation-brightgreen)](docs/Reference_SparkMeasure_API_and_Configs.md)
240243
- [SparkMeasure's API and configurations](docs/Reference_SparkMeasure_API_and_Configs.md)
@@ -291,11 +294,11 @@ SparkMeasure is one tool for many different use cases, languages, and environmen
291294
a tool for running the TPCDS benchmark workload with PySpark and instrumented with sparkMeasure
292295

293296
---
294-
### Architecture diagram
297+
## Architecture diagram
295298
![sparkMeasure architecture diagram](docs/sparkMeasure_architecture_diagram.png)
296299

297300
---
298-
### Main concepts underlying sparkMeasure implementation
301+
## Main concepts underlying sparkMeasure implementation
299302
* The tool is based on the Spark Listener interface. Listeners transport Spark executor
300303
[Task Metrics](https://github.com/LucaCanali/Miscellaneous/blob/master/Spark_Notes/Spark_TaskMetrics.md)
301304
data from the executor to the driver.

build.sbt

Lines changed: 41 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,58 +1,71 @@
1+
/****************************************
2+
* sparkMeasure – build definition *
3+
****************************************/
4+
15
name := "spark-measure"
26

3-
version := "0.25-SNAPSHOT"
7+
version := "0.25"
8+
isSnapshot := false
49

5-
scalaVersion := "2.12.18"
10+
scalaVersion := "2.12.18"
611
crossScalaVersions := Seq("2.12.18", "2.13.8")
712

813
licenses += ("Apache-2.0", url("http://www.apache.org/licenses/LICENSE-2.0"))
914

10-
// publishing to Sonatype Nexus repository and Maven
11-
publishMavenStyle := true
12-
isSnapshot := true
13-
15+
// ─── Dependencies ──────────────────────────────────────────────────────────────
1416
val testDeps = Seq(
15-
"org.scalatest" %% "scalatest" % "3.2.19" % Test,
16-
"org.scalatest" %% "scalatest-shouldmatchers" % "3.2.19" % Test,
17-
"org.wiremock" % "wiremock" % "3.13.0" % Test
17+
"org.scalatest" %% "scalatest" % "3.2.19" % Test,
18+
"org.scalatest" %% "scalatest-shouldmatchers"% "3.2.19" % Test,
19+
"org.wiremock" % "wiremock" % "3.13.0" % Test
1820
)
1921

2022
libraryDependencies ++= Seq(
21-
"org.apache.spark" %% "spark-sql" % "3.5.5",
22-
"com.fasterxml.jackson.module" %% "jackson-module-scala" % "2.18.3",
23-
"org.slf4j" % "slf4j-api" % "2.0.17",
24-
"org.influxdb" % "influxdb-java" % "2.25",
25-
"org.apache.kafka" % "kafka-clients" % "3.9.0"
23+
"org.apache.spark" %% "spark-sql" % "3.5.5",
24+
"com.fasterxml.jackson.module"%% "jackson-module-scala" % "2.18.3",
25+
"org.slf4j" % "slf4j-api" % "2.0.17",
26+
"org.influxdb" % "influxdb-java" % "2.25",
27+
"org.apache.kafka" % "kafka-clients" % "3.9.0"
2628
) ++ testDeps
2729

28-
// This is for kafka-clients conflicting with Spark 3.5.5 jni dependency, remove with Spark 4.x
30+
// ── Override to resolve Kafka/Spark JNI clash (remove once on Spark 4.x) ──────
2931
dependencyOverrides += "com.github.luben" % "zstd-jni" % "1.5.5-4"
3032

31-
// This is for tests, TaskMetricsTest and StageMetricsTest need to access these java packages
32-
Test / fork := true // separate JVM so the flags are used
33+
// ─── Test JVM flags (needed by TaskMetricsTest & StageMetricsTest) ─────────────
34+
Test / fork := true
3335
Test / javaOptions ++= Seq(
3436
"--add-exports=java.base/sun.nio.ch=ALL-UNNAMED",
3537
"--add-opens=java.base/java.nio=ALL-UNNAMED"
3638
)
3739

38-
organization := "ch.cern.sparkmeasure"
39-
description := "sparkMeasure is a tool for performance troubleshooting of Apache Spark workloads."
40-
developers := List(Developer(
41-
"LucaCanali", "Luca Canali", "Luca.Canali@cern.ch",
42-
url("https://github.com/LucaCanali")
43-
))
44-
homepage := Some(url("https://github.com/LucaCanali/sparkMeasure"))
40+
// ─── Publishing ────────────────────────────────────────────────────────────────
41+
publishMavenStyle := true
4542

46-
publishTo := Some(
43+
publishTo := Some {
4744
if (isSnapshot.value)
48-
Opts.resolver.sonatypeSnapshots
45+
Opts.resolver.sonatypeOssSnapshots.head
4946
else
5047
Opts.resolver.sonatypeStaging
48+
}
49+
50+
// ─── Project metadata ─────────────────────────────────────────────────────────
51+
organization := "ch.cern.sparkmeasure"
52+
description := "sparkMeasure is a tool for performance troubleshooting of Apache Spark workloads."
53+
54+
developers := List(
55+
Developer(
56+
id = "LucaCanali",
57+
name = "Luca Canali",
58+
email = "Luca.Canali@cern.ch",
59+
url("https://github.com/LucaCanali")
60+
)
5161
)
5262

63+
homepage := Some(url("https://github.com/LucaCanali/sparkMeasure"))
64+
5365
scmInfo := Some(
5466
ScmInfo(
55-
url("https://github.com/LucaCanali/sparkMeasure"),
56-
"scm:git@github.com:LucaCanali/sparkMeasure.git"
67+
browseUrl = url("https://github.com/LucaCanali/sparkMeasure"),
68+
connection = "scm:git@github.com:LucaCanali/sparkMeasure.git"
5769
)
5870
)
71+

docs/Flight_recorder_mode_FileSink.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ This example collected metrics with Task granularity.
8080
(note: source the Hadoop environment before running this)
8181
```
8282
bin/spark-submit --master yarn --deploy-mode cluster \
83-
--packages ch.cern.sparkmeasure:spark-measure_2.12:0.24 \
83+
--packages ch.cern.sparkmeasure:spark-measure_2.12:0.25 \
8484
--conf spark.extraListeners=ch.cern.sparkmeasure.FlightRecorderTaskMetrics \
8585
--conf spark.sparkmeasure.outputFormat=json_to_hadoop \
8686
--conf spark.sparkmeasure.outputFilename="hdfs://myclustername/user/luca/test/myoutput_$(date +%s).json" \
@@ -96,7 +96,7 @@ Example, use spark-3.3.0, Kubernetes, Scala 2.12 and write output to S3:
9696
bin/spark-submit --master k8s://https://XXX.XXX.XXX.XXX --deploy-mode client --conf spark.executor.instances=3 \
9797
--conf spark.executor.cores=2 --executor-memory 6g --driver-memory 8g \
9898
--conf spark.kubernetes.container.image=<registry-URL>/spark:v3.0.0_20190529_hadoop32 \
99-
--packages org.apache.hadoop:hadoop-aws:3.3.2,ch.cern.sparkmeasure:spark-measure_2.12:0.24 \
99+
--packages org.apache.hadoop:hadoop-aws:3.3.2,ch.cern.sparkmeasure:spark-measure_2.12:0.25 \
100100
--conf spark.hadoop.fs.s3a.secret.key="YYY..." \
101101
--conf spark.hadoop.fs.s3a.access.key="ZZZ..." \
102102
--conf spark.hadoop.fs.s3a.endpoint="https://s3.cern.ch" \
@@ -115,7 +115,7 @@ To post-process the saved metrics you will need to deserialize objects saved by
115115
This is an example of how to do that using the supplied helper object sparkmeasure.Utils
116116

117117
```
118-
bin/spark-shell --packages ch.cern.sparkmeasure:spark-measure_2.12:0.24
118+
bin/spark-shell --packages ch.cern.sparkmeasure:spark-measure_2.12:0.25
119119
120120
val myMetrics = ch.cern.sparkmeasure.IOUtils.readSerializedStageMetricsJSON("/tmp/stageMetrics_flightRecorder")
121121
// use ch.cern.sparkmeasure.IOUtils.readSerializedStageMetrics("/tmp/stageMetrics.serialized") for java serialization

docs/Flight_recorder_mode_InfluxDBSink.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ bin/spark-shell \
8787
--conf spark.sparkmeasure.influxdbURL="http://localhost:8086" \
8888
--conf spark.extraListeners=ch.cern.sparkmeasure.InfluxDBSink,ch.cern.sparkmeasure.InfluxDBSinkExtended \
8989
--conf spark.sparkmeasure.influxdbStagemetrics=true
90-
--packages ch.cern.sparkmeasure:spark-measure_2.12:0.24
90+
--packages ch.cern.sparkmeasure:spark-measure_2.12:0.25
9191
9292
// run a Spark job, this will produce metrics
9393
spark.sql("select count(*) from range(1000) cross join range(1000) cross join range(1000)").show

docs/Flight_recorder_mode_KafkaSink.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ bin/spark-shell \
6767
--conf spark.extraListeners=ch.cern.sparkmeasure.KafkaSink \
6868
--conf spark.sparkmeasure.kafkaBroker=localhost:9092 \
6969
--conf spark.sparkmeasure.kafkaTopic=metrics
70-
--packages ch.cern.sparkmeasure:spark-measure_2.12:0.24
70+
--packages ch.cern.sparkmeasure:spark-measure_2.12:0.25
7171
```
7272

7373
- Look at the metrics being written into Kafka:

docs/Flight_recorder_mode_PrometheusPushgatewaySink.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ Examples:
6060
bin/spark-shell \
6161
--conf spark.extraListeners=ch.cern.sparkmeasure.PushGatewaySink \
6262
--conf spark.sparkmeasure.pushgateway=localhost:9091 \
63-
--packages ch.cern.sparkmeasure:spark-measure_2.12:0.24
63+
--packages ch.cern.sparkmeasure:spark-measure_2.12:0.25
6464
```
6565

6666
- Look at the metrics being written to the Pushgateway

docs/Instrument_Python_code.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ The details are discussed in the [examples for Python shell and notebook](https:
5454

5555
- This is how to run sparkMeasure using a packaged version in Maven Central
5656
```
57-
bin/spark-submit --packages ch.cern.sparkmeasure:spark-measure_2.12:0.24 your_python_code.py
57+
bin/spark-submit --packages ch.cern.sparkmeasure:spark-measure_2.12:0.25 your_python_code.py
5858
5959
// alternative: just download and use the jar (it is only needed in the driver) as in:
6060
bin/spark-submit --conf spark.driver.extraClassPath=<path>/spark-measure_2.12-0.24.jar ...

docs/Instrument_Scala_code.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ See details at: [Prometheus Pushgateway](Prometheus.md)
7171

7272
- This is how to run sparkMeasure using a packaged version in Maven Central
7373
```
74-
bin/spark-submit --packages ch.cern.sparkmeasure:spark-measure_2.12:0.24
74+
bin/spark-submit --packages ch.cern.sparkmeasure:spark-measure_2.12:0.25
7575

7676
// or just download and use the jar (it is only needed in the driver) as in:
7777
bin/spark-submit --conf spark.driver.extraClassPath=<path>/spark-measure_2.12-0.24.jar ...

docs/Prometheus.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ https://prometheus.io/docs/instrumenting/exposition_formats/
3535

3636
1. Measure metrics at the Stage level (example in Scala):
3737
```
38-
bin/spark-shell --packages ch.cern.sparkmeasure:spark-measure_2.12:0.24
38+
bin/spark-shell --packages ch.cern.sparkmeasure:spark-measure_2.12:0.25
3939
4040
val stageMetrics = ch.cern.sparkmeasure.StageMetrics(spark)
4141
stageMetrics.begin()

docs/Python_shell_and_Jupyter.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ See also [README](../README.md) for an introduction to sparkMeasure and its arch
99
- Use PyPi to install the Python wrapper and take the jar from Maven central:
1010
```
1111
pip install sparkmeasure
12-
bin/pyspark --packages ch.cern.sparkmeasure:spark-measure_2.12:0.24
12+
bin/pyspark --packages ch.cern.sparkmeasure:spark-measure_2.12:0.25
1313
```
1414
- If you prefer to build from the latest development version:
1515
```

0 commit comments

Comments
 (0)