⏪Release Notes
Version 0.9.8
Bug fixes:
#74 — Fix NullPointerException in Block.code when from_json (or any other
CodegenFallback expression) is used under whole-stage codegen with DataFlint
instrumentation enabled. TimedWithCodegenExec now reports supportCodegen = false
for wrapped operators that contain a CodegenFallback, mirroring Spark's own
CollapseCodegenStages check that the transparent wrapper had been hiding.
* Compatible with Spark 3.0 → 4.x
Hardening:
* TimedExec.postRddId now overwrites the rddId metric instead of summing across
re-executions of the same plan instance.
* TimedExec and TimedWithCodegenExec no longer compare equal — fixes a corner
case in plan canonicalization / AQE plan reuse.
* executeCollect write-path is now bounds-safe; falls back to the standard path
on unexpected plan shapes (vendor write commands, future Spark layouts).
* rddId metric switched from a "size" type to plain sum (no longer rendered as
bytes — "12 B" — in the SparkUI).
Version 0.9.7
This release adds first-class support for Databricks Runtime 17.3 LTS and newer, and fixes a metric formatting issue that could blank parts of the DataFlint SQL plan view on Databricks.
What changed:
🆕 New artifact: dataflint-spark4-databricks_2.13
Databricks Runtime 17.3 is Spark 4–based but ships javax.servlet instead of the standard jakarta.servlet. The regular dataflint-spark4_2.13 jar was crashing the cluster at startup with NoClassDefFoundError: jakarta/servlet/Servlet.
We now publish a separate jar built for Databricks runtimes:
io.dataflint:dataflint-spark4-databricks_2.13:0.9.7It’s the same plugin, same spark.plugins class — only the jar coordinate changes.
🛠 Duration metric now displays correctly on Databricks
DataFlint’s TimedExec instrumentation wraps each operator with a "duration" timing metric. On Databricks runtimes, this was previously appearing as a bare number (e.g. 1058) in the Spark UI rather than the expected 5s (1s, 2s, 3s) formatting, which also crashed the DataFlint SQL plan view with Unsupported time unit. Fixed.
The DataFlint UI is also more defensive about unexpected metric formats — it now logs a warning and skips the value rather than blanking the page.
Stock Spark 4.x (non-Databricks)
Unchanged. dataflint-spark4_2.13 continues to be the right artifact for stock Spark 4, EMR, and any other vanilla Spark 4 deployment.
Version 0.9.6
Fixed a startup crash on Databricks Runtime
17.3 and up, using spark 4The DataFlint tab will not be registed
Version 0.9.0
UI and usability
Added a YouTube tutorial link in the footer.
Added a new version notification.
DataFlint now fetches the latest version from Sonatype Central, It shows a chip when a newer version is available. Version checks use semver comparison. The check fails silently if Sonatype Central is unreachable.
Fixed duration display for zero values, Nodes with
duration=0now show0 msinstead of being hidden.
Instrumentation
DataFlintRDDUtilsnow uses a custom RDD instead ofmapPartitionsfor duration timing.The custom RDD captures
startTimeinsidecompute()It does this beforefirstParent.iterator()This now captures eager parent work correctly. That includes operators likeSortExecandHashAggregateExecPreviously,mapPartitionsstarted timing too late That missed full partition sort work and hash map build time.TimedExec.executeCollectnow records per-partition write duration It reconstructsDataWritingCommandExecwith the data plan wrapped inRDDTimingWrapperOn Spark3.4+, this happens insideWriteFilesExecOn older Spark versions, it wraps the data plan directly The write command then consumes the timed RDD viasparkContext.runJobThis captures both data production time and write I/O per partition Previously, write duration used driver-side wall-clock timing That was inconsistent with other per-partition metrics.doProducenow wraps child code intry/finallyfor blocking operators Duration metrics now flush even when operators exit early throughshouldStop()orreturnThis fixesduration=0in codegen paths for operators likeSortExecdoProducenow sanitizesctx.freshNamePrefixThis strips non-alphanumeric characters from generated code variable prefixes It fixes invalid Java identifiers for nodes with spaces innodeNameThat includes names likeScan ExistingRDDandExecute InsertIntoHadoopFsRelationCommand.Added
RDDScanExecto instrumented nodesScan ExistingRDDnodes now get duration metrics on Spark3and Spark4.
Version 0.8.9
Instrumentation
A single generic
TimedExecwrapper now replaces 19 per-typeDataFlint*ExecclassesTimedExecadds adurationmetric and anrddIdmetric.Existing Spark metrics stay intact on the wrapped node The wrapper exposes
child.childrenas its own children The SQL graph stays as one node You do not get double nodes in Spark UI or DataFlint UI.InMemoryTableScanExecand allExchangenodes are never wrapped.Version-specific nodes are matched by class name string This avoids
NoClassDefFoundErroron older Spark versions.Join codegen is cancelled where codegen instrumentation does not work.
DataWritingCommandExecnow gets duration support throughdoPreparedelegation.
Stage grouping and duration attribution
Stage grouping is now topology-based from the SQL plan graph,
Exchangeboundaries define the stage graph, The result is deterministic across live runs and history server.Stage view now supports Inclusive and Exclusive duration modes, Inclusive shows native Spark metrics as-is Exclusive is the default Exclusive normalizes stage durations to
executorRunTime.Attribution mode auto-enables when any instrumented node exists.
Exchange read and write durations now come from shuffle metrics.
Producer and consumer stages split those durations correctly.
Metric reduction is now null-safe throughout the reducer.
Version 0.8.8
Fix for instumenation on Spark 3.1.
Better extraction for Iceberg and bigQuery save operation.
Version 0.8.7
New spark instrumentation - which adds duration metrics for more Python actions and window operation nodes ( spark versions 3.1+) enabled using : spark.dataflint.instrument.spark.window.enabled spark.dataflint.instrument.spark.arrowEvalPython.enabled spark.dataflint.instrument.spark.batchEvalPython.enabled spark.dataflint.instrument.spark.flatMapGroupsInPandas.enabled spark.dataflint.instrument.spark.flatMapCoGroupsInPandas.enabled
Version 0.8.3
New spark instrumentation - spark.dataflint.instrument.spark.mapInArrow.enabled and spark.dataflint.instrument.spark.mapInPandas.enabled, which adds duration metrics to all spark versions 3.3+ with these new operators. So you can know exactly how much a UDF took.
Add full table name to iceberg table reads
Version 0.8.3
Fix to stage identification algorithm Fix to stage read visuals to show hashed/ranges fields Visual improvements to stage sidebar
Version 0.8.2
Improvement to sql plan layout with stage nodes
Button to switch to plan without stage nodes
Improvements to stage identification
Version 0.8.1
Small fix for fixing the support of spark version 3.3.X
Small fix for shuffle write metrics real time update
Version 0.8.0
✨ New Features New Flow Graph UI with Stage Parent Nodes - Completely redesigned the SQL flow graph visualization with stage parent nodes for better understanding of query execution Task View in Stage Nodes - Added task progress indicators directly within stage nodes for real-time task monitoring "Rows Aggregated" Metric - Added a new metric to track aggregated row counts Exchange Node Separation - Shuffle read and write operations are now displayed separately when 2 stages exist, providing clearer visibility into data exchange operations
🎨 UI Improvements Enhanced visual consistency across UI components Replaced CheckIcon with CancelIcon for clearer error representation Updated FlowLegend to include task progress indicators Improved styling for node elements in SQL flow General SQL plan UI improvements ⚡ Performance Improvements SQLNodeStageReducer Optimization - Implemented O(1) access with lookup maps for nodes and stages, significantly improving efficiency in SQL node stage calculations Smarter Update Cycles - Skip OnCycleEnd calculations when there are no changes in SQL and stages Stage Map for Alerts - Use stage map for faster alert processing
🐛 Bug Fixes Fixed wall clock duration calculation Fixed duration node hover display issue Fixed idle cores bug where idle cores showed 0% when all executors closed (Spark incorrectly detected local mode)
🔧 Other Changes Removed Scala distribution from Spark distribution package
Version 0.7.0
Delta lake collector (experimental)
Stage identification improvements
UI Improvements
Version 0.6.1
Add better delta lake support - delta write command, optimize command, optimize shuffle before write
Add support for SortAggregate nodes
Fix maven dependency issues with spark 3 POM fiels
Version 0.6.0
Spark 4 support
Better stage identification using metrics with statistics
Shrinking metrics text in case of high number of metrics
Version 0.5.1
Visual improvements for the new SQL plan UI
Version 0.5.0
New and updated design for the sql plan nodes

Version 0.4.4
Improvement to query presentation
Support Extended node:

Version 0.4.3
Support query params, like sql-id and node-ids in link
Version 0.4.2
Supports partition pruning
Enriching filter/select nodes with the UDF python function names:

Add support for Generate node - explode, inline and more!

Version 0.4.1
Support newer DBX versions - 14 and up.
Version 0.4.0
Support map by pandas and arrow functions
Added new flag to silence alert for a job -
Added short recommendation on top of alert
Updated DataFlint logo
Support better stage identifications for varios readers
Shows stage failures with an orange V on sql node and list of complete stage failures
Version 0.3.2
New alerts - cross joins, change join to broadcast, large partition size
Better support for cross joins
Additional metrics for joins and shuffles



Version 0.3.1
Support Distinct, skewed join, coalesce nodes
Sorting by default by duration on history server mode
Filter sql's without any job/stage automatically, add a switch to show them.
Add rows filtered percentage for filter and distinct sql nodes

Version 0.3.0
Support for window functions
Better support for databricks
Detecting resource configuration better in configuration tab
Bug and UI fixes

Version 0.2.7
DataFusion Comet support
bug fixes
Version 0.2.6
Nvidia RAPIDS for Spark support
bug fixes
Version 0.2.5
Bug Fixes
Version 0.2.4
New visibility & alerts - Driver's memory
Updated README
Bug Fixes
Version 0.2.3
Driver memory monitoring & alert
Updated readme
Bug fixes

Version 0.2.3
New alert - Large data Broadcast, for requesting to broadcast large data sets with the broadcast() function
New alert - Large filter conditions, for wiring long filter conditions instead of using join logic
UI Improvements
Version 0.2.2
Support spark versions 2.4 logs in history server with version later than 3.2 Limited feature-set is available due to events having less data than spark 3.0 and up
Version 0.2.1
Better Databricks stage to node support
Support spark.dataflint.runId in custom history server providers when appId is not the spark appId
Version 0.2.0
Better support for Databricks Photon plans
Input nodes shows partitions filters and push down filters
Stage Breakdown - press the blue down arrow on sql node to see stage information
New alert - large number of small tasks (see Large Number Of Small Tasks)

Version 0.1.7
Apache Iceberg alerts improvements
Add avg file size in read/write
More information when hovering on stage

Version 0.1.6
Apache Iceberg support
Better node naming
Read metrics and reading small files alerts
Write metrics and overwriting most of table alerts
Require enabling iceberg metric reporter, can be done for you by enabling spark.dataflint.iceberg.autoCatalogDiscovery to true, or setting the iceberg metric reporter manually for each catalog, for example:

Version 0.1.5
Add support for history server with cluster-mode jobs (i.e. with attempt numbet)
Fix "wasted cores" calculation
Fix status tab SQL is flickering when there is SQL with sub queriers
Version 0.1.4
Fix scala 2.13 support
Version 0.1.3
DataFlint SaaS support
partition Skew Alert:

Version 0.1.2
Scala 2.13 support
A spark flag to disable web app mixpanel telemetries -
spark.dataflint.telemetry.enabled(true/false)Renamed Core Activity Rate to Wasted Cores Ratio (which is 100 - Core Activity Rate), and added an alert for wasted cores too high

Version 0.1.1
Resources tab - see a graph of your cluster executors count over time, use it to tune your resource allocation settings and save cost!
Minor visual fixes
DataFlint Resource Tab:

Version 0.1.0
Small fix to platform identification
Version 0.0.8
Databricks support
Visual improvements
public release
Version 0.0.7
Heat map

Version 0.0.6
Flint Assistant, require OpenAI Key

Version 0.0.5
Syntax highlighting for SQL plan parts

Calculating container memory usage and using it for GB memory/hour calculations

Version 0.0.4
Minor fix relates to spark operator and nginx
Version 0.0.3
SQL plan modes
IO only, shows only input, joins and output:

Basic mode (default), shows also transformations like filters, aggregations and selects:

Advances, shows repartitions, broadcasts and sorts

Also there is plans informations for:
Joins
Sorts
Selects
Repartitions
Version 0.0.2
DBU calculation instead of core/hour in summary bar

Add memory config to configuration tab

Filter Nodes has condition:

Advanced mode for SQL plan, that also presents shuffle nodes

Additional changes
Support both http and https access with enabling mix-content only on https mode
Support for spark 3.5.X
Version 0.0.1
Initial version, includes:
Status page
Summary page
Configuration Page
Alerts page
Last updated