<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD v1.0 20120330//EN" "JATS-archivearticle1.dtd">
<article xmlns:xlink="http://www.w3.org/1999/xlink">
  <front>
    <journal-meta />
    <article-meta>
      <title-group>
        <article-title>Performance Benchmarking of Continuous Processing and Micro-Batch Modes in Spark Structured Streaming</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Illia Fedorovych</string-name>
          <email>illya.fedorovych@tntu.edu.ua</email>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Halyna Osukhivska</string-name>
          <email>osukhivska@tntu.edu.ua</email>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Nadiia Lutsyk</string-name>
          <email>lutsyk.nadiia@tntu.edu.ua</email>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>Ternopil Ivan Puluj National Technical University</institution>
          ,
          <addr-line>56 Ruska St, Ternopil, UA46001</addr-line>
          ,
          <country country="UA">Ukraine</country>
        </aff>
      </contrib-group>
      <abstract>
        <p>This study investigates the performance of Continuous Processing mode in Apache Spark Structured Streaming, with a focus on its application in scenarios where low latency is a key requirement (such as traffic incident reporting or stock price prediction). Unlike the traditional micro-batching method, which processes data in intervals, the Continuous Processing mode allows for near-real-time data analysis by handling streams as they arrive. This approach significantly reduces latency, making it ideal for time-sensitive applications, but it does come with trade-offs in terms of throughput and fault tolerance. We conducted a comparative analysis of Continuous and micro-batching modes using various configurations and benchmarks, with a focus on latency and throughput metrics. Our findings indicate that while the Continuous Processing mode offers significantly lower latencies while using Rate source (2 ms instead of 528 ms in micro-batch mode), its performance in high-throughput scenarios using Kafka source may be less consistent (260 ms in contrast to 197 ms in micro-batch mode). The study also explores the practical implications of deploying Continuous Processing mode in real-world applications, assessing its compatibility with different data sources and sinks, predominantly Apache Kafka. These findings have practical implications for optimizing text data flow strategies in big data analytics, providing insights that can guide the selection of processing modes based on specific operational needs.</p>
      </abstract>
      <kwd-group>
        <kwd>Continuous Processing</kwd>
        <kwd>Apache Spark</kwd>
        <kwd>Structured Streaming</kwd>
        <kwd>text data stream processing</kwd>
        <kwd>big data</kwd>
        <kwd>real-time processing</kwd>
        <kwd>real-time analytics</kwd>
        <kwd>1</kwd>
      </kwd-group>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>1. Introduction</title>
      <p>Apache Spark 2.3 marked a significant evolution in the capabilities of Spark Structured
Streaming by introducing a new mode known as Continuous Processing. Traditional Spark
streaming had relied predominantly on micro-batching techniques, which process data in
discrete intervals, combining streaming-like throughput
with
batch
processing's fault
tolerance and</p>
      <p>
        manageability benefits [
        <xref ref-type="bibr" rid="ref1 ref2">1,2</xref>
        ]. However, for scenarios demanding ultra-low
latency, micro-batching could introduce inherent delays incompatible with time-critical
applications, such as traffic anomalies detection.
      </p>
      <p>Continuous Processing in Apache Spark Structured Streaming represents a paradigm shift
from the traditional micro-batching execution strategy. While micro-batching processes data
in discrete chunks, Continuous Processing treats streams as proper continuous flows,
reducing latency substantially. This is achieved by utilizing long-lived operators that maintain
their state across data batches rather than resetting for each batch as in micro-batching. This
approach minimizes the overhead caused by frequent stopping and starting task executions,
which is typical in micro-batch processing.</p>
      <p>The execution strategy of Continuous Processing is designed around the concept of
pipelines akin to traditional database streaming models. These pipelines utilize long-lived
tasks that continuously receive and process data as it arrives without the predefined intervals
that characterize micro-batching. This model allows Continuous Processing to deliver lower
latency by reducing the delays associated with batching.</p>
      <p>
        As of the latest release of Apache Spark, version 3.5.1, Continuous Processing is still
labeled as experimental [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ]. This designation implies that while the functionality is available
for use, it is not yet fully optimized and may lack some robustness features integral to
microbatching. Furthermore, the integration of Continuous Processing with various data sources
and sinks is currently limited to Apache Kafka, Console Sink, and Rate Source.
      </p>
      <p>The limited support for diverse sources and sinks means that deploying Continuous
Processing in a production environment requires careful consideration of the input and output
interfaces. For organizations heavily using Kafka, Continuous Processing offers a promising
opportunity to enhance the responsiveness of their streaming applications. However, for use
cases involving other sources or more complex transactional needs, the experimental nature
and the current limitations might pose significant challenges.</p>
      <p>The ongoing development and incremental improvements in Continuous Processing
suggest that future releases of Spark may expand its capabilities and integrations. Developers
and organizations interested in cutting-edge streaming technologies should monitor updates
to Spark’s Continuous Processing mode, as it will likely evolve significantly.</p>
      <p>This paper analyzes these two processing modes within Apache Spark Structured
Streaming, focusing on their performance implications across various setups and
deployments. By examining several workloads, this study aims to delineate the conditions
under which Continuous Processing significantly outperforms micro-batching and,
conversely, when micro-batching remains preferable.</p>
    </sec>
    <sec id="sec-2">
      <title>2. Related Works</title>
      <p>
        Armbrust et al. [
        <xref ref-type="bibr" rid="ref4">4</xref>
        ] provided a general analysis of Continuous Processing mode and researched
the relationship between latency and throughput. The paper also provided information about
the scalability of micro-batching mode, showing Structured Streaming’s throughput
depending on the number of worker nodes. However, despite discussing the architectural
difference between micro-batching and Continuous Processing modes, they were not directly
compared regarding latency and throughput given the same resources.
      </p>
      <p>
        Other works primarily focus on using micro-batching mode [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ] or comparing it with other
data stream processing frameworks, such as Kafka Streams, Storm, Flink, etc. [
        <xref ref-type="bibr" rid="ref6 ref7">6,7</xref>
        ]. Van
Dongen and Van Den Poel conducted the most extensive benchmarking, presenting an
opensource benchmark implementation that can measure latency and throughput under different
workloads, such as sustainable and bursts [
        <xref ref-type="bibr" rid="ref8">8</xref>
        ].
      </p>
      <p>
        In the paper [
        <xref ref-type="bibr" rid="ref8">8</xref>
        ], the Continuous Processing mode was mentioned a few times as a
lowerlatency alternative to micro-batching, but it was discarded because of its experimental status.
The authors later expanded the list of measured metrics by publishing papers on the
scalability and fault tolerance of data stream processing frameworks [
        <xref ref-type="bibr" rid="ref10 ref9">9,10</xref>
        ].
      </p>
    </sec>
    <sec id="sec-3">
      <title>3. Proposed methodology</title>
      <p>The proposed methodology uses micro-batching and Continuous Processing to compare
latency and throughput under different configurations. The benchmarking process uses a
pipeline with either a rate source or a Kafka source as input, transforming the timestamp and
value into a JSON string, and a Kafka sink as the output.</p>
      <p>Key components of the method include input sources, which involve testing the rate
source at 10 and 100 records per second (rps) and using a Kafka source that utilizes text data
from a Ukrainian Wikipedia corpus. The output sink is configured with a Kafka sink, which
maps the message’s timestamp into the payload as a “new_timestamp” field to measure each
record's latency. Spark configuration tests are conducted in local mode with 3 and 16 workers,
and each benchmark is executed for 2 minutes. Additionally, the number of partitions for
Kafka topics (both source and sink) is adjusted to evaluate its impact on throughput and
latency.</p>
      <p>The proposed methodology aims to identify the optimal configuration for both
microbatching and Continuous Processing modes by systematically varying the number of records
per second, worker nodes, and Kafka partitions. This approach helps understand each
processing mode's limitations and performance characteristics under different loads. The final
configurations are presented in Table 1.</p>
      <p>After running the initial benchmarking and analyzing the results, it was suggested that the
default number of partitions in the Kafka topic might influence Spark's throughput and
latency. It was decided to include parametrization of this number to exclude the possibility of
Kafka being the bottleneck in the benchmarking process. The configurations for
benchmarking different Kafka topic partition count are presented in Table 2.</p>
      <p>To develop an understanding of at what rates continuous processing becomes unreliable,
another set of benchmarks focused on how continuous and micro-batch processing handle
different loads in test conditions, which could provide a controlled throughput rate, was
decided to perform.</p>
      <p>The resulting configurations for performing sustainable throughput benchmarks included
comparing micro-batching and continuous modes, using rate source at 10 - 10 000 rows per
second, 3 and 16 worker nodes, and writing into Kafka topics with 3 – 32 partitions, with the
number of Spark partitions equal to Kafka’s.</p>
      <p>The total number of configurations was 64, but some configuration executions were
canceled during the benchmarking process to make readjustments, as clear patterns have
emerged, rendering some of the unperformed configurations worthless. The list of
configurations in the stage 2 benchmark is presented in Table 3.</p>
      <p>After observing the results of sustainable throughput benchmarks, it was decided to
expand the research by decoupling the Spark partition count from the Kafka partition count to
see if further improvements could be made. The benchmarking configurations are provided in
Table 4.</p>
    </sec>
    <sec id="sec-4">
      <title>4. Results</title>
      <p>After setting up and running initial benchmarks on modern versions of Kafka and Spark
(Kafka 3.7.0, released February 27, 2024; and Spark 3.5.1, released February 23, 2024), the
results showed that continuous processing mode showed significantly lower latency when
using the rate source while maintaining the same throughput. However, when using the
Kafka source, continuous processing mode showed worse latency and throughput rates than
micro-batch mode.</p>
      <p>This surfaced a flaw in initial benchmarking configurations, as Kafka produced much
higher throughput than expected, so rate source benchmarks should have been adjusted to
match Kafka throughput rates.</p>
      <p>Also, continuous processing mode's loss in latency to micro-batching indicated that
continuous mode is not running optimally and suggested that high volumes of Kafka
throughput may overflow the Spark application’s ability to process the data promptly,
disrupting latencies. The initial benchmarking results are presented in Table 5.
55 496
81 386
104 553</p>
      <p>Three additional configurations for Kafka source were performed to validate if the number
of Kafka topic partitions impacted bad continuous processing performance, the results of
which are shown in Table 6.</p>
      <p>None of those configurations performed significantly better than the initial ones, proving
that despite working with a possibly non-optimal number of Kafka topic partitions, the reason
for bad continuous processing performance may be related to other issues, such as throughput
overflow.</p>
      <p>When analyzing the sustainable throughput benchmarking results of the micro-batching
mode shown in Figure 1, benchmarks of 3-worker Spark are similar to 16-worker Spark,
which infers that Structured Streaming micro-batch mode works well as long as number of
Spark’s partitions matches the number of Kafka’s partitions. Also, there is a noticeable
correlation between micro-batch mode latency, which gets slightly better with an increase in
throughput but remains in the range from 510 to 570 ms.</p>
      <p>On the other hand, results presented in Figure 2 clearly show that the continuous
processing mode is much more sensitive to Spark’s configuration. Despite generally having
sub-millisecond latency (except the configuration with 10 rps and 3 partitions, where the
average latency reaches over 2 ms), its throughput suffers greatly from configurations where
the number of partitions exceeds the number of workers.</p>
      <p>As a result, it is important to analyze existing worker count and partition count
configurations when transitioning from micro-batching mode to continuous processing, as
continuous processing launches long-running tasks, which continuously work with a single
partition. Therefore, not having enough tasks will leave some partitions unprocessed, which
may lead to substantial data loss that may be mistaken as a throughput drop.</p>
      <p>After observing the benchmark results depicted in Figures 1 and 2, it was decided to
expand the research by decoupling the Spark partition count from the Kafka partition count to
see if further improvements could be made. Results of micro-batching mode benchmarking
are shown in Figure 3, and continuous mode in Figure 4.</p>
      <p>Throughput and latencies did not significantly change, and for further benchmarks, 16
Spark partitions and 16 Kafka partitions were decided to be the most suitable configurations
for both micro-batching and continuous modes. However, during the benchmark for
continuous mode at a rate source set to 10 000 rps, the throughput resulted in 16 000 rps, and
after investigating the issue, it was concluded that the rate source might be unreliable starting
at 10 000 rps for continuous processing mode. Additional tests in the 1 001 – 9 999 rps range
were not performed, so the reliability of the rate source at that throughput level is
questionable.</p>
      <p>The instability of the rate source for continuous processing was further confirmed by
conducting a benchmark for 100 000 rps, where micro-batching mode showed 100 000 rps and
continuous mode showed 1 063 758 (more than one million) rps, which exceeds the expected
throughput by ten times. The investigation established that the issue does not arise from
atleast-once delivery guarantees, as no duplicate record values were present in the Kafka sink,
meaning each record was unique. Average latencies concluded 537 milliseconds at 100 000
records/s for micro-batch and 41 297 milliseconds at 1 063 758 records/s for continuous mode.</p>
      <p>After doing comprehensive research on the rate source and tuning optimal parameters for
continuous processing, the last benchmark was attempted to once again measure continuous
mode latencies in a simulation close to a real-world use case. Because of bad continuous
processing mode performance on high workload levels, the file source in Kafka Connect was
replaced by a custom script that implements rate-limiting data read from a corpus on a row
count basis. The benchmark was executed on 1 000, 10 000, and 100 000 rps, with partition
count in both Kafka and Spark set to 16, with 16 workers. Benchmarking results are provided
in Table 7.</p>
      <p>The results have shown that given adjusted parameters for continuous processing mode
and rate-limited throughput to 100 000 rps, the throughput got worse by around 20% while
improving the mean latency by around 310%. Rate-limiting source to 10 000 rps produced a
mean latency of 260 ms, the lowest latency achieved for a Kafka source in continuous mode in
the scope of this research.</p>
    </sec>
    <sec id="sec-5">
      <title>5. Conclusion</title>
      <p>Spark Structured Streaming’s Continuous Processing mode prioritizes low-latency data
processing, offering users a strategic choice between optimizing throughput and minimizing
latency. The platform's use of a declarative API simplifies the construction of robust data
pipelines and allows for relatively straightforward toggling between micro-batch and
continuous modes. This flexibility is advantageous as it requires minimal code changes,
making it accessible for users to adjust their processing strategies based on evolving data
requirements or operational objectives.</p>
      <p>The methodology that was proposed in the paper involved creating a simple pipeline
supported by micro-batching and continuous processing modes in Apache Spark, using two
data sources – Rate source and Kafka topic containing text data from Ukrainian Wikipedia –
and varying sources throughput, number of Kafka partitions, and number of Spark workers in
order to measure Spark’s throughput and latency.</p>
      <p>The results have shown that transitioning between these modes is not merely a matter of
code adaptation; it often necessitates tailored adjustments to the Spark configuration. This is
due to the inherent architectural distinctions between how micro-batch and continuous
processing modes manage data flows and system resources. Each mode is optimized for
different aspects of streaming analytics, with micro-batch providing robustness and fault
tolerance and continuous processing focusing on reducing processing time to the minimum.
The lowest mean latencies achieved for continuous processing mode was 2 ms using rate
source (in contrast to 528 ms in micro-batch mode) and 260 ms using Kafka source (in contrast
to 197 ms in micro-batch mode).</p>
      <p>Furthermore, continuous processing mode must be carefully managed to balance the
inherent trade-offs between latency and throughput. In scenarios where the data inflow
exceeds the system's processing capacity, there is a significant risk of increased latency,
contradicting the primary goal of this mode. Therefore, continuous mode is not universally
superior; its effectiveness is contingent upon the specific characteristics and demands of the
workload. Conducting thorough performance evaluations, including stress testing under peak
data loads, is essential to ensure that the system remains performant and that latency stays
within acceptable bounds.</p>
      <p>To fully leverage the potential of Continuous Processing mode in Spark Structured
Streaming, developers and system architects need to fine-tune configurations and regularly
monitor system performance. This proactive approach ensures that the streaming process
remains efficient and aligns with their applications' latency and throughput requirements.
Ultimately, the choice between micro-batch and continuous processing modes should be
informed by a comprehensive understanding of the trade-offs involved and a strategic
assessment of the application’s operational priorities.</p>
    </sec>
    <sec id="sec-6">
      <title>6. Limitations and Further Research</title>
      <p>Further research could be conducted to reach sub-millisecond latencies in the Kafka source
instead of the rate source. The relation between Kafka topic message format (Avro, JSON,
Protobuf, etc.) and Continuous Processing latency may be investigated. Also, as the
benchmarks were conducted on one machine to eliminate possible latency overheads from the
networking side, benchmarks could be tested on standalone clusters. Benchmarking pipelines
with user-defined functions (UDFs) and MLlib also could be an interesting topic for extending
research.</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          [1]
          <string-name>
            <given-names>H.</given-names>
            <surname>Isah</surname>
          </string-name>
          ,
          <string-name>
            <given-names>T.</given-names>
            <surname>Abughofa</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Mahfuz</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D.</given-names>
            <surname>Ajerla</surname>
          </string-name>
          ,
          <string-name>
            <given-names>F.</given-names>
            <surname>Zulkernine</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Khan</surname>
          </string-name>
          ,
          <article-title>A Survey of Distributed Data Stream Processing Frameworks</article-title>
          , in: IEEE Access, vol.
          <volume>7</volume>
          , pp.
          <fpage>154300</fpage>
          -
          <lpage>154316</lpage>
          ,
          <year>2019</year>
          , doi: 10.1109/ACCESS.
          <year>2019</year>
          .
          <volume>2946884</volume>
          .
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          [2]
          <string-name>
            <given-names>E.</given-names>
            <surname>Mehmood</surname>
          </string-name>
          , T. Anees,
          <article-title>Challenges and Solutions for Processing Real-Time Big Data Stream: A Systematic Literature Review</article-title>
          , in: IEEE Access, vol.
          <volume>8</volume>
          , pp.
          <fpage>119123</fpage>
          -
          <lpage>119143</lpage>
          ,
          <year>2020</year>
          , doi: 10.1109/ACCESS.
          <year>2020</year>
          .
          <volume>3005268</volume>
          .
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          [3]
          <string-name>
            <given-names>J.</given-names>
            <surname>Torres</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Armbrust</surname>
          </string-name>
          ,
          <string-name>
            <surname>T. Das</surname>
            ,
            <given-names>S.</given-names>
          </string-name>
          <string-name>
            <surname>Zhu</surname>
          </string-name>
          , Introducing Low-latency
          <source>Continuous Processing Mode in Structured Streaming in Apache Spark 2.3</source>
          ,
          <year>2018</year>
          . URL: https://www.databricks.com/blog/2018/03/20/low-latency
          <article-title>-continuous-processingmode-in-structured-streaming-in-apache-spark-2-3-0</article-title>
          .html.
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          [4]
          <string-name>
            <given-names>M.</given-names>
            <surname>Armbrust</surname>
          </string-name>
          ,
          <string-name>
            <surname>T. Das</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          <string-name>
            <surname>Torres</surname>
            ,
            <given-names>B.</given-names>
          </string-name>
          <string-name>
            <surname>Yavuz</surname>
            ,
            <given-names>S.</given-names>
          </string-name>
          <string-name>
            <surname>Zhu</surname>
            ,
            <given-names>R.</given-names>
          </string-name>
          <string-name>
            <surname>Xin</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          <string-name>
            <surname>Ghodsi</surname>
            ,
            <given-names>I. Stoica</given-names>
          </string-name>
          , and
          <string-name>
            <given-names>M.</given-names>
            <surname>Zaharia</surname>
          </string-name>
          , Structured Streaming:
          <article-title>A Declarative API for Real-Time Applications in Apache Spark</article-title>
          ,
          <source>in: Proceedings of the 2018 International Conference on Management of Data (SIGMOD '18)</source>
          .
          <article-title>Association for Computing Machinery</article-title>
          , New York, NY, USA,
          <year>2018</year>
          , pp.
          <fpage>601</fpage>
          -
          <lpage>613</lpage>
          . URL: https://doi.org/10.1145/3183713.3190664.
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          [5]
          <string-name>
            <given-names>Y.</given-names>
            <surname>Drohobytskiy</surname>
          </string-name>
          ,
          <string-name>
            <given-names>V.</given-names>
            <surname>Brevus</surname>
          </string-name>
          ,
          <string-name>
            <given-names>Y.</given-names>
            <surname>Skorenkyy</surname>
          </string-name>
          , Spark Structured Streaming:
          <article-title>Customizing Kafka Stream Processing</article-title>
          , in: 2020
          <source>IEEE Third International Conference on Data Stream Mining &amp; Processing (DSMP)</source>
          , Lviv, Ukraine,
          <year>2020</year>
          , pp.
          <fpage>296</fpage>
          -
          <lpage>299</lpage>
          , doi: 10.1109/DSMP47368.
          <year>2020</year>
          .
          <volume>9204304</volume>
          .
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          [6]
          <string-name>
            <given-names>H.</given-names>
            <surname>Mcheick</surname>
          </string-name>
          ,
          <string-name>
            <given-names>Y. D. F.</given-names>
            <surname>Petrillo</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Ben-Ali</surname>
          </string-name>
          ,
          <article-title>Quality Model for Evaluating and Choosing a Stream Processing Framework Architecture</article-title>
          ,
          <source>in: 2019 IEEE/ACS 16th International Conference on Computer Systems and Applications (AICCSA)</source>
          ,
          <source>Abu Dhabi, United Arab Emirates</source>
          ,
          <year>2019</year>
          , pp.
          <fpage>1</fpage>
          -
          <lpage>7</lpage>
          , doi: 10.1109/AICCSA47632.
          <year>2019</year>
          .
          <volume>9035283</volume>
          .
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          [7]
          <string-name>
            <given-names>J.</given-names>
            <surname>Karimov</surname>
          </string-name>
          ,
          <string-name>
            <given-names>T.</given-names>
            <surname>Rabl</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Katsifodimos</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R.</given-names>
            <surname>Samarev</surname>
          </string-name>
          ,
          <string-name>
            <given-names>H.</given-names>
            <surname>Heiskanen</surname>
          </string-name>
          ,
          <string-name>
            <given-names>V.</given-names>
            <surname>Markl</surname>
          </string-name>
          ,
          <source>Benchmarking Distributed Stream Data Processing Systems, in: 2018 IEEE 34th International Conference on Data Engineering (ICDE)</source>
          , Paris, France,
          <year>2018</year>
          , pp.
          <fpage>1507</fpage>
          -
          <lpage>1518</lpage>
          , doi: 10.1109/ICDE.
          <year>2018</year>
          .
          <volume>00169</volume>
          .
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          [8]
          <string-name>
            <given-names>G.</given-names>
            <surname>Van Dongen</surname>
          </string-name>
          ,
          <string-name>
            <surname>D. Van den Poel</surname>
          </string-name>
          ,
          <source>Evaluation of Stream Processing Frameworks, in: IEEE Transactions on Parallel and Distributed Systems</source>
          , vol.
          <volume>31</volume>
          , no.
          <issue>8</issue>
          , pp.
          <fpage>1845</fpage>
          -
          <lpage>1858</lpage>
          , 1 Aug.
          <year>2020</year>
          , doi: 10.1109/TPDS.
          <year>2020</year>
          .
          <volume>2978480</volume>
          .
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          [9]
          <string-name>
            <given-names>G.</given-names>
            <surname>Van Dongen</surname>
          </string-name>
          ,
          <string-name>
            <surname>D.</surname>
          </string-name>
          <article-title>Van den Poel, A Performance Analysis of Fault Recovery in Stream Processing Frameworks</article-title>
          , in: IEEE Access, vol.
          <volume>9</volume>
          , pp.
          <fpage>93745</fpage>
          -
          <lpage>93763</lpage>
          ,
          <year>2021</year>
          , doi: 10.1109/ACCESS.
          <year>2021</year>
          .
          <volume>3093208</volume>
          .
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          [10]
          <string-name>
            <given-names>G.</given-names>
            <surname>Van Dongen</surname>
          </string-name>
          ,
          <string-name>
            <surname>D. Van den Poel</surname>
          </string-name>
          ,
          <article-title>Influencing Factors in the Scalability of Distributed Stream Processing Jobs</article-title>
          , in: IEEE Access, vol.
          <volume>9</volume>
          , pp.
          <fpage>109413</fpage>
          -
          <lpage>109431</lpage>
          ,
          <year>2021</year>
          , doi: 10.1109/ACCESS.
          <year>2021</year>
          .
          <volume>3102645</volume>
          .
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>