<!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>How to become a (Throughput) Billionaire: The Stream Processing Engine PipeFabric</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Constantin Pohl TU Ilmenau</string-name>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Germany constantin.pohl@tu-ilmenau.de</string-name>
        </contrib>
      </contrib-group>
      <pub-date>
        <year>2019</year>
      </pub-date>
      <fpage>2</fpage>
      <lpage>7</lpage>
      <abstract>
        <p>The ability to process data in real time has gained more and more importance in the last years through the rise of IoT and Industry 4.0. Stream processing engines were developed to handle huge amounts of data with high throughput under tight latency constrains. Trends in modern hardware have led to further specializations to e ciently utilize their chances and opportunities, like parallelization to multiple cores, vectorization, or awareness of NUMA. In this paper, we present the stream processing engine PipeFabric, which is under ongoing development at our department. We will describe internal concepts and stream semantics along with decisions taken in the design space. In addition, we will show challenges posed by modern hardware that we are considering to improve performance and usability of our engine. Finally, we underline the potential of PipeFabric by running parallelized queries on a single Xeon Phi processor, resulting in about 1.3 billion tuples processed per second.</p>
      </abstract>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>1. INTRODUCTION</title>
      <p>Various applications require processing and analysis of
data continously with short response times. To point an
example, smart manufacturing machines of Industry 4.0 use
sensors to stream their status information, allowing to detect
and correct anomalies in their behavior as fast as possible.</p>
      <p>
        In the early 2000s, the rst stream processing engines
(often referred to as SPEs) were published, clearly
outperforming relational DBMS for this task [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ]. The
one-tuple-ata-time concept (also known as Volcano style from Graefe
[
        <xref ref-type="bibr" rid="ref2">2</xref>
        ]) for data streaming allowed SPEs to keep individual
tuple latencies low. To increase throughput in terms of tuples
processed per second, micro-batching strategies as well as
data parallelization by partitioning were applied and re ned
over time.
      </p>
      <p>Recent work focuses on exploitation of modern hardware,
since memory as well as processors tend to become more and
more specialized to better solve di erent requirements of
applications. GPUs, Multi- and Manycore CPUs, FPGAs, or
even Vector Engines on processor side, HBM, NVM, HDD,
or SSD on memory side show massively di erent
behavior under di erent tasks and come with various con
gurations and challenges to utilize them e ciently. To combine
high throughput as well as low latency data processing with
opportunities given by modern hardware, we introduce our
SPE PipeFabric1 in this paper, along with its concepts and
design decisions.
2.</p>
    </sec>
    <sec id="sec-2">
      <title>RELATED WORK</title>
      <p>There are many SPEs published in the past, some being
frameworks developed by research groups, others being
commercially used engines in industry. In this section, we give a
short overview of selected SPEs, classi ed into the scale-up
(single node) and scale-out (distributed) principle.</p>
      <p>
        Aurora [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ] was one of the rst general purpose SPEs that
specialized on answering queries on data streams in
realtime. Queries are described by directed graphs, connecting
di erent operators together and thus forming the data ow.
Since Aurora was designed to run on a single node, the
Borealis [
        <xref ref-type="bibr" rid="ref4">4</xref>
        ] SPE added fault-tolerance and consistency to run
in a distributed setting.
      </p>
      <p>
        Other recent distributed SPEs are Apache Flink [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ]
(forked from the Stratosphere engine), Apache Storm [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ], and
Apache Spark Streaming [
        <xref ref-type="bibr" rid="ref7">7</xref>
        ]. All of them can be
commonly found in various companies, having a large user base.
Their main goal in addition to low latency and high
throughput is scalability, along with fault tolerance within a
distributed setting. Processing Big Data under real-time
constraints requires the distribution of computation to multiple
machines in a cluster eventually, since scale-up is limited.
      </p>
      <p>
        Nevertheless, scale-up solutions can also come very far for
a fraction of monetary cost of a distributed solution.
SABER [
        <xref ref-type="bibr" rid="ref8">8</xref>
        ] and StreamBox [
        <xref ref-type="bibr" rid="ref9">9</xref>
        ] are two SPEs that are
optimized to run on a single node. While SABER can be executed
on heterogeneous processing units like GPUs, StreamBox
can run on Manycore CPUs supporting out of order tuple
processing.
      </p>
      <p>Finally, our SPE PipeFabric can be classi ed into the
eld of scale-up SPEs, focused on e cient execution of
queries on Multicore and Manycore CPUs.
1Open Source, https://github.com/dbis-ilm/pipefabric</p>
    </sec>
    <sec id="sec-3">
      <title>3. STREAM PROCESSING PARADIGM</title>
      <p>With the goal of low latency in mind, the general
streaming work ow follows the one-tuple-at-a-time strategy.
However, if latency requirements can be relaxed, gathering
tuples together into batches for less communication e orts (like
function calls) and vectorized processing can greatly increase
throughput.</p>
      <p>PipeFabric provides a query structure called Topology
(like Apache Flink), which contains one or more streaming
sources, operators applied on them, and optional stream
sinks. Topologies can be conceptually seen as directed
acyclic graphs routing tuples through di erent operators (see
Figure 1).</p>
      <p>This query example consist of two input data streams,
two operators applied on each of them (specifying the key
attribute and window semantics), combined together by a
join with a nal grouping on a certain attribute.</p>
      <p>Operators (called Pipes) are connected via channels,
following the publish/subscribe pattern. They can connect to
any operator upstream by subscribing, publishing their own
results to other operators downstream. To reduce overhead,
only tuple pointers are passed between them. The following
subsections brie y describe the di erent sources, operators,
and sinks in our SPE.
3.1</p>
    </sec>
    <sec id="sec-4">
      <title>Stream Sources</title>
      <p>Stream sources produce tuples for individual queries, thus
being the necessary query starting points. The main sources
of streaming are tuples provided via di erent network
protocols, les (or tables), other streams, or specialized sources.
Network protocols. The most common source for tuples
are servers or sensors that deliver data being processed
continuously. PipeFabric can connect via REST API, RabbitMQ,
Apache Kafka, MQTT, and ZeroMQ. Protocol logic for the
connection is internally realized within the parametrizable
source operators, hidden from the user.</p>
      <p>Files/Tables. Data streams can also subscribe to di erent
les like CSVs or binaries, as well as relational tables.
Therefore, a query can also run di erent benchmarks provided
as les on the le system. A special use case are tables e.g.
from RocksDB, allowing also to use transactional semantics
on operations under ACID guarantees.</p>
      <p>Streams. Another source is the subscription on already
dened PipeFabric streams. This allows queries to send their
results conceptually as a new data stream on which other
queries can subscribe to.</p>
      <p>
        Specialized sources. In addition, PipeFabric provides
various specialized source operators for di erent use cases. To
run the Linear Road benchmark [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ], a synchronized source is
provided, publishing tuples from a le in real-time according
to its timestamp. Another specialized source is the data
generator, which will continuously generate tuples according
to a format speci ed by the user. One last example is the
matrix source, sending lines, columns, or even full matrices
represented as tuples.
3.2
      </p>
    </sec>
    <sec id="sec-5">
      <title>Operators</title>
      <p>
        PipeFabric supports various operator types being applied
on incoming tuples. The most common single source
operators are the projection of attributes, applied predicates
(selections), aggregations, or groupings. Each of them has
its own operator which can also be con gured, e.g. to
choose an aggregation type (count, sum, etc.). To join multiple
sources, PipeFabric uses the non-blocking symmetric hash
join in addition to the recently published ScaleJoin
algorithm [
        <xref ref-type="bibr" rid="ref10">10</xref>
        ]. With a customizable operator called notify, it
is also possible to apply any UDFs on incoming tuples via
lambda functions.
3.3
      </p>
    </sec>
    <sec id="sec-6">
      <title>Stream Sinks</title>
      <p>Sinks are operators which logically terminate a stream or
query. It is possible to write query results on the y into les,
tables, or a new data stream. Results can also be returned
as a general output, e.g. for visualization in a GUI. However,
PipeFabric currently does not have an own visualization tool
like e.g. Aurora has.</p>
    </sec>
    <sec id="sec-7">
      <title>4. STREAMING CONCEPTS</title>
      <p>In this section, we further describe streaming concepts of
SPEs which are also realized in PipeFabric.</p>
      <p>Partitioning/Merging. To utilize intra-query parallelism,
it is possible to create multiple instances of the same
operator, splitting tuples with a partitioning function and
merging results of partitions afterwards. This concept is shown
in Figure 2.
Each partition is run by a separate thread, exchanging
tuples with a synchronized queue. This allows the utilization
of all cores on a Multicore or even Manycore CPU, increasing
throughput massively if the computational requirements
within a partition are high enough to justify synchronization
e orts.</p>
      <p>Batching/Unbatching. As previously mentioned, batching
tuples together reduces communication e orts (especially
between threads) and enables vectorized execution of
operations. In PipeFabric, a batch as well as unbatch operator is
provided. The batch operator stores incoming tuple pointers
internally until a given batch size is reached, forwarding the
batch at once by creating and passing a batch pointer to
the next operator. The unbatch operator does the opposite,
extracting tuple pointers from a batch and forwarding them
again one after another.</p>
      <p>Window. A window operator tracks incoming tuples for
marking them as outdated after a while. Outdated tuples
do not participate in stateful operations like aggregates or
joins, being removed from those states for further
calculations. Long running queries can therefore discard tuples after a
while, keeping the memory footprint low and also
manageable. Most common window algorithms are the tumbling and
sliding window. The former drops all tuples at once when
its size is reached while the latter slowly fades out tuples
individually. Figure 3 visualizes the concept for the sliding
window calculating an aggregate.</p>
      <p>Both window types can discard tuples based on time or
tuple count. PipeFabric uses a list data structure for the
window state internally to allow e cient appending and
removing at both ends of the list.</p>
      <p>
        Transaction Support. Transactions are a common concept
in relational database systems. They wrap operations on
tables together, providing ACID guarantees to always
ensure consistency of the database. Since PipeFabric can also
stream data from or to tables, it contains basic transaction
support for recovery and consistency [
        <xref ref-type="bibr" rid="ref11">11</xref>
        ]. To point an
example, a query writing to a table executes the changes through
running transactions, while multiple queries reading and
writing need isolation to guarantee correctness additionally.
      </p>
    </sec>
    <sec id="sec-8">
      <title>MODERN HARDWARE CHALLENGES</title>
      <p>In this section, we give an overview of our ongoing work
with PipeFabric regarding modern hardware, mainly
focusing on Manycore CPU utilization and support for upcoming
NVM technology. Manycore CPUs provide high core
numbers and thus high thread counts, resulting in challenges
in terms of synchronization and thread contention. It is
also important to notice that intra-query parallelism through
multithreading usually leads to tuples arriving out of order
after partitioning which can be a problem for queries
detecting patterns over time.</p>
      <p>On the memory layer, NVM and also high-bandwidth
memory (HBM) pose new challenges for stream processing.
NVM o ers persistence with latencies comparable to main
memory (with a read/write asymmetry), which is interesting
to explore especially for transactional operations on tables.
HBM on the other hand o ers great performance for
applications being memory bound at the cost of small capacity,
leading to optimization problems where to use it for the
greatest performance bene t.
140000
120000
100000
d
n
coe 80000
rs
e
p
lse 60000
p
u
T
40000
20000</p>
      <p>00
5.1</p>
      <p>Data stream behavior can change during runtime. This
means that the amount of tuples arriving per second can
change, leading to di erent amounts of partitions that would
be ideal to solve that moment of the query. If the degree of
partitioning is too high, computing resources are wasted,
which is also a common problem for cloud providers. On
the other hand, if the workload is underestimated, too less
partitions cannot catch up with tuple arrival rates leading
to wrong results because of tuples being discarded due to
full bu ers.</p>
      <p>Dynamic partitioning approaches address this problem by
using a partitioning function that can be changed over time.
This allows to counter skewed streams by dynamically
changing the tuple routes to underutilized partitions.
Nevertheless, one step further is the adaptive partitioning strategy
where not only the function is variable but also the
number of partitions can change. Figure 4 shows recent work for
an adaptive partitioning strategy within PipeFabric, where
the y-axis describes the number of tuples arriving per
second. The partitions are directly converted into throughput
to allow a better comparison.</p>
      <p>Dataset</p>
      <p>Partitions [tp/s overall]</p>
      <p>The migration problem can be solved by stopping the
query, performing the state migration, and resuming. However,
this can break latency constraints since during a stop the
processing cannot continue. A better proposed solution is to
create a parallel state which gets duplicates of new tuples
until both states are equal. Then, the original state can be
dropped safely.</p>
      <p>PipeFabric currently uses a static partitioning concept
where the number of partitions as well as the partitioning
function does not change. At the moment we are
investigating possibilities and options to apply an adaptive approach
to fully utilize a Manycore CPU under skewed data stream
behavior.
5.2</p>
    </sec>
    <sec id="sec-9">
      <title>Order-Preserved Merging</title>
      <p>As mentioned in the last section, partitioning can lead to
out of order tuples afterwards, e.g. when a predicate within a
partition drops more or less tuples or a hash table for joining
tuples has a chain of cache misses on probing. Ordering the
output without blocking results can be di cult.</p>
      <p>A solution for this problem is to store incoming tuples
in di erent queues per partition. Then, the merge operation
can check and compare the rst elements in all of the queues,
forwarding the oldest tuple among them (see Figure 5 for the
general idea).</p>
      <p>
        For the special case that one partition is not producing
any outputs, it is possible to add a dummy element after a
certain time to guarantee ordered execution only within a
certain time frame. This strategy is also named as k-slack
algorithm [
        <xref ref-type="bibr" rid="ref12">12</xref>
        ].
      </p>
      <p>Regarding PipeFabric, we would like to combine an
orderpreserved merge with an adaptive partitioning approach.
This means that on a change on the partition number the
sorted merge operation has additional overhead on
synchronization with the adaptive partitioner, since it has to know
which partition will be removed soon.
5.3</p>
    </sec>
    <sec id="sec-10">
      <title>Real-time Query Modification</title>
      <p>
        Even if not directly hardware-related, it would be a quality
of life feature to be able to change the query (which possibly
runs for weeks or months) without restarting it [
        <xref ref-type="bibr" rid="ref13">13</xref>
        ]. Over a
longer period, the query states can become huge, especially
when the query has a lot of operators, not even to mention
the time lost when the state is migrated into a new query. To
add real-time query modi cation, we would like to address
the following use cases:
      </p>
      <p>Add or remove a new operator within the query
data ow.</p>
      <p>Change the function (UDF) of a single operator.
For our SPE PipeFabric, these features need an additional
controller thread that can be invoked by the user to trigger
a query modi cation. To add or remove a new operator, the
previous as well as next operator within the query need a
noti cation to not exchange tuples anymore. After that
notication, the new operator must be created and connected to
others with publish/subscribe channels. When the
connection is nished, new noti cations must be sent to again allow
tuple exchange.</p>
      <p>When the UDF of an operator is changed, only this
operator is involved in modi cation. This means that the function
cannot be executed while it is changing, leading to noti
cations being necessary again.</p>
      <p>For both modi cations, tuples have to be bu ered while
the query is changed. Ideally, the modi cation is done
during a delay in tuple arrival of the data stream, else a short
blocking is inevitable.
5.4</p>
    </sec>
    <sec id="sec-11">
      <title>HBM Allocation on States</title>
      <p>
        One of our previous works [
        <xref ref-type="bibr" rid="ref14">14</xref>
        ] investigated HBM impact
on di erent query states. We concluded that for operations
with small states like aggregates it is not useful at all, while
windows can bene t a little from more bandwidth. Stream
sources on the other hand greatly bene t from HBM.
      </p>
      <p>In a followup work, we will integrate HBM detection
within our SPE along with the provision of custom HBM state
allocators. In addition to that, we would like to add a cost
model for HBM to allow a query optimizer to choose
between the di erent memory types. Finally, since the
symmetric hash join only marginally improves with more
bandwidth (being mostly latency bound), we are investigating
di erent stream join algorithms to improve bandwidth
utilization especially on a Xeon Phi processor.
5.5</p>
    </sec>
    <sec id="sec-12">
      <title>Lockfree Data Structures</title>
      <p>With Manycore CPUs, the degree of contention on shared
data structures can nullify any advantage of
parallelization. The usage of ne grained locks or latches along with
optimistic concurrency protocols can improve scalability a
lot. Recent work on PipeFabric investigated lockfree data
structures for states that are accessed by multiple threads
concurrently.</p>
      <p>Queues between threads are a prominent example,
where specialized lockfree queues (the so-called Single Producer
Single Consumer (SPSC) queues) realized as ring bu ers
greatly enhance performance. Hash tables for joins are
another common structure to bene t from the lockfree
paradigm, which is not only restricted to stream processing but
also for joins on relational tables.</p>
      <p>Lockfree programming usually has a huge disadvantage
when it comes to debugging or guaranteeing thread
safety. However, there are high level abstractions in libraries
like Boost2 or Intel TBB3 which hide lockfree operations
behind a user-friendly interface. Currently PipeFabric still
uses locks and latches, but to improve throughput, we plan
to add lockfree pendants in the near future.
5.6</p>
    </sec>
    <sec id="sec-13">
      <title>Multiway-Stream Join</title>
      <p>The symmetric hash join within PipeFabric is a binary
hash join, which means that it can only join two connected
input streams. To join a higher number of stream sources,
the current solution leads to a binary tree of symmetric hash
join operators with the following problems:</p>
      <p>Individual tuple latency can become extremely bad if
it has to be repeatedly joined from bottom up within
the tree.
2https://www.boost.org/doc/libs/1_66_0/doc/html/lockfree.html
3https://software.intel.com/en-us/node/506169
Since intermediate join results are fully materialized in
each join operator, the memory footprint can become
very large for intermediate hash tables inevitably.
Multiway join operators that can connect to any number of
streams on the other hand look very promising, since a single
join instance has a lot of opportunities to optimize tuple
storage and probe sequences. Figure 6 shows the concept of
a binary join tree compared to a multiway join.</p>
      <p>To e ciently join many concurrent data streams, the join
operator has to minimize probe misses to reduce contention
(e.g. by only probing when matches can be found in all hash
tables). In addition to that, di erent parallelization
strategies (like data parallelism or fully sharing states) are possible
which we like to investigate in future work.</p>
    </sec>
    <sec id="sec-14">
      <title>EXPERIMENTAL EVALUATION</title>
      <p>With this section, we will prove the statement in the title
of this paper experimentally. First, we will list our
experimental setup, followed by the results and discussion
afterwards.
6.1</p>
    </sec>
    <sec id="sec-15">
      <title>Setup</title>
      <p>On the hardware side, we used a Xeon Phi Knights
Landing Manycore CPU (KNL 7210) with 64 cores a 1.3GHz,
supporting up to 4 threads each due to hyperthreading. It
runs in SNC4 mode, which means that the cores are
distributed into four distinct regions classi ed as NUMA nodes.
Along with the CPU comes 16GB HBM on chip, the
socalled Multi-Channel DRAM (MCDRAM). This MCDRAM
provides over 420GB/s memory bandwidth and is con
gured in Flat mode, therefore it can be manually addressed via
Numactl4 or Memkind API5, else it is not used at all.</p>
      <p>We built our SPE PipeFabric with the Intel compiler
version 17.0.6. The operating system is CentOS version 7 running
Linux kernel 3.10. The most important compilation ags are
code optimization with -O3 and -xMIC AVX512 for
autovectorization with AVX512 instruction set.
4https://www.systutorials.com/docs/linux/man/8-numactl/
5http://memkind.github.io/memkind/
6.2</p>
    </sec>
    <sec id="sec-16">
      <title>How to become a Billionaire</title>
      <p>A query that is able to process a billion tuples per
second needs some tuning along with simpli cations,
obviously. First, all input streams are fully allocated within the
MCDRAM rst, there is no regular DDR4 RAM involved,
not to speak of disks like SSDs. The stream query only
applies a selection predicate on each input tuple, forwarding
those tuples that satisfy the predicate to an empty UDF
operator. More computations lead to more work for the threads,
reducing overall throughput. The di erent predicates as well
as their measured impact on performance are summarized
in Table 1.</p>
      <p>Predicate</p>
      <p>true
key mod(2)
key mod(10)
false</p>
      <p>Selectivity
100%
50%
10%
0%
tp/s (256 threads)
720M
937M
1.16B
1.39B</p>
      <p>Next, the query is realized as inter-query parallelism which
means that all 256 threads of the KNL run a local query
version subscribed to an replicated input stream without
contention between them, to overcome the low clock frequency.
We ran the query with a di erent degree of inter-query
parallelism. The selection predicate is false, however, the query
would also allow more than a billion tuples per second with
10% selectivity, as shown in Table 1. The results can be
found in Figure 7.</p>
      <p>The scaling of throughput is close to ideal, where doubling
the number of threads doubles the overall throughput.
However, including concurrent actions like synchronized access
to data structures reduces the scalability the more threads
are added. When using DDR4 memory that has only around
80GB/s bandwidth, the highest throughput is reached at 64
threads with approximately 200 million tuples per second
(not shown in the plot). More than 64 threads degrade
performance on DDR4, since the threads exceed the bandwidth
and thus are idling while the memory controllers nish their
requests.</p>
      <p>In this paper, we presented PipeFabric, a SPE developed
at our department with focus on scale-up performance. First,
we gave an overview of other well-known SPEs, classi ed by
their decision on scaling up or scaling out. After that, we
brie y described stream processing characteristics on the
base of PipeFabric. In addition to the basic concepts, we
extended the section by discussing various streaming
paradigms to better utilize given hardware, like partitioning of
the data ow or batching tuples.</p>
      <p>Then, we came to our current research heavily in uenced
by modern hardware. We explained the challenges posed
mainly by Manycore CPUs as well as HBM, followed by our
recommendations and ideas to improve our SPE. Adaptive
partitioning will allow queries to scale with data stream
behavior, which is even more important on a Manycore CPU
that can provide hundreds of partitions easily. In
combination with an order-preserved merge step, results from the
partitioning can be reordered again, allowing further
analysis downstream (like pattern matching). With long-running
queries, we plan to add query modi cations in real time,
where operators can be added as well as removed without
restarting the query as well as online changeable UDFs. To
better utilize HBM, we will add allocators accordingly,
leading to a cost model for an optimizer being able to decide on
which memory type states should be placed. To further
improve throughput under high contention, lockfree pendants
to our used data structures will be added. And nally, since
a binary join tree badly utilizes bandwidth and hurts
individual latency, we plan to investigate multiway stream joins
in the future.</p>
      <p>After the discussion on modern hardware challenges, we
described our experiments on which we were able to
create a stream query written in PipeFabric, running on the
Xeon Phi processor, leading to more than a billion tuples
processed per second nally. Although the query is more a
synthetical one, it underlines the potential of our SPE,
nevertheless.
8.</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          [1]
          <string-name>
            <given-names>Arvind</given-names>
            <surname>Arasu</surname>
          </string-name>
          , Mitch Cherniack,
          <string-name>
            <given-names>Eduardo F.</given-names>
            <surname>Galvez</surname>
          </string-name>
          , David Maier,
          <string-name>
            <given-names>Anurag</given-names>
            <surname>Maskey</surname>
          </string-name>
          , Esther Ryvkina,
          <string-name>
            <given-names>Michael</given-names>
            <surname>Stonebraker</surname>
          </string-name>
          , and Richard Tibbetts.
          <article-title>Linear Road: A Stream Data Management Benchmark</article-title>
          .
          <source>In VLDB Proceedings</source>
          , Toronto, Canada,
          <source>August 31 - September 3</source>
          <year>2004</year>
          , pages
          <fpage>480</fpage>
          {
          <fpage>491</fpage>
          ,
          <year>2004</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          [2]
          <string-name>
            <given-names>Goetz</given-names>
            <surname>Graefe</surname>
          </string-name>
          .
          <article-title>Volcano - An Extensible and Parallel Query Evaluation System</article-title>
          .
          <source>IEEE Trans. Knowl. Data Eng.</source>
          ,
          <volume>6</volume>
          (
          <issue>1</issue>
          ):
          <volume>120</volume>
          {
          <fpage>135</fpage>
          ,
          <year>1994</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          [3]
          <string-name>
            <surname>Daniel</surname>
            <given-names>J.</given-names>
          </string-name>
          <string-name>
            <surname>Abadi</surname>
            , Donald Carney, Ugur Cetintemel, Mitch Cherniack,
            <given-names>Christian</given-names>
          </string-name>
          <string-name>
            <surname>Convey</surname>
            ,
            <given-names>C.</given-names>
          </string-name>
          <string-name>
            <surname>Erwin</surname>
            ,
            <given-names>Eduardo F.</given-names>
          </string-name>
          <string-name>
            <surname>Galvez</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          <string-name>
            <surname>Hatoun</surname>
            , Anurag Maskey,
            <given-names>Alex</given-names>
          </string-name>
          <string-name>
            <surname>Rasin</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          <string-name>
            <surname>Singer</surname>
            , Michael Stonebraker, Nesime Tatbul, Ying Xing,
            <given-names>R.</given-names>
          </string-name>
          <string-name>
            <surname>Yan</surname>
          </string-name>
          , and
          <string-name>
            <surname>Stanley</surname>
            <given-names>B.</given-names>
          </string-name>
          <string-name>
            <surname>Zdonik</surname>
          </string-name>
          .
          <article-title>Aurora: A Data Stream Management System</article-title>
          .
          <source>In Proceedings of the 2003 ACM SIGMOD International Conference on Management of Data</source>
          , San Diego, California, USA, June 9-12,
          <year>2003</year>
          , page
          <volume>666</volume>
          ,
          <year>2003</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          [4]
          <string-name>
            <given-names>Magdalena</given-names>
            <surname>Balazinska</surname>
          </string-name>
          , Hari Balakrishnan, Samuel Madden, and
          <string-name>
            <given-names>Michael</given-names>
            <surname>Stonebraker</surname>
          </string-name>
          .
          <article-title>Fault-Tolerance in the Borealis Distributed Stream Processing System</article-title>
          .
          <source>In Proceedings of the ACM SIGMOD International Conference on Management of Data</source>
          , Baltimore, Maryland, USA, June 14-16,
          <year>2005</year>
          , pages
          <fpage>13</fpage>
          {
          <fpage>24</fpage>
          ,
          <year>2005</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          [5] Paris Carbone, Stephan Ewen, Gyula Fora, Seif Haridi, Stefan Richter, and
          <string-name>
            <given-names>Kostas</given-names>
            <surname>Tzoumas</surname>
          </string-name>
          .
          <article-title>State Management in Apache Flink R : Consistent Stateful Distributed Stream Processing</article-title>
          . PVLDB,
          <volume>10</volume>
          (
          <issue>12</issue>
          ):
          <volume>1718</volume>
          {
          <fpage>1729</fpage>
          ,
          <year>2017</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          [6]
          <string-name>
            <given-names>Ankit</given-names>
            <surname>Toshniwal</surname>
          </string-name>
          , Siddarth Taneja, Amit Shukla, Karthikeyan Ramasamy,
          <string-name>
            <surname>Jignesh M. Patel</surname>
          </string-name>
          , Sanjeev Kulkarni,
          <string-name>
            <surname>Jason Jackson</surname>
            ,
            <given-names>Krishna</given-names>
          </string-name>
          <string-name>
            <surname>Gade</surname>
          </string-name>
          , Maosong Fu, Jake Donham, Nikunj Bhagat, Sailesh Mittal, and
          <string-name>
            <surname>Dmitriy</surname>
            <given-names>V.</given-names>
          </string-name>
          <string-name>
            <surname>Ryaboy</surname>
          </string-name>
          . Storm @Twitter.
          <source>In SIGMOD</source>
          <year>2014</year>
          ,
          <article-title>Snowbird</article-title>
          ,
          <string-name>
            <surname>UT</surname>
          </string-name>
          , USA, June 22-27,
          <year>2014</year>
          , pages
          <fpage>147</fpage>
          {
          <fpage>156</fpage>
          ,
          <year>2014</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          [7]
          <string-name>
            <given-names>Matei</given-names>
            <surname>Zaharia</surname>
          </string-name>
          ,
          <string-name>
            <surname>Tathagata Das</surname>
          </string-name>
          ,
          <string-name>
            <surname>Haoyuan Li</surname>
            ,
            <given-names>Scott</given-names>
          </string-name>
          <string-name>
            <surname>Shenker</surname>
            , and
            <given-names>Ion</given-names>
          </string-name>
          <string-name>
            <surname>Stoica</surname>
          </string-name>
          .
          <article-title>Discretized Streams: An E cient and Fault-Tolerant Model for Stream Processing on Large Clusters</article-title>
          .
          <source>In 4th USENIX Workshop on Hot Topics in Cloud Computing, HotCloud'12</source>
          , Boston, MA, USA, June 12-13,
          <year>2012</year>
          ,
          <year>2012</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          [8]
          <string-name>
            <given-names>Alexandros</given-names>
            <surname>Koliousis</surname>
          </string-name>
          , Matthias Weidlich, Raul Castro Fernandez, Alexander L. Wolf, Paolo Costa, and
          <string-name>
            <surname>Peter R. Pietzuch</surname>
          </string-name>
          . SABER:
          <article-title>Window-Based Hybrid Stream Processing for Heterogeneous Architectures</article-title>
          .
          <source>In Proceedings of the 2016 International Conference on Management of Data, SIGMOD Conference</source>
          <year>2016</year>
          , San Francisco, CA, USA, June 26 - July 01,
          <year>2016</year>
          , pages
          <fpage>555</fpage>
          {
          <fpage>569</fpage>
          ,
          <year>2016</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          [9]
          <string-name>
            <given-names>Hongyu</given-names>
            <surname>Miao</surname>
          </string-name>
          , Heejin Park, Myeongjae Jeon, Gennady Pekhimenko,
          <string-name>
            <surname>Kathryn S. McKinley</surname>
          </string-name>
          , and
          <article-title>Felix Xiaozhu Lin</article-title>
          .
          <source>StreamBox: Modern Stream Processing on a Multicore Machine. In 2017 USENIX Annual Technical Conference, USENIX ATC</source>
          <year>2017</year>
          , Santa Clara, CA, USA, July
          <volume>12</volume>
          -
          <issue>14</issue>
          ,
          <year>2017</year>
          ., pages
          <volume>617</volume>
          {
          <fpage>629</fpage>
          ,
          <year>2017</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          [10]
          <string-name>
            <surname>Vincenzo</surname>
            <given-names>Gulisano</given-names>
          </string-name>
          , Yiannis Nikolakopoulos, Marina Papatrianta lou, and Philippas Tsigas.
          <article-title>ScaleJoin: a Deterministic, Disjoint-Parallel and Skew-Resilient Stream Join</article-title>
          .
          <source>In 2015 IEEE International Conference on Big Data, Big Data</source>
          <year>2015</year>
          , Santa Clara, CA, USA,
          <source>October 29 - November 1</source>
          ,
          <year>2015</year>
          , pages
          <fpage>144</fpage>
          {
          <fpage>153</fpage>
          ,
          <year>2015</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          [11]
          <string-name>
            <given-names>Philipp</given-names>
            <surname>Goetze</surname>
          </string-name>
          and
          <string-name>
            <surname>Kai-Uwe Sattler</surname>
          </string-name>
          .
          <article-title>Snapshot Isolation for Transactional Stream Processing</article-title>
          .
          <source>In Proceedings of the 22th International Conference on Extending Database Technology</source>
          ,
          <string-name>
            <surname>EDBT</surname>
          </string-name>
          <year>2019</year>
          .
          <article-title>OpenProceedings</article-title>
          .org,
          <year>March 2019</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          [12]
          <string-name>
            <given-names>Christopher</given-names>
            <surname>Mutschler</surname>
          </string-name>
          and
          <string-name>
            <given-names>Michael</given-names>
            <surname>Philippsen</surname>
          </string-name>
          .
          <article-title>Distributed Low-Latency Out-of-Order Event Processing for High Data Rate Sensor Streams</article-title>
          .
          <source>In 27th IEEE International Symposium on Parallel and Distributed Processing</source>
          ,
          <string-name>
            <surname>IPDPS</surname>
          </string-name>
          <year>2013</year>
          , Cambridge, MA, USA, May
          <volume>20</volume>
          -24,
          <year>2013</year>
          , pages
          <fpage>1133</fpage>
          {
          <fpage>1144</fpage>
          ,
          <year>2013</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          [13]
          <string-name>
            <surname>Adrian</surname>
            <given-names>Bartnik</given-names>
          </string-name>
          ,
          <source>Bonaventura Del Monte</source>
          ,
          <string-name>
            <given-names>Tilmann</given-names>
            <surname>Rabl</surname>
          </string-name>
          , and
          <string-name>
            <given-names>Volker</given-names>
            <surname>Markl</surname>
          </string-name>
          .
          <article-title>On-the- y Recon guration of Query Plans for Stateful Stream Processing Engines</article-title>
          .
          <source>In BTW Proceedings, 4.-8. March</source>
          <year>2019</year>
          , Rostock, Germany, pages
          <volume>127</volume>
          {
          <fpage>146</fpage>
          ,
          <year>2019</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>
          [14]
          <string-name>
            <given-names>Constantin</given-names>
            <surname>Pohl</surname>
          </string-name>
          .
          <article-title>Stream Processing on High-Bandwidth Memory</article-title>
          .
          <source>In Proceedings of the 30th GI-Workshop Grundlagen von Datenbanken</source>
          , Wuppertal, Germany, May 22-25,
          <year>2018</year>
          ., pages
          <volume>41</volume>
          {
          <fpage>46</fpage>
          ,
          <year>2018</year>
          .
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>