blob: 84dfbfd44ddfcddbdf778df47f0fb3b22996815a [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 - Features</title>
<link media="all" rel="stylesheet" href="css/all.css">
<link href="//netdna.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.css" rel="stylesheet">
<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 key-features">
<section id="features">
<h2>Key In-Memory Fabric Features</h2>
<p align="center">
Apache Ignite In-Memory Data Fabric is a high-performance,
integrated and distributed in-memory platform for computing
and transacting on large-scale data sets in real-time, orders
of magnitude faster than possible with traditional disk-based
or flash technologies.
</p>
<!--#include virtual="/includes/igniteimage.html" -->
</section>
<section id="datagrid" class="feature-section">
<h2>Data Grid</h2>
<p>
Ignite In-Memory Data Fabric stores their data in-memory as opposed to traditional
Database Management Systems that utilize disk as their primary storage mechanism.
By utilizing system memory rather than disk, Ignite In-Memory Data Fabric is orders
of magnitude faster than traditional DBMS systems.
</p>
<div class="feature-box">
<div class="feature-left">
<div class="features-heading">Features:</div>
<ul class="features-list">
<li>Distributed In-Memory Caching (JCache JSR-107 compliant)</li>
<li>Lightning Fast Performance</li>
<li>Elastic Scalability</li>
<li>Distributed In-Memory Transactions</li>
<li>Distributed SQL Queries (SQL-99 compliant)</li>
<li>JDBC Driver</li>
<li>Distributed In-Memory Queue and Other Data Structures</li>
<li>Tiered Off-Heap Storage</li>
<li>Web Session Clustering</li>
<li>Hibernate L2 Cache Integration</li>
<li>Memcached-compliant for access from different languages</li>
<li>REST APIs for HTTP-based access</li>
</ul>
</div>
<div class="feature-right">
<img src="images/in_memory_data.png" width="400px"/>
</div>
</div>
<div class="code-examples">
<div class="examples-heading">Examples:</div>
<!-- Nav tabs -->
<ul id="datagrid-examples" class="nav nav-tabs">
<li class="active"><a href="#datagrid-example-basic" role="tab" data-toggle="tab">Put and Get</a></li>
<li><a href="#datagrid-example-transactions" role="tab" data-toggle="tab">Transactions</a></li>
<li><a href="#datagrid-example-locks" role="tab" data-toggle="tab">Locks</a></li>
<li><a href="#datagrid-example-sqlquery" role="tab" data-toggle="tab">SQL Query</a></li>
<li><a href="#datagrid-example-sqljoin" role="tab" data-toggle="tab">SQL Join</a></li>
</ul>
<!-- Tab panes -->
<div class="tab-content">
<div role="tabpanel" class="tab-pane active" id="datagrid-example-basic">
<pre class="brush:java">
Ignite ignite = Ignition.ignite();
// Get an instance of named cache.
final IgniteCache&lt;Integer, String&gt; cache = ignite.cache("cacheName");
// Store keys in cache.
for (int i = 0; i < 10; i++)
cache.put(i, Integer.toString(i));
// Retrieve values from cache.
for (int i = 0; i < 10; i++)
System.out.println("Got [key=" + i + ", val=" + cache.get(i) + ']');
// Remove objects from cache.
for (int i = 0; i < 10; i++)
cache.remove(i);
// Atomic put-if-absent.
cache.putIfAbsent(1, "1");
// Atomic replace.
cache.replace(1, "1", "2");
</pre>
</div>
<div role="tabpanel" class="tab-pane" id="datagrid-example-transactions">
<pre class="brush:java">
Ignite ignite = Ignition.ignite();
// Clone every object we get from cache, so we can freely update it.
IgniteCache&lt;Integer, Account&gt; cache = ignite.cache("cacheName");
try (IgniteTx tx = Ignition.ignite().transactions().txStart()) {
Account acct = cache.get(acctId);
assert acct != null;
// Deposit $20 into account.
acct.setBalance(acct.getBalance() + 20);
// Store updated account in cache.
cache.put(acctId, acct);
tx.commit();
}
</pre>
</div>
<div role="tabpanel" class="tab-pane" id="datagrid-example-locks">
<pre class="brush:java">
Ignite ignite = Ignition.ignite();
// Get an instance of named cache.
final GridCache&lt;String, Integer&gt; cache = ignite.cache("cacheName");
// Lock cache key "Hello".
Lock lock = cache.lock("Hello");
lock.lock();
try {
cache.put("Hello", 11);
cache.put("World", 22);
}
finally {
lock.unlock();
}
</pre>
</div>
<div role="tabpanel" class="tab-pane" id="datagrid-example-sqlquery">
<pre class="brush:java">
Ignite ignite = Ignition.ignite();
// Get an instance of named cache.
GridCache&lt;Long, Person&gt; cache = ignite.cache("cacheName");
// Create query which selects salaries based on range.
CacheQuery&lt;Map.Entry&lt;Long, Person&gt;&gt; qry =
cache.queries().createSqlQuery(Person.class, "salary > ? and salary <= ?");
// Execute queries for salary ranges.
print("People with salaries between 0 and 1000: ", qry.execute(0, 1000).get());
print("People with salaries between 1000 and 2000: ", qry.execute(1000, 2000).get());
</pre>
</div>
<div role="tabpanel" class="tab-pane" id="datagrid-example-sqljoin">
<pre class="brush:java">
Ignite ignite = Ignition.ignite();
// Get an instance of named cache.
GridCache&lt;Long, Person&gt; cache = ignite.cache("cacheName");
// Create query which joins on 2 types to select people for a specific organization.
CacheQuery&lt;Map.Entry&lt;Long, Person&gt;&gt; qry =
cache.queries().createSqlQuery(Person.class, "from Person, Organization " +
"where Person.orgId = Organization.id " +
"and Organization.name = ?");
// Execute queries for find employees for different organizations.
print("Following people are 'Ignite' employees: ", qry.execute("Ignite").get());
print("Following people are 'Other' employees: ", qry.execute("Other").get());
</pre>
</div>
</div>
</div>
<div class="videos">
<div class="video-heading">Videos:</div>
<ul>
<li>
<i class="fa fa-lg fa-play-circle-o"></i>
<span class="video-title">
<a target="youtube" href="https://www.youtube.com/watch?v=eZUujozYt-g">Distributed SQL Queries</a>
</span>
<span class="video-duration">03:27</span>
</li>
<li>
<i class="fa fa-lg fa-play-circle-o"></i>
<span class="video-title">
<a target="youtube" href="https://www.youtube.com/watch?v=pFbDWpOiMOU">Getting Started with Data Grid</a>
</span>
<span class="video-duration">03:49</span>
</li>
</ul>
</div>
<div class="feature-links">
<a target=wiki href="http://apacheignite.readme.io/v1.0/docs/data-grid">Learn More <i class="fa fa-angle-double-right"></i></a>
<a href="#features">Top <i class="fa fa-angle-double-up"></i></a>
</div>
</section>
<section id="computegrid" class="feature-section">
<h2>Compute Grid</h2>
<p>
Compute Grid provides the means for parallel processing of CPU
or otherwise resource intensive tasks including traditional High Performance Computing (HPC) and Massively Parallel Processing (MPP).
</p>
<div class="feature-box">
<div class="feature-left">
<div class="features-heading">Features:</div>
<ul class="features-list">
<li>Dynamic Clustering</li>
<li>Fork-Join & MapReduce Processing</li>
<li>Distributed Closure Execution</li>
<li>Adaptive Load Balancing</li>
<li>Automatic Fault Tolerance</li>
<li>Linear Scalability</li>
<li>Custom Scheduling</li>
<li>Checkpointing for Long Running Jobs</li>
<li>ExecutorService</li>
</ul>
</div>
<div class="feature-right">
<img src="images/in_memory_compute.png" width="400px"/>
</div>
</div>
<div class="code-examples">
<div class="examples-heading">Examples:</div>
<!-- Nav tabs -->
<ul id="compute-examples" class="nav nav-tabs">
<li class="active"><a href="#compute-example-broadcast" aria-controls="home" data-toggle="tab">Broadcast</a></li>
<li><a href="#compute-example-countchars" aria-controls="profile" data-toggle="tab">Count Characters with Callable</a></li>
<li><a href="#compute-example-closure" aria-controls="profile" data-toggle="tab">Count Characters with Closure</a></li>
</ul>
<!-- Tab panes -->
<div class="tab-content">
<div class="tab-pane active" id="compute-example-broadcast">
<pre class="brush:java">
Ignite ignite = Ignition.ignite();
// Print out hello message on all cluster nodes.
ignite.compute().broadcast(() -> "Hello Node!");
</pre>
</div>
<div class="tab-pane" id="compute-example-countchars">
<pre class="brush:java">
Collection&lt;IgniteCallable&lt;Integer&gt;&gt; calls = new ArrayList&lt;&gt;();
// Iterate through all words in the sentence and create callable jobs.
for (String word : "How Many Characters".split(" "))
calls.add(word::length);
// Execute collection of callables on the Ignite cluster.
Collection&lt;Integer&gt; res = ignite.compute().call(calls);
// Add all the word lengths received from cluster nodes.
int total = res.stream().mapToInt(Integer::intValue).sum();
</pre>
</div>
<div class="tab-pane" id="compute-example-closure">
<pre class="brush:java">
IgniteCompute compute = ignite.compute();
// Execute closure on all cluster nodes.
Collection&lt;Integer&gt; res = ignite.compute().apply(
String::length,
Arrays.asList("How Many Characters".split(" "))
);
// Add all the word lengths received from cluster nodes.
int total = res.stream().mapToInt(Integer::intValue).sum();
</pre>
</div>
</div>
</div>
<div class="videos">
<div class="video-heading">Videos:</div>
<ul>
<li>
<i class="fa fa-lg fa-play-circle-o"></i>
<span class="video-title">
<a target="youtube" href="https://www.youtube.com/watch?v=J775J77_-B8">Getting Started with Copmute Grid</a>
</span>
<span class="video-duration">03:50</span>
</li>
</ul>
</div>
<div class="feature-links">
<a target=wiki href="http://apacheignite.readme.io/v1.0/docs/compute-grid">Learn More <i class="fa fa-angle-double-right"></i></a>
<a href="#features">Top <i class="fa fa-angle-double-up"></i></a>
</div>
</section>
<section id="servicegrid" class="feature-section">
<h2>Service Grid</h2>
<p>
Ignite Service Grid allows you to have complete control over services being deployed on the
cluster. It allows you to control how many instances of your service should be deployed on each cluster
node, ensuring proper deployment and fault tolerance. Service Grid guarantees continuous availability
of all deployed services in case of node failures. <br/><br/>
</p>
<div class="feature-box">
<div class="feature-left">
<div class="features-heading">Features:</div>
<ul class="features-list">
<li>Automatically Deploy Multiple Instances of a Service</li>
<li>Automatically Deploy a Service as Singleton</li>
<li>Automatically Deploy Services on Node Start-Up</li>
<li>Fault Tolerant Deployment</li>
<li>Un-Deploy Any of the Deployed Services</li>
<li>Get Service Deployment Topology Information</li>
<li>Access Remotely Deployed Service via Service Proxy</li>
</ul>
</div>
<div class="feature-right">
<img src="images/ignite_service.png" width="400px"/>
</div>
</div>
<div class="code-examples">
<div class="examples-heading">Examples:</div>
<!-- Nav tabs -->
<ul id="service-examples" class="nav nav-tabs">
<li class="active"><a href="#service-example" aria-controls="home" data-toggle="tab">Service Deployment</a></li>
</ul>
<!-- Tab panes -->
<div class="tab-content">
<div class="tab-pane active" id="service-example">
<br/>
<p>
An example of how a distributed service may be implemented
</p>
<pre class="brush:java">
// Simple service implementation.
public class MyIgniteService implements Service {
// Example of ignite resource injection. All resources are optional.
// You should inject resources only as needed.
@IgniteInstanceResource
private Ignite ignite;
...
@Override public void cancel(ServiceContext ctx) {
// No-op.
}
@Override public void execute(ServiceContext ctx) {
// Loop until service is cancelled.
while (!ctx.isCancelled()) {
// Do something.
...
}
}
}
</pre>
<br/>
<p>
and deployed.
</p>
<pre class="brush:java">
Ignite ignite = Ignition.ignite();
...
IgniteServices svcs = ignite.services();
IgniteFuture&lt;?&gt; fut = svcs.deployClusterSingleton("myClusterSingleton", new MyIgniteService());
// Wait for deployment to complete.
fut.get();
</pre>
</div>
</div>
</div>
<div class="feature-links">
<a target=wiki href="http://apacheignite.readme.io/v1.0/docs/service-grid">Learn More <i class="fa fa-angle-double-right"></i></a>
<a href="#features">Top <i class="fa fa-angle-double-up"></i></a>
</div>
</section>
<section id="datastreaming" class="feature-section">
<h2>Streaming</h2>
<p>
Streaming support allows to query into sliding windows of coming data, and enable users to answer such questions as “What are the 10 most popular products over last 2 hours?”, or “What is the average product price in a certain category for the past day?”.<br/><br/>
</p>
<div class="feature-box">
<div class="feature-left">
<div class="features-heading">Features:</div>
<ul class="features-list">
<li>Programmatic Querying</li>
<li>Customizable Event Workflow</li>
<li>At-Least-Once Guarantee</li>
<li>Sliding Windows</li>
<li>Data Indexing</li>
<li>Distributed Streamer Queries</li>
<li>Co-Location With In-Memory Data Grid</li>
</ul>
</div>
<div class="feature-right">
<img src="images/in_memory_streaming.png" width="400px"/>
</div>
</div>
<div class="code-examples">&nbsp;</div>
<div class="feature-links">
<!--<a target=wiki href="#">Learn More <i class="fa fa-angle-double-right"></i></a>-->
<a href="#features">Top <i class="fa fa-angle-double-up"></i></a>
</div>
</section>
<section id="clustering" class="feature-section">
<h2>Advanced Clustering</h2>
<p>
Ignite In-Memory Data Fabric provides one of the most sophisticated clustering technologies on Java Virtual Machine (JVM). Ignite nodes can automatically discover each other. This helps to scale the cluster when needed, without having to restart the whole cluster.Developers can also leverage from Ignite’s hybrid cloud support that allows establishing connection between private cloud and public clouds such as Amazon Web Services, providing them with best of both worlds. <br/><br/>
</p>
<div class="feature-box">
<div class="feature-left">
<div class="features-heading">Features:</div>
<ul class="features-list">
<li>Dynamic Topology Management</li>
<li>Guaranteed Cluster Member Discovery</li>
<li>Public and Private Clouds</li>
<li>Automatic AWS Discovery</li>
<li>Virtual Cluster Groups</li>
<li>Zero Deployment</li>
<li>Per-Node Shared State</li>
<li>Real Time Cluster Monitoring and Metrics</li>
</ul>
</div>
<div class="feature-right">
<img src="images/ignite_cluster.png" width="400px"/>
</div>
</div>
<div class="code-examples">
<div class="examples-heading">Examples:</div>
<!-- Nav tabs -->
<ul id="clustering-examples" class="nav nav-tabs">
<li class="active"><a href="#clustering-example-remotes" aria-controls="home" data-toggle="tab">Remote Cluster Group</a></li>
<li><a href="#clustering-example-random" aria-controls="profile" data-toggle="tab">Random Cluster Group</a></li>
<li><a href="#clustering-example-custom" aria-controls="profile" data-toggle="tab">Custom Cluster Group</a></li>
</ul>
<!-- Tab panes -->
<div class="tab-content">
<div class="tab-pane active" id="clustering-example-broadcast">
<pre class="brush:java">
final Ignite ignite = Ignition.ignite();
IgniteCluster cluster = ignite.cluster();
// Cluster group containing all remote nodes, i.e. not this node.
ClusterGroup remotes = cluster.forRemotes();
// Get compute instance which will only execute over remote nodes.
IgniteCompute compute = ignite.compute(remotes);
// Broadcast to all remote nodes and print the ID of the node
// on which this closure is executing.
compute.broadcast(() -> System.out.println("Hello Node: " + cluster.localNode().id());
</pre>
</div>
<div class="tab-pane" id="clustering-example-random">
<pre class="brush:java">
Ignite ignite = Ignition.ignite();
IgniteCluster cluster = ignite.cluster();
// Cluster group containing random remote node.
ClusterGroup random = cluster.forRemotes().forRandom();
// Get compute instance over a random remote node.
IgniteCompute compute = ignite.compute(random);
// Send closure to the random node and print its ID.
compute.run(() -> System.out.println("Hello Node: " + cluster.localNode().id());
</pre>
</div>
<div class="tab-pane" id="clustering-example-custom">
<pre class="brush:java">
Ignite ignite = Ignition.ignite();
IgniteCluster cluster = ignite.cluster();
// Dynamic cluster group over nodes loaded less than 50%.
ClusterGroup cpuNodes = cluster.forPredicate(node -> node.metrics().getCurrentCpuLoad() < 0.5);
// Get compute instance over nodes loaded less than 50%.
IgniteCompute compute = ignite.compute(cpuNodes);
// Send closure to one of the CPU nodes.
compute.run(() -> System.out.println("Hello Node: " + cluster.localNode().id());
</pre>
</div>
</div>
</div>
<div class="feature-links">
<a target=wiki href="http://apacheignite.readme.io/v1.0/docs/cluster">Learn More <i class="fa fa-angle-double-right"></i></a>
<a href="#features">Top <i class="fa fa-angle-double-up"></i></a>
</div>
</section>
<section id="messaging" class="feature-section">
<h2>Distributed Messaging</h2>
<p>
Apache Ignite provides high-performance cluster-wide messaging functionality to exchange data via
publish-subscribe and direct point-to-point communication models.
</p>
<div class="feature-box">
<div class="feature-left">
<div class="features-heading">Features:</div>
<ul class="features-list">
<li>Support for Topic-Based Publish-Subscribe Model</li>
<li>Support for Direct Point-to-Point Communication</li>
<li>Pluggable Communication Transport Layer</li>
<li>Support for Message Ordering</li>
<li>Cluster-Aware Message Listener Auto-Deployment </li>
</ul>
</div>
</div>
<div class="code-examples">
<div class="examples-heading">Examples:</div>
<!-- Nav tabs -->
<ul id="messaging-examples" class="nav nav-tabs">
<li class="active"><a href="#messaging-example-ordered" aria-controls="home" data-toggle="tab">Ordered Messaging</a></li>
<li><a href="#messaging-example-unordered" aria-controls="profile" data-toggle="tab">Unordered Messaging</a></li>
</ul>
<!-- Tab panes -->
<div class="tab-content">
<div class="tab-pane active" id="messaging-example-ordered">
<pre class="brush:java">
Ignite ignite = Ignition.ignite();
IgniteMessaging rmtMsg = ignite.message(ignite.cluster().forRemotes());
// Add listener for unordered messages on all remote nodes.
rmtMsg.remoteListen("MyOrderedTopic", (nodeId, msg) -> {
System.out.println("Received ordered message [msg=" + msg + ", from=" + nodeId + ']');
return true; // Return true to continue listening.
});
// Send ordered messages to remote nodes.
for (int i = 0; i < 10; i++)
rmtMsg.sendOrdered("MyOrderedTopic", Integer.toString(i));
</pre>
</div>
<div class="tab-pane" id="messaging-example-unordered">
<pre class="brush:java">
Ignite ignite = Ignition.ignite();
IgniteMessaging rmtMsg = ignite.message(ignite.cluster().forRemotes());
// Add listener for unordered messages on all remote nodes.
rmtMsg.remoteListen("MyUnOrderedTopic", (nodeId, msg) -> {
System.out.println("Received unordered message [msg=" + msg + ", from=" + nodeId + ']');
return true; // Return true to continue listening.
});
// Send unordered messages to remote nodes.
for (int i = 0; i < 10; i++)
rmtMsg.send("MyUnOrderedTopic", Integer.toString(i));
</pre>
</div>
</div>
</div>
<div class="feature-links">
<a target=wiki href="http://apacheignite.readme.io/v1.0/docs/messaging">Learn More <i class="fa fa-angle-double-right"></i></a>
<a href="#features">Top <i class="fa fa-angle-double-up"></i></a>
</div>
</section>
<section id="events" class="feature-section">
<h2>Distributed Events</h2>
<p>
Distributed events functionality allows applications to receive notifications about cache events occurring in distributed grid environment. Developers can use this functionality to get notified about remote tasks executions or any cache data changes within the cluster. Event notifications can be grouped together and sent in batches and/or timely intervals to reduce network traffic.
</p>
<div class="feature-box">
<div class="feature-left">
<div class="features-heading">Features:</div>
<ul class="features-list">
<li>Subscribe Local and Remote Listeners</li>
<li>Enable and Disable any Event</li>
<li>Provide Local and Remote Event Filters</li>
<li>Group Event Notifications into Batches</li>
</ul>
</div>
</div>
<div class="code-examples">
<div class="examples-heading">Examples:</div>
<!-- Nav tabs -->
<ul id="events-examples" class="nav nav-tabs">
<li class="active"><a href="#events-example-cache" aria-controls="home" data-toggle="tab">Cache Events</a></li>
</ul>
<!-- Tab panes -->
<div class="tab-content">
<div class="tab-pane active" id="events-example-cache">
<br/>
<p>
Subscribe to remote notifications for cache data updates.
</p>
<pre class="brush:java">
Ignite ignite = Ignition.ignite();
// Sample remote filter which only accepts events for keys
// that are greater than or equal to 10.
IgnitePredicate&lt;CacheEvent&gt; rmtLsnr = evt -&gt; evt.key() >= 10;
// Subscribe to specified cache events on all nodes that have cache running.
ignite.events(ignite.cluster().forCacheNodes("cacheName")).remoteListen(null, rmtLsnr,
EventType.EVT_CACHE_OBJECT_PUT,
EventType.EVT_CACHE_OBJECT_READ,
EventType.EVT_CACHE_OBJECT_REMOVED);
// Get an instance of named cache.
final IgniteCache&lt;Integer, String&gt; cache = ignite.jcache("cacheName");
// Generate cache events.
for (int i = 0; i &lt; 20; i++)
cache.put(i, Integer.toString(i));
</pre>
</div>
</div>
</div>
<div class="feature-links">
<a target=wiki href="http://apacheignite.readme.io/v1.0/docs/events">Learn More <i class="fa fa-angle-double-right"></i></a>
<a href="#features">Top <i class="fa fa-angle-double-up"></i></a>
</div>
</section>
<section id="datastructures" class="feature-section">
<h2>Distributed Data Structures</h2>
<p>
Ignite allows for most of the data structures from java.util.concurrent framework to be used
in a distributed fashion. For example, you can take java.util.concurrent.BlockingDeque and add something
to it on one node and poll it from another node. Or have a distributed Primary Key generator,
which would guarantee uniqueness on all nodes.
</p>
<div class="feature-box">
<div class="feature-left">
<div class="features-heading">Features:</div>
<ul class="features-list">
<li>Concurrent Map</li>
<li>Distributed Queues and Sets</li>
<li>AtomicLong</li>
<li>AtomicSequence</li>
<li>AtomicReference</li>
<li>CountDownLatch</li>
<li>ExecutorService</li>
</ul>
</div>
</div>
<div class="code-examples">
<div class="examples-heading">Examples:</div>
<!-- Nav tabs -->
<ul id="datastructures-examples" class="nav nav-tabs">
<li class="active"><a href="#datastructures-example-queue" aria-controls="home" data-toggle="tab">Queue</a></li>
<li><a href="#datastructures-example-set" aria-controls="profile" data-toggle="tab">Set</a></li>
<li><a href="#datastructures-example-sequence" aria-controls="profile" data-toggle="tab">Atomic Sequence</a></li>
</ul>
<!-- Tab panes -->
<div class="tab-content">
<div class="tab-pane active" id="datastructures-example-queue">
<br/>
<p>
Distributed Queue example.
</p>
<pre class="brush:java">
Ignite ignite = Ignition.ignite();
CollectionConfiguration colCfg = new CollectionConfiguration();
colCfg.setCacheName("cacheName");
// Non-colocated queue which will be distributed
// across all data nodes.
IgniteQueue&lt;String&gt; queue = ignite.queue("queueName", 20, colCfg);
// Add queue elements.
for (int i = 0; i < 20; i++)
queue.add("Value " + Integer.toString(i));
// Poll queue elements.
for (int i = 0; i < 20; i++)
System.out.println("Polled value: " + queue.poll());
</pre>
</div>
<div class="tab-pane" id="datastructures-example-set">
<br/>
<p>
Distributed Set example.
</p>
<pre class="brush:java">
Ignite ignite = Ignition.ignite();
// Initialize new set.
IgniteSet&lt;String&gt; set = ignite.set("setName", null);
// Add set elements.
for (int i = 0; i < 10; i++)
set.add(Integer.toString(i));
// Iterate over set.
for (String item : set)
System.out.println("Set item: " + item);
</pre>
</div>
<div class="tab-pane" id="datastructures-example-sequence">
<br/>
<p>
Distributed AtomicSequence example.
</p>
<pre class="brush:java">
Ignite ignite = Ignition.ignite();
// Initialize atomic sequence.
IgniteAtomicSequence seq = ignite.atomicSequence("seqName", 0, true);
for (int i = 0; i < 100; i++)
System.out.println("Next sequence value: " + seq.incrementAndGet());
</pre>
</div>
</div>
</div>
<div class="feature-links">
<a target=wiki href="http://apacheignite.readme.io/v1.0/docs/queue-and-set">Learn More <i class="fa fa-angle-double-right"></i></a>
<a href="#features">Top <i class="fa fa-angle-double-up"></i></a>
</div>
</section>
<section id="filesystem" class="feature-section">
<h2>Distributed File System</h2>
<p>
One of the unique capabilities of Ignite is a file system interface to its in-memory data called Ignite File System (IGFS). IGFS delivers similar functionality to Hadoop HDFS, but only in memory. In fact, IGFS is at the core of Ignite’s In-Memory Hadoop Accelerator. <br/><br/>
The data from each file is split on separate data blocks and stored in cache.
Developers can access each file’s data with a standard Java streaming API. Moreover, for each part of the file a developer can calculate an affinity and process the file’s content on corresponding nodes to avoid unnecessary networking.
</p>
<div class="feature-box">
<div class="feature-left">
<div class="features-heading">Features:</div>
<ul class="features-list">
<li>In-Memory File System</li>
<li>List Directories</li>
<li>Get Information for a Single Path</li>
<li>Create/Move/Delete Files or Directories</li>
<li>Write/Read Data Streams into/from Files</li>
</ul>
</div>
</div>
<div class="code-examples">&nbsp;</div>
<div class="feature-links">
<a href="#features">Top <i class="fa fa-angle-double-up"></i></a>
</div>
</section>
<section id="hadoop" class="feature-section">
<h2>Hadoop Acceleration</h2>
<p>
Hadoop Accelerator enhances existing Hadoop technology to enable fast data processing using the tools and technology your organization is already using today.<br/><br/>
Ignite’s in-memory accelerator for Hadoop is based on the dual-mode,
high-performance in-memory file system that is 100% compatible with Hadoop HDFS, and an in-memory optimized MapReduce implementation. In-memory HDFS and in-memory MapReduce provide easy to use extensions to disk-based HDFS and traditional MapReduce, delivering up to 100x faster performance.
</p>
<div class="feature-box">
<div class="feature-left">
<div class="features-heading">Features:</div>
<ul class="features-list">
<li>100x Faster Performance</li>
<li>In-Memory MapReduce</li>
<li>Highly Optimized In-Memory Processing</li>
<li>Standalone File System</li>
<li>Optional Caching Layer for HDFS</li>
<li>Read-Through and Write-Through with HDFS</li>
</ul>
</div>
<div class="feature-right">
<img src="images/hadoop_sequence.png" width="400px"/>
</div>
</div>
<div class="code-examples">&nbsp;</div>
<div class="feature-links">
<!--<a target=wiki href="#">Learn More <i class="fa fa-angle-double-right"></i></a>-->
<a href="#features">Top <i class="fa fa-angle-double-up"></i></a>
</div>
</section>
</main>
<!--#include virtual="/includes/footer.html" -->
</div>
<!--#include virtual="/includes/scripts.html" -->
</body>
</html>