blob: 9936910a58f12ffbf4a8fd2a703170a9d6e785ae [file] [log] [blame]
<!--
▄▄▄ ██▓███ ▄▄▄ ▄████▄ ██░ ██ ▓█████ ██▓ ▄████ ███▄ █ ██▓▄▄▄█████▓▓█████
▒████▄ ▓██░ ██▒▒████▄ ▒██▀ ▀█ ▓██░ ██▒▓█ ▀ ▓██▒ ██▒ ▀█▒ ██ ▀█ █ ▓██▒▓ ██▒ ▓▒▓█ ▀
▒██ ▀█▄ ▓██░ ██▓▒▒██ ▀█▄ ▒▓█ ▄ ▒██▀▀██░▒███ ▒██▒▒██░▄▄▄░▓██ ▀█ ██▒▒██▒▒ ▓██░ ▒░▒███
░██▄▄▄▄██ ▒██▄█▓▒ ▒░██▄▄▄▄██ ▒▓▓▄ ▄██▒░▓█ ░██ ▒▓█ ▄ ░██░░▓█ ██▓▓██▒ ▐▌██▒░██░░ ▓██▓ ░ ▒▓█ ▄
▓█ ▓██▒▒██▒ ░ ░ ▓█ ▓██▒▒ ▓███▀ ░░▓█▒░██▓░▒████▒ ░██░░▒▓███▀▒▒██░ ▓██░░██░ ▒██▒ ░ ░▒████▒
▒▒ ▓▒█░▒▓▒░ ░ ░ ▒▒ ▓▒█░░ ░▒ ▒ ░ ▒ ░░▒░▒░░ ▒░ ░ ░▓ ░▒ ▒ ░ ▒░ ▒ ▒ ░▓ ▒ ░░ ░░ ▒░ ░
▒ ▒▒ ░░▒ ░ ▒ ▒▒ ░ ░ ▒ ▒ ░▒░ ░ ░ ░ ░ ▒ ░ ░ ░ ░ ░░ ░ ▒░ ▒ ░ ░ ░ ░ ░
░ ▒ ░░ ░ ▒ ░ ░ ░░ ░ ░ ▒ ░░ ░ ░ ░ ░ ░ ▒ ░ ░ ░
░ ░ ░ ░░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░
-->
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Expires" content="0" />
<title>Apache Ignite - Streaming and CEP</title>
<link media="all" rel="stylesheet" href="/css/all.css">
<link href="https://netdna.bootstrapcdn.com/font-awesome/4.2.0/css/font-awesome.css" rel="stylesheet">
<link href='https://fonts.googleapis.com/css?family=Open+Sans:400,300,300italic,400italic,600,600italic,700,700italic,800,800italic' rel='stylesheet' type='text/css'>
<!--#include virtual="/includes/sh.html" -->
</head>
<body>
<div id="wrapper">
<!--#include virtual="/includes/header.html" -->
<main id="main" role="main" class="container">
<section id="streaming" class="page-section">
<div class="col-sm-12 col-md-12 col-xs-12" style="padding:0 0 20px 0;">
<div class="col-sm-6 col-md-7 col-xs-12" style="padding-left:0; padding-right:0">
<h2 class="first">Streaming & CEP</h2>
<p>
Ignite streaming allows to process continuous never-ending streams of data in scalable
and fault-tolerant fashion. The rates at which data can be injected into Ignite can be very
high and easily exceed millions of events per second on a moderately sized cluster.
</p>
<p>
<div class="page-heading">How it Works:</div>
<ol class="page-list">
<li>Clients inject streams of data into Ignite.</li>
<li>Data is automatically partitioned between Ignite data nodes.</li>
<li>Data is concurrently processed in <code>sliding windows</code>.</li>
<li>Clients perform concurrent <code>SQL queries</code> on the streamed data.</li>
<li>Clients subscribe to <code>continuous queries</code> as data changes.</li>
</ol>
</p>
</div>
<div class="col-sm-6 col-md-5 col-xs-12" style="padding-right:0">
<img class="first img-responsive" src="/images/ignite-stream-query.png" width="382px" style="float:right;"/>
<br/>
<img class="img-responsive" src="/images/in_memory_streaming.png" width="280px" style="margin: auto;">
</div>
</div>
<div class="code-examples">
<div class="page-heading">Code Examples:</div>
<!-- Nav tabs -->
<ul id="datagrid-examples" class="nav nav-tabs">
<li class="active"><a href="#streaming-data" role="tab" data-toggle="tab">Stream Data</a></li>
<li><a href="#streaming-transformer" role="tab" data-toggle="tab">Transform Data</a></li>
<li><a href="#streaming-query" role="tab" data-toggle="tab">Query Sliding Windows</a></li>
</ul>
<!-- Tab panes -->
<div class="tab-content">
<div role="tabpanel" class="tab-pane active" id="streaming-data">
<pre class="brush:java">
// Get the data streamer reference and stream data.
try (IgniteDataStreamer&lt;Integer, String&gt; stmr = ignite.dataStreamer("myStreamCache")) {
// Stream entries.
for (int i = 0; i &lt; 100000; i++)
stmr.addData(i, Integer.toString(i));
}
</pre>
</div>
<div role="tabpanel" class="tab-pane" id="streaming-transformer">
<pre class="brush:java">
CacheConfiguration cfg = new CacheConfiguration("wordCountCache");
IgniteCache&lt;Integer, Long&gt; stmCache = ignite.getOrCreateCache(cfg);
try (IgniteDataStreamer&lt;String, Long&gt; stmr = ignite.dataStreamer(stmCache.getName())) {
// Allow data updates.
stmr.allowOverwrite(true);
// Configure data transformation to count instances of the same word.
stmr.receiver(StreamTransformer.from((e, arg) -> {
// Get current count.
Long val = e.getValue();
// Increment count by 1.
e.setValue(val == null ? 1L : val + 1);
return null;
}));
// Stream words into the streamer cache.
for (String word : text)
stmr.addData(word, 1L);
}
</pre>
</div>
<div role="tabpanel" class="tab-pane" id="streaming-query">
<pre class="brush:java">
CacheConfiguration&lt;String, Instrument&gt; cfg = new CacheConfiguration<>("instCache");
// LRU window holding 1,000,000 entries.
cfg.setEvictionPolicyFactory(new LruEvictionPolicy(1_000_000));
// Index some fields for querying portfolio positions.
cfg.setIndexedTypes(String.class, Instrument.class);
// Get a handle on the cache (create it if necessary).
IgniteCache&lt;String, Instrument&lt; instCache = ignite.getOrCreateCache(cfg);
// Select top 3 best performing instruments from the sliding window.
SqlFieldsQuery top3qry = new SqlFieldsQuery(
"select symbol, (latestPrice - openPrice) as change "
+ "from Instrument "
+ "order by change "
+ "desc limit 3"
);
// List of rows. Every row is represented as a List as well.
List&lt;List&lt;?&gt;&gt; top3 = instCache.query(top3qry).getAll(); </pre>
</div>
</div>
</div>
<div class="page-heading">GitHub Examples:</div>
<p>
Also see <a href="https://github.com/apache/incubator-ignite/blob/master/examples/src/main/java/org/apache/ignite/examples/datagrid/CacheContinuousQueryExample.java" target="github">continuous queries</a>,
<a href="https://github.com/apache/incubator-ignite/tree/master/examples/src/main/java/org/apache/ignite/examples/streaming/wordcount" target="github">word count</a>,
and <a href="https://github.com/apache/incubator-ignite/tree/master/examples/src/main/java/org/apache/ignite/examples/streaming" target="github">other streaming examples</a> available on GitHub.
</p>
</section>
<section id="key-features" class="page-section">
<h2>Streaming Features</h2>
<table class="formatted" name="Streaming Features">
<thead>
<tr>
<th width="35%" class="left">Feature</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td class="left">Data Streamers</td>
<td>
<p>
Data streamers are defined by <code>IgniteDataStreamer</code> API and are built to inject large
amounts of continuous streams of data into Ignite stream caches. Data streamers are
built in a scalable and fault-tolerant fashion and provide <b>at-least-once-guarantee</b>
semantics for all the data streamed into Ignite.
</p>
<div class="page-links">
<a href="http://apacheignite.readme.io/docs/data-streamers" target="docs">Docs for this Feature <i class="fa fa-angle-double-right"></i></a>
</div>
</td>
</tr>
<tr>
<td class="left">Collocated Processing</td>
<td>
<p>
For cases when you need to execute some custom logic instead of just adding new data,
you can take advantage of <code>StreamReceiver</code> API.
</p>
<p>
Stream receivers allow you to react to the streamed data in collocated fashion,
directly on the nodes where it will be cached. You can change the data or add any
custom pre-processing logic to it, before putting the data into cache.
</p>
<div class="page-links">
<a href="http://apacheignite.readme.io/docs/data-streamers#streamreceiver" target="docs">Docs for this Feature <i class="fa fa-angle-double-right"></i></a>
</div>
</td>
</tr>
<tr>
<td class="left">Sliding Windows</td>
<td>
<p>
Ignite streaming functionality also allows to query into sliding windows of data.
Sliding windows are configured as Ignite cache eviction policies, and can be
<code>time-based</code>, <code>size-based</code>, or <code>batch-based</code>. You can configure one sliding-window per cache. However,
you can easily define more than one cache if you need different sliding windows for the
same data.
</p>
<div class="page-links">
<a href="http://apacheignite.readme.io/docs/sliding-windows" target="docs">Docs for this Feature <i class="fa fa-angle-double-right"></i></a>
</div>
</td>
</tr>
<tr>
<td class="left">Querying Sliding Windows</td>
<td>
<p>
You can use full set of Ignite data indexing capabilities, together with
Ignite SQL, TEXT, and Predicate based cache queries, to query into the streaming data.
</p>
<div class="page-links">
<a href="http://apacheignite.readme.io/docs/cache-queries" target="docs">Docs for this Feature <i class="fa fa-angle-double-right"></i></a>
</div>
</td>
</tr>
<tr>
<td class="left">Continuous Queries</td>
<td>
<p>
Continuous queries are useful for cases when you want to execute a query and then
continue to get notified about the data changes that fall into your query filter.
</p>
<div class="page-links">
<a href="http://apacheignite.readme.io/docs/continuous-queries" target="docs">Docs for this Feature <i class="fa fa-angle-double-right"></i></a>
</div>
</td>
</tr>
<tr>
<td class="left">JMS Data Streamer</td>
<td>
<p>
Ignite JMS Data Streamer consumes messages from JMS brokers and inserts them into Ignite caches.
</p>
<div class="page-links">
<a href="https://apacheignite.readme.io/docs/jms-data-streamer" target="docs">Docs for this feature <i class="fa fa-angle-double-right"></i></a>
</div>
</td>
</tr>
<tr>
<td class="left">Apache Flume Sink</td>
<td>
<p>
IgniteSink is a Flume sink that extracts events from an associated Flume channel and injects into an Ignite cache.
</p>
<div class="page-links">
<a href="https://apacheignite.readme.io/docs/flume-data-streamer" target="docs">Docs for this feature <i class="fa fa-angle-double-right"></i></a>
</div>
</td>
</tr>
<tr>
<td class="left">MQTT Streamer</td>
<td>
<p>
Ignite MQTT Streamer consumes messages from a MQTT topic and feeds transformed key-value pairs into an Ignite cache.
</p>
<div class="page-links">
<a href="https://apacheignite.readme.io/docs/mqtt-streamer" target="docs">Docs for this feature <i class="fa fa-angle-double-right"></i></a>
</div>
</td>
</tr>
<tr>
<td class="left">Twitter Streamer</td>
<td>
<p>
Ignite Twitter Streamer consumes messages from a Twitter Streaming API and inserts them into an Ignite cache.
</p>
</td>
</tr>
<tr>
<td class="left">Apache Kafka Streamer</td>
<td>
<p>
Ignite Kafka Data Streamer consumes messages for a given Kafka Topic from Kafka Broker and inserts them into an Ignite cache.
</p>
<div class="page-links">
<a href="https://apacheignite.readme.io/docs/kafka-streamer" target="docs">Docs for this feature <i class="fa fa-angle-double-right"></i></a>
</div>
</td>
</tr>
<tr>
<td class="left">Apache Camel streamer</td>
<td>
<p>
Ignite Camel streamer consumes messages from an Apache Camel consumer endpoint and feeds them into an Ignite cache.
</p>
<div class="page-links">
<a href="https://apacheignite.readme.io/docs/camel-streamer" target="docs">Docs for this feature <i class="fa fa-angle-double-right"></i></a>
</div>
</td>
</tr>
<tr>
<td class="left">Apache Storm Streamer</td>
<td>
<p>
Ignite Storm Streamer consumes messages from an Apache Storm consumer endpoint and feeds them into an Ignite cache.
</p>
</td>
</tr>
</tbody>
</table>
</section>
</main>
<!--#include virtual="/includes/footer.html" -->
</div>
<!--#include virtual="/includes/scripts.html" -->
</body>
</html>