| <!-- |
| ▄▄▄ ██▓███ ▄▄▄ ▄████▄ ██░ ██ ▓█████ ██▓ ▄████ ███▄ █ ██▓▄▄▄█████▓▓█████ |
| ▒████▄ ▓██░ ██▒▒████▄ ▒██▀ ▀█ ▓██░ ██▒▓█ ▀ ▓██▒ ██▒ ▀█▒ ██ ▀█ █ ▓██▒▓ ██▒ ▓▒▓█ ▀ |
| ▒██ ▀█▄ ▓██░ ██▓▒▒██ ▀█▄ ▒▓█ ▄ ▒██▀▀██░▒███ ▒██▒▒██░▄▄▄░▓██ ▀█ ██▒▒██▒▒ ▓██░ ▒░▒███ |
| ░██▄▄▄▄██ ▒██▄█▓▒ ▒░██▄▄▄▄██ ▒▓▓▄ ▄██▒░▓█ ░██ ▒▓█ ▄ ░██░░▓█ ██▓▓██▒ ▐▌██▒░██░░ ▓██▓ ░ ▒▓█ ▄ |
| ▓█ ▓██▒▒██▒ ░ ░ ▓█ ▓██▒▒ ▓███▀ ░░▓█▒░██▓░▒████▒ ░██░░▒▓███▀▒▒██░ ▓██░░██░ ▒██▒ ░ ░▒████▒ |
| ▒▒ ▓▒█░▒▓▒░ ░ ░ ▒▒ ▓▒█░░ ░▒ ▒ ░ ▒ ░░▒░▒░░ ▒░ ░ ░▓ ░▒ ▒ ░ ▒░ ▒ ▒ ░▓ ▒ ░░ ░░ ▒░ ░ |
| ▒ ▒▒ ░░▒ ░ ▒ ▒▒ ░ ░ ▒ ▒ ░▒░ ░ ░ ░ ░ ▒ ░ ░ ░ ░ ░░ ░ ▒░ ▒ ░ ░ ░ ░ ░ |
| ░ ▒ ░░ ░ ▒ ░ ░ ░░ ░ ░ ▒ ░░ ░ ░ ░ ░ ░ ▒ ░ ░ ░ |
| ░ ░ ░ ░░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ |
| --> |
| |
| <!-- |
| 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 |
| 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"> |
| <title>Apache Ignite - Features</title> |
| <link media="all" rel="stylesheet" href="css/all.css"> |
| <link href="http://netdna.bootstrapcdn.com/font-awesome/4.2.0/css/font-awesome.css" rel="stylesheet"> |
| <link media="all" rel="stylesheet" href="css/syntaxhighlighter.css"> |
| <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'> |
| </head> |
| <body> |
| <div id="wrapper"> |
| <header id="header" class="affix" data-spy="affix" data-offset-top="0"> |
| <div class="container"> |
| <div class="row"> |
| <div class="col-md-3 col-sm-3 col-xs-8"> |
| <div class="logo"><a href="index.html"><img src="images/logo.png" alt="ApacheIgnite"></a></div> |
| </div> |
| <div class="col-md-9 col-sm-9 col-xs-4"> |
| <nav id="nav" class="navbar navbar-default" role="navigation"> |
| <div class="container-fluid"> |
| <div class="navbar-header"> |
| <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar"> |
| <span class="sr-only">Toggle navigation</span> |
| <span class="icon-bar"></span> |
| <span class="icon-bar"></span> |
| <span class="icon-bar"></span> |
| </button> |
| </div> |
| <div class="collapse navbar-collapse" id="navbar"> |
| <ul class="nav navbar-nav"> |
| <li><a href="index.html#overview">Overview</a></li> |
| <li><a href="features.html">Features</a></li> |
| <li><a href="index.html#documentation">Documentation</a></li> |
| <li><a href="index.html#community">Community</a></li> |
| <li><a href="index.html#download">Download</a></li> |
| </ul> |
| </div> |
| </div> |
| </nav> |
| </div> |
| </div> |
| </div> |
| </header> |
| <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> |
| <table cellspacing="5px" cellpadding="5px"> |
| <tbody> |
| <tr> |
| <td class="datagrid"><a href="#datagrid">Data Grid</a></td> |
| <td class="computegrid"><a href="#computegrid">Compute Grid</a></td> |
| <td class="servicegrid"><a href="#servicegrid">Service Grid</a></td> |
| <td class="streaming"><a href="#datastreaming">Streaming</a></td> |
| <td class="hadoop"><a href="#hadoop">Hadoop Acceleration</a></td> |
| </tr> |
| <tr> |
| <td class="filesystem"><a href="#filesystem">Distributed File System</a></td> |
| <td class="clustering"><a href="#clustering">Advanced Clustering</a></td> |
| <td class="messaging"><a href="#messaging">Distributed Messaging</a></td> |
| <td class="events"><a href="#events">Distributed Events</a></td> |
| <td class="datastructures"><a href="#datastructures">Distributed Data Structures</a></td> |
| </tr> |
| </tbody> |
| </table> |
| </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> |
| <img src="images/in_memory_data.png"/> |
| <div class="features-heading">Features:</div> |
| <ul class="features-list"> |
| <li>Distributed In-Memory Caching</li> |
| <li>Lightning Fast Performance</li> |
| <li>Elastic Scalability</li> |
| <li>Distributed In-Memory Transactions</li> |
| <li>Distributed In-Memory Queue and Other Data Structures</li> |
| <li>Web Session Clustering</li> |
| <li>Hibernate L2 Cache Integration</li> |
| <li>Tiered Off-Heap Storage</li> |
| <li>Distributed SQL Queries with Distributed Joins</li> |
| </ul> |
| |
| <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" aria-controls="home" data-toggle="tab">Put and Get</a></li> |
| <li><a href="#datagrid-example-transactions" aria-controls="profile" data-toggle="tab">Transactions</a></li> |
| <li><a href="#datagrid-example-locks" aria-controls="profile" data-toggle="tab">Locks</a></li> |
| <li><a href="#datagrid-example-sqlquery" aria-controls="profile" data-toggle="tab">SQL Query</a></li> |
| <li><a href="#datagrid-example-sqljoin" aria-controls="profile" data-toggle="tab">SQL Join</a></li> |
| </ul> |
| |
| <!-- Tab panes --> |
| <div class="tab-content"> |
| <div class="tab-pane active" id="datagrid-example-basic"> |
| <br/> |
| <p> |
| Basic cache operations example. |
| </p> |
| <pre class="brush:java"> |
| try (Ignite ignite = Ignition.start("examples/config/example-cache.xml")) { |
| final IgniteCache<Integer, String> cache = ignite.jcache("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 class="tab-pane" id="datagrid-example-transactions"> |
| <br/> |
| <p> |
| Transaction example demonstrating multiple reads and puts done atomically. |
| </p> |
| <pre class="brush:java"> |
| // Clone every object we get from cache, so we can freely update it. |
| IgniteCache<Integer, Account> cache = Ignition.ignite().jcache("cacheName"); |
| |
| try (IgniteTx tx = Ignition.ignite().transactions().txStart(PESSIMISTIC, REPEATABLE_READ)) { |
| 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 class="tab-pane" id="datagrid-example-locks"> |
| <br/> |
| <p> |
| Synchronously acquire and release lock by key. |
| </p> |
| <pre class="brush:java"> |
| final GridCache<String, Integer> cache = Ignition.ignite.jcache("cacheName"); |
| |
| cache.lock("Hello"); |
| |
| try { |
| cache.put("Hello", 11); |
| cache.put("World", 22); |
| } |
| finally { |
| cache.unlock("Hello"); |
| } |
| </pre> |
| </div> |
| <div class="tab-pane" id="datagrid-example-sqlquery"> |
| <br/> |
| <p> |
| Person class definition. |
| </p> |
| <pre class="brush:java"> |
| private static class Person implements Serializable { |
| /** Person ID (indexed). */ |
| @CacheQuerySqlField(index = true) |
| private long id; |
| |
| /** Organization ID (indexed). */ |
| @CacheQuerySqlField(index = true) |
| private long orgId; |
| |
| /** First name (not-indexed). */ |
| @CacheQuerySqlField |
| private String firstName; |
| |
| ... |
| } |
| </pre> |
| <br/> |
| <p> |
| Simple distributed SQL query. |
| </p> |
| <pre class="brush:java"> |
| try (Ignite ignite = Ignition.start("examples/config/example-cache.xml")) { |
| GridCache<Long, Person> cache = ignite.jcache("cacheName"); |
| |
| // Create query which selects salaries based on range. |
| CacheQuery<Map.Entry<Long, Person>> 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 class="tab-pane" id="datagrid-example-sqljoin"> |
| <br/> |
| <p> |
| Person class definition. |
| </p> |
| <pre class="brush:java"> |
| private static class Person implements Serializable { |
| /** Person ID (indexed). */ |
| @CacheQuerySqlField(index = true) |
| private long id; |
| |
| /** Organization ID (indexed). */ |
| @CacheQuerySqlField(index = true) |
| private long orgId; |
| |
| /** First name (not-indexed). */ |
| @CacheQuerySqlField |
| private String firstName; |
| |
| ... |
| } |
| </pre> |
| <br/> |
| <p> |
| Distributed query with SQL join between Person and Organization. |
| </p> |
| <pre class="brush:java"> |
| try (Ignite ignite = Ignition.start("examples/config/example-cache.xml")) { |
| GridCache<Long, Person> cache = ignite.jcache("cacheName"); |
| |
| // Create query which joins on 2 types to select people for a specific organization. |
| CacheQuery<Map.Entry<Long, Person>> 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="feature-links"> |
| <a target=wiki href="http://doc.gridgain.org/latest/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> |
| <img src="images/in_memory_compute.png"/> |
| <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>Load Balancing and Fault Tolerance</li> |
| <li>Distributed Messaging and Events</li> |
| <li>Linear Scalability</li> |
| <li>ExecutorService</li> |
| </ul> |
| |
| <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-runnable" aria-controls="profile" data-toggle="tab">Runnable</a></li> |
| <li><a href="#compute-example-closure" aria-controls="profile" data-toggle="tab">Distributed Closure</a></li> |
| </ul> |
| |
| <!-- Tab panes --> |
| <div class="tab-content"> |
| <div class="tab-pane active" id="compute-example-broadcast"> |
| <br/> |
| <p> |
| Print out hello message on all nodes. |
| </p> |
| <pre class="brush:java"> |
| try (Ignite ignite = Ignition.start("examples/config/example-compute.xml")) { |
| // Print out hello message on all nodes. |
| ignite.compute().broadcast( |
| new IgniteRunnable() { |
| @Override public void run() { |
| System.out.println(">>> Hello Node! :)"); |
| } |
| } |
| ); |
| } |
| </pre> |
| </div> |
| <div class="tab-pane" id="compute-example-runnable"> |
| <br/> |
| <p> |
| Iterate through all words in a sentence and print each word on different nodes in the cluster. |
| </p> |
| <pre class="brush:java"> |
| try (Ignite ignite = Ignition.start("examples/config/example-compute.xml")) { |
| Collection<IgniteFuture> futs = new ArrayList<>(); |
| |
| // Enable asynchronous mode. |
| IgniteCompute compute = ignite.compute().withAsync(); |
| |
| // Iterate through all words in the sentence and create runnable jobs. |
| for (final String word : "Print words using runnable".split(" ")) { |
| // Execute runnable on some node. |
| compute.run(new IgniteRunnable() { |
| @Override public void run() { |
| System.out.println("Printing '" + word + "' on this node from ignite job."); |
| } |
| }); |
| |
| futs.add(compute.future()); |
| } |
| |
| // Wait for all futures to complete. |
| for (IgniteFuture<?> f : futs) |
| f.get(); |
| } |
| </pre> |
| </div> |
| <div class="tab-pane" id="compute-example-closure"> |
| </br> |
| <p> |
| This example splits a phrase into collection of words, computes their length on different |
| nodes and then computes total amount of non-whitespaces characters in the phrase. |
| </p> |
| <pre class="brush:java"> |
| try (Ignite ignite = Ignition.start() { |
| // Execute closure on all cluster nodes. |
| Collection<Integer> res = ignite.compute().apply( |
| new IgniteClosure<String, Integer>() { |
| @Override public Integer apply(String word) { |
| System.out.println("Printing '" + word + "' on this node from Ignite job."); |
| |
| // Return number of letters in the word. |
| return word.length(); |
| } |
| }, |
| |
| // Job parameters. Ignite will create as many jobs as there are parameters. |
| Arrays.asList("Count characters using closure".split(" ")) |
| ); |
| |
| int sum = 0; |
| |
| // Add up individual word lengths received from remote nodes. |
| for (int len : res) |
| sum += len; |
| } |
| </pre> |
| </div> |
| </div> |
| </div> |
| |
| <div class="feature-links"> |
| <a target=wiki href="http://doc.gridgain.org/latest/Distributed+Computations">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="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 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"> |
| ... |
| |
| IgniteServices svcs = ignite.services(); |
| |
| IgniteFuture<?> 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://doc.gridgain.org/latest/Distributed+Services">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 processing addresses a large family of applications for which traditional processing methods |
| and disk-based storages, like databases or file systems, fall short. Such applications are pushing |
| the limits of traditional data processing infrastructures. |
| </p> |
| <img src="images/in_memory_streaming.png"/> |
| <p> |
| Streaming support allows to query into rolling 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/> |
| Another most common use case for stream processing is the ability to control and properly pipeline |
| distributed events workflow. As events are coming into the system at high rates, the processing of |
| events is split into multiple stages and each stage has to be properly routed within a |
| cluster for processing. |
| </p> |
| |
| <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 class="feature-links"> |
| <a target=wiki href="http://doc.gridgain.org/latest/Data+Streaming">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="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 industry’s first 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.<br/><br/> |
| In-memory accelerator for Hadoop requires minimal to no integration and works with any commercial or |
| open source version of Hadoop, including Cloudera, HortonWorks, MapR, Apache, Intel, AWS, as well |
| as any other Hadoop 1.x and Hadoop 2.x distributions. |
| </p> |
| <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>Dual Mode - Standalone File System/Primay Caching Layer for HDFS </li> |
| <li>Highly Tunable Read-Through and Write-Through Behavior</li> |
| </ul> |
| <div class="feature-links"> |
| <a target=wiki href="http://hadoop.gridgain.org/latest/Hadoop+Accelerator">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 (IFS). IFS delivers similar functionality to Hadoop HDFS, including the ability to |
| create a fully functional file system in memory. In fact, IFS 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="features-heading">Features:</div> |
| <ul class="features-list"> |
| <li>Provides Typical File System “View” on In-Memory Caches</li> |
| <li>List Directories or 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 class="feature-links"> |
| <a target=wiki href="http://doc.gridgain.org/latest/GGFS">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). In 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="features-heading">Features:</div> |
| <ul class="features-list"> |
| <li>Dynamic Topology Management</li> |
| <li>Automatic Discovery on LAN, WAN, and AWS</li> |
| <li>Automatic “Split-Brain” (i.e. Network Segmentation) Resolution</li> |
| <li>Unicast, Broadcast, and Group-Based Message Exchange</li> |
| <li>On-Demand and Direct Deployment</li> |
| <li>Support for Virtual Clusters and Node Groupings</li> |
| </ul> |
| |
| <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-broadcast" aria-controls="home" data-toggle="tab">Broadcast</a></li> |
| <li><a href="#clustering-example-unicast" aria-controls="profile" data-toggle="tab">Unicast</a></li> |
| </ul> |
| |
| <!-- Tab panes --> |
| <div class="tab-content"> |
| <div class="tab-pane active" id="clustering-example-broadcast"> |
| <br/> |
| <p> |
| Broadcast message to multiple nodes in the cluster. |
| </p> |
| <pre class="brush:java"> |
| try (Ignite ignite = Ignition.start("examples/config/example-compute.xml")) { |
| IgniteRunnable r = new IgniteRunnable() { |
| @Override |
| public void run() { |
| System.out.println("Hello World"); |
| } |
| }; |
| |
| // Broadcast to all cluster nodes. |
| ignite.compute().broadcast(r); |
| |
| // Broadcast to all remote nodes. |
| ignite.compute(ignite.cluster().forRemotes()).broadcast(r); |
| } |
| </pre> |
| </div> |
| |
| <div class="tab-pane" id="clustering-example-unicast"> |
| <br/> |
| <p> |
| Unicast message to a node in the cluster. |
| </p> |
| <pre class="brush:java"> |
| try (Ignite ignite = Ignition.start("examples/config/example-compute.xml")) { |
| IgniteRunnable r = new IgniteRunnable() { |
| @Override |
| public void run() { |
| System.out.println("Hello World"); |
| } |
| }; |
| |
| // Unicast to some random node picked by load balancer. |
| ignite.compute(ignite.cluster().forRandom()).run(r); |
| |
| // Unicast to some node with CPU load less than 50%. |
| ignite.compute(ignite.cluster().forPredicate(new IgnitePredicate<ClusterNode>() { |
| @Override |
| public boolean apply(ClusterNode n) { |
| return n.metrics().getCurrentCpuLoad() <0.5; |
| } |
| })).run(r); |
| } |
| </pre> |
| </div> |
| </div> |
| </div> |
| |
| <div class="feature-links"> |
| <a target=wiki href="http://doc.gridgain.org/latest/Basic+Concepts">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="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 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"> |
| <br/> |
| <p> |
| Send and receive ordered messages |
| </p> |
| <pre class="brush:java"> |
| try (Ignite ignite = Ignition.start("examples/config/example-compute.xml")) { |
| // Add listener for ordered messages on all nodes. |
| ignite.message().remoteListen("MyOrderedTopic", new IgniteBiPredicate<UUID, String>() { |
| @Override public boolean apply(UUID nodeId, String msg) { |
| System.out.println("Received ordered message [msg=" + msg + ", fromNodeId=" + nodeId + ']'); |
| |
| return true; // Return true to continue listening. |
| } |
| }); |
| |
| // Send ordered messages to remote nodes nodes. |
| for (int i = 0; i < 10; i++) |
| ignite.message(ignite.cluster().forRemotes()).sendOrdered("MyOrderedTopic", Integer.toString(i), 0); |
| } |
| </pre> |
| </div> |
| <div class="tab-pane" id="messaging-example-unordered"> |
| <br/> |
| <p> |
| Send and receive unordered messages |
| </p> |
| <pre class="brush:java"> |
| try (Ignite ignite = Ignition.start("examples/config/example-compute.xml")) { |
| // Add listener for unordered messages on all nodes. |
| ignite.message().remoteListen("MyUnOrderedTopic", new IgniteBiPredicate<UUID, String>() { |
| @Override public boolean apply(UUID nodeId, String msg) { |
| System.out.println("Received unordered message [msg=" + msg + ", fromNodeId=" + nodeId + ']'); |
| |
| return true; // Return true to continue listening. |
| } |
| }); |
| |
| // Send unordered messages to remote nodes. |
| for (int i = 0; i < 10; i++) |
| ignite.message(ignite.cluster().forRemotes()).send("MyUnOrderedTopic", Integer.toString(i)); |
| } |
| </pre> |
| </div> |
| </div> |
| </div> |
| |
| <div class="feature-links"> |
| <a target=wiki href="http://doc.gridgain.org/latest/Distributed+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.<br/><br/> |
| In Ignite, event notifications can be grouped together and sent in batches and/or timely intervals. |
| Batching notifications help attain high cache performance and low latency. |
| |
| </p> |
| <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 Filters for Fine-Grained Control Over Notifications</li> |
| <li>Automatic Batching of Notifications for Enhanced Performance</li> |
| </ul> |
| |
| <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"> |
| try (Ignite ignite = Ignition.start("examples/config/example-cache.xml")) { |
| final IgniteCache<Integer, String> cache = ignite.jcache("cacheName"); |
| |
| // sample remote filter which only accepts events for keys |
| // that are greater than or equal to 10. |
| IgnitePredicate<CacheEvent> rmtLsnr = new IgnitePredicate<CacheEvent>() { |
| @Override public boolean apply(CacheEvent evt) { |
| System.out.println("Cache event: " + evt); |
| |
| int key = evt.key(); |
| |
| return key >= 10; |
| } |
| }; |
| |
| // Subscribe to specified cache events on all nodes that have cache running. |
| ignite.events(ignite.cluster().forCacheNodes("cacheName")).remoteListen(null, rmtLsnr, |
| EVT_CACHE_OBJECT_PUT, EVT_CACHE_OBJECT_READ, EVT_CACHE_OBJECT_REMOVED); |
| |
| // Generate cache events. |
| for (int i = 0; i < 20; i++) |
| cache.put(i, Integer.toString(i)); |
| } |
| </pre> |
| </div> |
| </div> |
| </div> |
| |
| <div class="feature-links"> |
| <a target=wiki href="http://doc.gridgain.org/latest/Distributed+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="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> |
| </ul> |
| |
| <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-queues" aria-controls="home" data-toggle="tab">Queues</a></li> |
| <li><a href="#datastructures-example-sets" aria-controls="profile" data-toggle="tab">Sets</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-queues"> |
| <br/> |
| <p> |
| Distributed Queue example. |
| </p> |
| <pre class="brush:java"> |
| try (Ignite ignite = Ignition.start("examples/config/example-cache.xml")) { |
| CollectionConfiguration colCfg = new CollectionConfiguration(); |
| |
| colCfg.setCacheName("cacheName"); |
| |
| // Non-colocated queue which will be distributed |
| // across all data nodes. |
| IgniteQueue<String> 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-sets"> |
| <br/> |
| <p> |
| Distributed Set example. |
| </p> |
| <pre class="brush:java"> |
| // Initialize new set. |
| IgniteSet<String> set = Ignition.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"> |
| // Initialize atomic sequence. |
| IgniteAtomicSequence seq = Ignition.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://doc.gridgain.org/latest/Distributed+Data+Structures">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> |
| <footer id="footer"> |
| <div class="container"> |
| <div class="row"> |
| <div class="col-md-4 col-sm-5"> |
| <div class="logo"><a href="#wrapper"><img src="images/logo2.png" alt="Crowley Marine serving boalers for over years."></a></div> |
| </div> |
| <nav class="col-md-4 col-sm-3 footer-nav"> |
| <ul class="list-unstyled"> |
| <li><a href="#overview">Overview</a></li> |
| <li><a href="#documentation">Documentation</a></li> |
| <li><a href="#community">Community</a></li> |
| <li><a href="#download">Download</a></li> |
| </ul> |
| </nav> |
| <div class="col-md-4 col-sm-4"> |
| <p align="right">© 2014 Copyright <a href="#"><b>Apache Ignite</b></a></p> |
| <ul class="social-networks list-unstyled"> |
| <li><a href="https://www.linkedin.com/company/249196" class="icon-linkedin"></a></li> |
| <li><a href="https://www.twitter.com/gridgain" class="icon-twitter"></a></li> |
| <li><a href="https://plus.google.com/101084158514011491168/posts" class="icon-google-plus"></a></li> |
| <li><a href="https://www.vimeo.com/gridgain" class="icon-youtube"></a></li> |
| </ul> |
| </div> |
| </div> |
| </div> |
| </footer> |
| </div> |
| <script src="http://crux-framework-tools.googlecode.com/svn/trunk/misc/highlight/highlightLoader.js"></script> |
| <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> |
| <script type="text/javascript">window.jQuery || document.write('<script src="js/jquery-1.11.1.min.js"><\/script>')</script> |
| <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.0/js/bootstrap.min.js"></script> |
| <script type="text/javascript" src="js/jquery.main.js"></script> |
| <script type="text/javascript"> |
| if (navigator.userAgent.match(/IEMobile\/10\.0/)) { |
| var msViewportStyle = document.createElement('style'); |
| msViewportStyle.appendChild( |
| document.createTextNode( |
| '@-ms-viewport{width:auto!important}' |
| ) |
| ); |
| document.querySelector('head').appendChild(msViewportStyle) |
| } |
| </script> |
| <script type="text/javascript"> |
| $('ul#compute-examples a[href="compute-example-basic"]').click(function (e) { |
| e.preventDefault(); |
| |
| $(this).tab('show') |
| }); |
| |
| $('ul#compute-examples a[href="compute-example-transactions"]').click(function (e) { |
| e.preventDefault(); |
| |
| $(this).tab('show') |
| }); |
| |
| $('ul#compute-examples a[href="compute-example-locks"]').click(function (e) { |
| e.preventDefault(); |
| |
| $(this).tab('show') |
| }); |
| |
| $('ul#compute-examples a[href="compute-example-sqlquery"]').click(function (e) { |
| e.preventDefault(); |
| |
| $(this).tab('show') |
| }); |
| |
| $('ul#compute-examples a[href="compute-example-sqljoin"]').click(function (e) { |
| e.preventDefault(); |
| |
| $(this).tab('show') |
| }); |
| |
| $('ul#compute-examples a[href="compute-example-broadcast"]').click(function (e) { |
| e.preventDefault(); |
| |
| $(this).tab('show') |
| }); |
| |
| $('ul#compute-examples a[href="compute-example-runnable"]').click(function (e) { |
| e.preventDefault(); |
| |
| $(this).tab('show') |
| }) |
| |
| $('ul#compute-examples a[href="compute-example-closure"]').click(function (e) { |
| e.preventDefault(); |
| |
| $(this).tab('show') |
| }) |
| |
| $('ul#compute-examples a[href="service-example"]').click(function (e) { |
| e.preventDefault(); |
| |
| $(this).tab('show') |
| }) |
| |
| $('ul#compute-examples a[href="messaging-example-ordered"]').click(function (e) { |
| e.preventDefault(); |
| |
| $(this).tab('show') |
| }) |
| |
| $('ul#compute-examples a[href="messaging-example-unordered"]').click(function (e) { |
| e.preventDefault(); |
| |
| $(this).tab('show') |
| }) |
| |
| $('ul#compute-examples a[href="events-example-cache"]').click(function (e) { |
| e.preventDefault(); |
| |
| $(this).tab('show') |
| }) |
| |
| $('ul#compute-examples a[href="clustering-example-broadcast"]').click(function (e) { |
| e.preventDefault(); |
| |
| $(this).tab('show') |
| }) |
| |
| $('ul#compute-examples a[href="clustering-example-unicast"]').click(function (e) { |
| e.preventDefault(); |
| |
| $(this).tab('show') |
| }) |
| |
| $('ul#compute-examples a[href="datastructures-example-queues"]').click(function (e) { |
| e.preventDefault(); |
| |
| $(this).tab('show') |
| }) |
| |
| $('ul#compute-examples a[href="datastructures-example-sets"]').click(function (e) { |
| e.preventDefault(); |
| |
| $(this).tab('show') |
| }) |
| |
| $('ul#compute-examples a[href="datastructures-example-sequence"]').click(function (e) { |
| e.preventDefault(); |
| |
| $(this).tab('show') |
| }) |
| </script> |
| </body> |
| </html> |