Mark Payne created NIP-41:
-----------------------------

             Summary: Improve resilience against large/numerous FlowFile 
attributes
                 Key: NIP-41
                 URL: https://issues.apache.org/jira/browse/NIP-41
             Project: NiFi Improvement Proposal
          Issue Type: Improvement
            Reporter: Mark Payne


h2. Motivation

FlowFile attributes are intended to be small metadata (typically on the order 
of hundreds of characters). In practice, flows often place large payloads in 
attributes. Attributes are held in memory on each FlowFile and all attributes 
are rewritten to the FlowFile Repository on every update that includes any 
attribute change. Large attributes therefore increase write cost, inflate the 
FlowFile Repository write-ahead log (WAL) between checkpoints, and can exhaust 
JVM heap before today's count-based swap thresholds engage.

Today, swap is driven by a globally configured FlowFile count 
({{{}nifi.queue.swap.threshold{}}}, default 20,000) with a fixed batch size of 
10,000 FlowFiles written per swap file.

FlowFile Repository checkpointing is time-based (default 20 seconds). Under 
heavy attribute write load, the active journal can grow large enough to exhaust 
disk before the next scheduled checkpoint.

As a result, a huge number of attributes, or very large attributes, cause 
issues with both NiFi's JVM heap as well as disk contention contention and 
storage space exhaustion.
h2. Proposed Solution

Two related changes:
 # *Size-triggered FlowFile Repository checkpointing.* Keep the existing 
time-based checkpoint interval. Add a configurable maximum size for the active 
WAL journal. When that size is reached, force a checkpoint instead of waiting 
for the interval, then begin a new journal and discard the prior 
snapshot/journals as today.
 # *Per-queue, heap-size-based swapping.* Replace globally configured 
count-based swap thresholds with a per-connection budget for estimated in-heap 
FlowFile metadata (record overhead plus attribute key/value lengths). Default 
global budget: 10 MB of metadata in the active queue before overflow begins. 
Overflow uses the existing secondary in-heap queue; when that queue holds about 
1 MB of estimated metadata, write a swap file and drop those FlowFiles from 
heap. Each connection may override the budget (same configuration pattern as 
backpressure object/data-size thresholds). A global default remains in 
{{{}nifi.properties{}}}.

h2. NiFi API Changes
 * {{VersionedConnection}} gains a field for the per-connection metadata heap 
swap budget (data-size string, consistent with backpressure data-size fields).

h2. REST API Changes
 * {{ConnectionDTO}} (and related create/update paths) expose the 
per-connection metadata heap swap budget.

h2. Framework Changes
 * Estimate FlowFile metadata heap size from the FlowFile record structure and 
attribute key/value lengths.
 * Drive active-queue overflow and swap-file batching from estimated metadata 
bytes in addition to FlowFile counts (including clustered queue partitions).
 * FlowFile Repository: force checkpoint when the active journal reaches the 
configured size threshold, in addition to the existing time-based schedule and 
the existing post-recovery checkpoint on startup.

h2. UI Changes
 * Create Connection and Edit Connection gain a field for the metadata heap 
swap budget (alongside FlowFile expiration and backpressure).

h2. nifi.properties Configuration
 * New property for the default per-queue metadata heap swap budget (default 
{{{}10 MB{}}}). This supersedes {{nifi.queue.swap.threshold}} as the primary 
swap control; the count-based property is removed.
 * New property for the maximum FlowFile Repository WAL journal size that 
forces a checkpoint.

This set of changes provide significant protection to NiFi's JVM heap, as well 
as storage constraints. Additionally, it does so in a way that provides 
queue-specific overrides so that if there are specific queues that do need to 
support larger heap utilization without swapping, that can be accommodated.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to