You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by dm...@apache.org on 2020/03/27 17:08:37 UTC

svn commit: r1875787 [8/12] - in /ignite/site/trunk: ./ arch/ community/ css/ features/ images/ images/benchmarks/ images/png-diagrams/ images/svg-diagrams/ images/svg-sprites/ images/svg/ includes/ js/ releases/2.6.0/dotnetdoc/ releases/2.7.0/dotnetdo...

Modified: ignite/site/trunk/features/collocatedprocessing.html
URL: http://svn.apache.org/viewvc/ignite/site/trunk/features/collocatedprocessing.html?rev=1875787&r1=1875786&r2=1875787&view=diff
==============================================================================
--- ignite/site/trunk/features/collocatedprocessing.html (original)
+++ ignite/site/trunk/features/collocatedprocessing.html Fri Mar 27 17:08:35 2020
@@ -39,51 +39,65 @@ under the License.
     <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>Collocated Processing - Apache Ignite</title>
+
+    <title>Co-located Processing - Apache Ignite</title>
+
+    <meta name="description"
+          content="Apache Ignite supports co-located processing technique for compute-intensive and data-intensive calculations
+          as well as machine learning algorithms. This technique increases performance by eliminating the impact of
+          network latency."/>
+
+
     <!--#include virtual="/includes/styles.html" -->
 
     <!--#include virtual="/includes/sh.html" -->
 </head>
 <body>
-<div id="wrapper">
-    <!--#include virtual="/includes/header.html" -->
-
-    <main id="main" role="main" class="container">
-        <section id="memory-centric" class="page-section">
-            <h1 class="first">Collocated Processing</h1>
-            <div class="col-sm-12 col-md-12 col-xs-12" style="padding:0 0 20px 0;">
-                <div class="col-sm-6 col-md-6 col-xs-12" style="padding-left:0; padding-right:0">
-                    <p>
-                        The disk-centric systems, like RDBMS or NoSQL, generally utilize the classic client-server
-                        approach, where the data is brought from the server to the client side where it gets processed
-                        and then is usually discarded. This approach does not scale well as moving the data over the
-                        network is the most expensive operation in a distributed system.
-                    </p>
-                    <p>
-                        A much more scalable approach is <code>collocated</code> processing that reverses the flow by bringing
-                        the computations to the servers where the data actually resides. This approach allows you to
-                        execute advanced logic or distributed SQL with JOINs exactly where the data is stored avoiding
-                        expensive serialization and network trips.
-                    </p>
-                </div>
-                <div class="col-sm-6 col-md-6 col-xs-12" style="padding-right:0">
-                    <img class="img-responsive" src="/images/collocated_processing.png" width="440px" style="float: right; margin-top: -25px;"/>
-                </div>
-            </div>
 
-            <div class="page-heading">Data Collocation</div>
-            <p>
-                To start benefiting from the collocated processing, we need to ensure that the data is properly collocated
-                in the first place. If the business logic requires to access more than one entry, it is usually best to
-                collocate dependent entries on a single cluster node. This technique is also known as
-                <code>affinity collocation</code> of the data.
-            </p>
-            <p>
-                In the example below, we have <code>Country</code> and <code>City</code> tables and want to collocate
-                <code>City</code> entries with their corresponding <code>Country</code> entries. To achieve this,
-                we use the <code>WITH</code> clause and specify <code>affinityKey=CountryCode</code> as shown below:
-            </p>
-            <div class="tab-content">
+<!--#include virtual="/includes/header.html" -->
+<article>
+    <header>
+        <div class="container">
+        
+        <h1>Minimizing Network Utilization <strong>With Co-located Processing</strong></h1>
+        </div>
+    </header>
+    <div class="container">
+        <p>
+            Apache Ignite®  supports co-located processing technique for compute-intensive and data-intensive calculations
+            as well as machine learning algorithms. This technique increases performance by eliminating the impact of
+            network latency.
+        </p>
+        <img class="diagram-right img-responsive" src="/images/svg-diagrams/high_performance_compute.svg" alt="Co-located Processing diagram" />
+        <p>
+            In traditional disk-based systems, such as relational or NoSQL databases, client applications
+            usually bring data from servers, use the records for local calculations, and discard the data as
+            soon as the business task is complete. This approach does not scale well if a significant volume
+            of data gets transferred over the network.
+        </p>
+        <p>
+            To overcome this issue, Apache Ignite supports a co-located processing technique. The primary
+            aim of the technique is to increase the performance of your complex calculations or SQL with
+            JOINs by running them straight on Ignite cluster nodes. In co-located processing, calculations
+            are done on local data sets of the cluster nodes. This avoids records shuffling over the
+            network and eliminates the impact of network latency on the performance of your applications.
+        </p>
+        
+                    
+
+        <h2>Data Co-location</h2>
+        <p>
+            To use co-located processing in practice, first, you need to co-locate data sets by storing
+            related records on the same cluster node. This process is also known as affinity co-location in Ignite.
+        </p>
+        <p>
+            For example, let's introduce <code>Country</code> and <code>City</code> tables and co-locate
+            all <code>City</code> records that have the same <code>Country</code> identifier on a single node. To
+            achieve this, you need to set <code>CountryCode</code> as an <code>affinityKey</code> in <code>City</code>
+            table:
+        </p>
+            
+        <div class="tab-content">
 
                 <div class="tab-pane active" id="sql-tables">
                         <pre class="brush:sql">
@@ -109,22 +123,24 @@ under the License.
                         </pre>
                 </div>
             </div>
+            
             <p>
-                By collocating the tables together we can ensure that all the entries with the same <code>affinityKey</code>
-                will be stored on the same cluster node, hence avoiding costly network trips to fetch data from other
-                remote nodes.
+                This way, you instruct Ignite to store all the <code>Cities</code> with the same <code>CountryCode
+                </code> on a single cluster node. As soon as the data is co-located, Ignite can execute compute and
+                data-intensive logic, and SQL with JOINs straight on the cluster nodes minimizing or even eliminating network
+                utilization.
             </p>
-            <div class="page-heading">SQL and Distributed JOINs</div>
+
+            <h2>SQL and Distributed JOINs</h2>
             <p>
-                Apache Ignite SQL engine will always perform much more efficiently if a query is run against the
-                collocated data. It is especially crucial for execution of distributed JOINs within the cluster.
+                Ignite SQL engine performs much faster if a query gets executed against co-located records. This is
+                especially crucial for SQL with JOINs that can span many cluster nodes.
             </p>
             <p>
-                Taking the example of the two tables created above, let's get the most populated cities across China,
-                Russia and the USA joining the data stored in the <code>Country</code> and <code>City</code> tables, as follows:
+                Using the previous example with <code>Country</code> and <code>City</code> tables,
+                let's join the two tables returning the most populated cities in the given countries:
             </p>
             <div class="tab-content">
-
                 <div class="tab-pane active" id="sql-joins-query">
                         <pre class="brush:sql">
                             SELECT country.name, city.name, MAX(city.population) as max_pop
@@ -137,26 +153,28 @@ under the License.
                 </div>
             </div>
             <p>
-                Since all the cities were collocated with their countries, the JOIN will execute only on the nodes
-                that store China, Russia and the USA entries. This approach <i>avoids</i> expensive data movement
-                across the network, and therefore scales better and provides the fastest performance.
+                This query is executed only on the nodes that store records of China, Russia, and the USA. Also, during
+                the JOIN, the records are not shuffled between the nodes since all the <code>Cities
+                </code> with the same <code>city.countrycode</code> are stored on a single node.
             </p>
-            <div class="page-heading">Distributed Collocated Computations</div>
+
+            <h2>Distributed Collocated Computations</h2>
             <p>
-                Apache Ignite compute grid and machine learning components allow to perform computations and execute
+                Apache Ignite compute and machine learning APIs allow you to perform computations and execute
                 machine learning algorithms in parallel to achieve high performance, low latency, and linear scalability.
-                Furthermore, both components work best with collocated data and collocated processing in general.
+                Furthermore, both components work best with co-located data sets.
             </p>
             <p>
-                For instance, let's assume that a blizzard is approaching New York. As a telecommunication company,
-                you have to send a warning text message to 8 million New Yorkers.
-                With the client-server approach the company has to move all <nobr>8 million (!)</nobr> records
-                from the database to the client text messaging application, which does not scale.
+                Let's take another example by imagining that a winter storm is about to hit a highly-populated city. As
+                a telecommunication company, you have to send a text message to 20 million residents notifying about the
+                blizzard. With the client-server approach, the company would read all 20 million records from a database
+                to an application that needs to execute some logic and send a message to the residents eventually.
             </p>
             <p>
-                A much more efficient approach would be to send the text-messaging logic to the cluster node responsible
-                for storing the New York residents. This approach moves only 1 computation instead of 8 million records
-                across the network, and performs a lot better.
+                A much more efficient approach would be to run the logic on and send text messages from the cluster nodes
+                that store the records of the residents. With this technique, instead of pulling 20 million records via
+                the network, you execute the logic in place and eliminate the network impact on the performance of the
+                calculation.
             </p>
 
             <p>
@@ -176,7 +194,7 @@ Ignite ignite = ...
 // NewYork ID.
 long newYorkId = 2;
 
-// Sending the logic to a cluster node that stores NewYork and all its inhabitants.
+// Send the logic to the cluster node that stores NewYork and all its inhabitants.
 ignite.compute().affinityRun("City", newYorkId, new IgniteRunnable() {
 
   @IgniteInstanceResource
@@ -184,7 +202,7 @@ ignite.compute().affinityRun("City", new
 
   @Override
   public void run() {
-    // Getting an access to Persons cache.
+    // Get access to the Person cache.
     IgniteCache&#60;BinaryObject, BinaryObject&#62; people = ignite.cache("Person").withKeepBinary();
 
 
@@ -195,11 +213,11 @@ ignite.compute().affinityRun("City", new
       for (Cache.Entry&#60;BinaryObject, BinaryObject&#62; entry : cursor) {
         BinaryObject personKey = entry.getKey();
 
-        // Picking NewYorker's only.
+        // Pick NewYorkers only.
         if (personKey.&#60;Long&#62;field("CITY_ID") == newYorkId) {
             person = entry.getValue();
 
-            // Sending the warning message to the person.
+            // Send the warning message to the person.
         }
       }
     }
@@ -210,79 +228,28 @@ ignite.compute().affinityRun("City", new
                 </div>
             </div>
 
-            <div class="page-heading">More on Collocated Processing</div>
-            <table class="formatted" name="More on Ignite Transactions">
-                <thead>
-                <tr>
-                    <th width="35%" class="left">Feature</th>
-                    <th>Description</th>
-                </tr>
-                </thead>
-                <tbody>
-                <tr>
-                    <td class="features-left">Affinity Collocation</td>
-                    <td>
-                        <p>
-                            If business logic requires to access more than one entry it can be reasonable to
-                            collocate dependent entries by storing them on a single cluster node:
-                        </p>
-                        <div  class="page-links">
-                            <a href="https://apacheignite.readme.io/docs/affinity-collocation" target="docs">Docs for this feature <i class="fa fa-angle-double-right"></i></a>
-                        </div>
-                    </td>
-                </tr>
-                <tr>
-                    <td class="features-left">Collocated Computations</td>
-                    <td>
-                        <p>
-                            It is also possible to route computations to the nodes where the data is stored:
-                        </p>
-                        <div  class="page-links">
-                            <a href="https://apacheignite.readme.io/docs/collocate-compute-and-data" target="docs">Docs for this feature <i class="fa fa-angle-double-right"></i></a>
-                        </div>
-                    </td>
-                </tr>
-                <tr>
-                    <td class="features-left">Compute Grid</td>
-                    <td>
-                        <p>
-                            Distributed computations are performed in parallel fashion to gain high performance, low latency, and linear scalability:
-                        </p>
-                        <div  class="page-links">
-                            <a href="https://apacheignite.readme.io/docs/compute-grid" target="docs">Docs for this feature <i class="fa fa-angle-double-right"></i></a>
-                        </div>
-                    </td>
-                </tr>
-                <tr>
-                    <td class="features-left">Distributed JOINs</td>
-                    <td>
-                        <p>
-                            Ignite supports collocated and non-collocated distributed SQL joins:
-                        </p>
-                        <div  class="page-links">
-                            <a href="https://apacheignite-sql.readme.io/docs/distributed-joins" target="docs">Docs for this feature <i class="fa fa-angle-double-right"></i></a>
-                        </div>
-                    </td>
-                </tr>
-                <tr>
-                    <td class="features-left">Machine Learning</td>
-                    <td>
-                        <p>
-                            Ignite machine learning component allows users to run ML/DL training and inference directly
-                            on the data stored in an Ignite cluster and provides ML and DL algorithms:
-                        </p>
-                        <div  class="page-links">
-                            <a href="https://apacheignite.readme.io/docs/machine-learning" target="docs">Docs for this feature <i class="fa fa-angle-double-right"></i></a>
-                        </div>
-                    </td>
-                </tr>
-                </tbody>
-            </table>
-        </section>
-    </main>
-
+            <div class="jumbotron jumbotron-fluid">
+                <div class="container">
+                  <div class="title display-6">Learn More</div>
+                  <hr class="my-4">
+                  <div class="row">
+                    <div class="col-sm-6">
+                        <ul>
+                            <li><a href="https://apacheignite.readme.io/docs/compute-grid" target="docs">Compute APIs <i class="fa fa-angle-double-right"></i></a></li>
+                            <li><a href="/features/machinelearning.html">Machine and Deep Learning <i class="fa fa-angle-double-right"></i></a></li>
+                        </ul>
+                    </div>
+                    <div class="col-sm-6">
+                        <ul>
+                            <li><a href="/use-cases/hpc.html">High Performance Computing with Apache Ignite <i class="fa fa-angle-double-right"></i></a></li>
+                        </ul>
+                    </div>
+                </div>
+            </div>
+        </div>
+</article>        
     <!--#include virtual="/includes/footer.html" -->
-</div>
+
 <!--#include virtual="/includes/scripts.html" -->
 </body>
 </html>

Modified: ignite/site/trunk/features/datastructures.html
URL: http://svn.apache.org/viewvc/ignite/site/trunk/features/datastructures.html?rev=1875787&r1=1875786&r2=1875787&view=diff
==============================================================================
--- ignite/site/trunk/features/datastructures.html (original)
+++ ignite/site/trunk/features/datastructures.html Fri Mar 27 17:08:35 2020
@@ -45,36 +45,34 @@ under the License.
     <!--#include virtual="/includes/sh.html" -->
 </head>
 <body>
-<div id="wrapper">
     <!--#include virtual="/includes/header.html" -->
-
-    <main id="main" role="main" class="container">
-        <section id="datastructures" class="page-section">
-            <h1 class="first">Distributed Data Structures</h1>
-            <p>
-                Ignite allows for most of the data structures from <code>java.util.concurrent</code>
-                framework to be used in a distributed fashion. For example, you can take
-                <code>java.util.concurrent.BlockingDeque</code> and add something to it on one node and
-                poll it from another node. Or have a distributed ID generator, which would
-                guarantee uniqueness of IDs on all nodes.
-            </p>
-            <p>
-                <div class="page-heading">Supported Data Structures:</div>
-                <ul class="page-list">
-                    <li><a href="/features/datagrid.html">Concurrent Map (Cache)</a></li>
-                    <li><a href="http://apacheignite.readme.io/docs/queue-and-set" target="docs">Distributed Queues and Sets</a></li>
-                    <li><a href="http://apacheignite.readme.io/docs/atomic-types" target="docs">AtomicLong</a></li>
-                    <li><a href="http://apacheignite.readme.io/docs/atomic-types" target="docs">AtomicReference</a></li>
-                    <li><a href="http://apacheignite.readme.io/docs/id-generator" target="docs">AtomicSequence (ID Generator)</a></li>
-                    <li><a href="http://apacheignite.readme.io/docs/countdownlatch" target="docs">CountDownLatch</a></li>
-                    <li><a href="http://apacheignite.readme.io/docs/executor-service" target="docs">ExecutorService</a></li>
-                </ul>
-            </p>
-            <div class="code-examples">
-                <div class="page-heading">Code Examples:</div>
+<article>
+    <header>
+        <div class="container">
+    		<h1 >Distributed <strong>Data Structures</strong></h1>
+        </div>
+    </header>
+    <div class="container">
+        <p>
+            Apache Ignite®  allows for most of the data structures from <code>java.util.concurrent</code> framework to be used in a distributed fashion. For example, you can take <code>java.util.concurrent.BlockingDeque</code> and add something to it on one node and poll it from another node. Or have a distributed ID generator, which would guarantee uniqueness of IDs on all nodes.
+        </p>
+            
+        
+				    <h2>Supported Data Structures:</h2>
+                	<ul class="page-list">
+                    	<li><a href="/use-cases/datagrid.html">Concurrent Map (Cache)</a></li>
+                    	<li><a href="http://apacheignite.readme.io/docs/queue-and-set" target="docs">Distributed Queues and Sets</a></li>
+                    	<li><a href="http://apacheignite.readme.io/docs/atomic-types" target="docs">AtomicLong</a></li>
+                    	<li><a href="http://apacheignite.readme.io/docs/atomic-types" target="docs">AtomicReference</a></li>
+                    	<li><a href="http://apacheignite.readme.io/docs/id-generator" target="docs">AtomicSequence (ID Generator)</a></li>
+                    	<li><a href="http://apacheignite.readme.io/docs/countdownlatch" target="docs">CountDownLatch</a></li>
+                    	<li><a href="http://apacheignite.readme.io/docs/executor-service" target="docs">ExecutorService</a></li>
+                	</ul>
+			
+                <h2>Code Examples:</h2>
                 <!-- Nav tabs -->
                 <ul id="datastructure-examples" class="nav nav-tabs">
-                    <li class="active"><a href="#example-queue" aria-controls="home" data-toggle="tab">BlockingQueue</a></li>
+                    <li><a class="active" href="#example-queue" aria-controls="home" data-toggle="tab">BlockingQueue</a></li>
                     <li><a href="#example-set" aria-controls="profile" data-toggle="tab">Set</a></li>
                     <li><a href="#example-sequence" aria-controls="profile" data-toggle="tab">AtomicSequence</a></li>
                     <li><a href="#example-long" aria-controls="profile" data-toggle="tab">AtomicLong</a></li>
@@ -171,16 +169,18 @@ under the License.
                         </pre>
                     </div>
                 </div>
-            </div>
-            <div class="page-heading">GitHub Examples:</div>
-            <p>
-                Also see <a href="https://github.com/apache/ignite/tree/master/examples/src/main/java/org/apache/ignite/examples/datastructures" target="github">data structure examples</a>
-                available on GitHub.
-            </p>
-        </section>
-        <section id="key-features" class="page-section">
+            
+                
+        <h2>GitHub Examples:</h2>
+        <p>
+            Also see <a href="https://github.com/apache/ignite/tree/master/examples/src/main/java/org/apache/ignite/examples/datastructures" target="github">data structure examples</a>
+            available on GitHub.
+        </p>
+            
+        
+
             <h2>Data Structure Features</h2>
-            <table class="formatted" name="Data Structure Features">
+            <table class="table table-bordered table-striped" name="Data Structure Features">
                 <thead>
                     <tr>
                         <th width="35%" class="left">Feature</th>
@@ -276,11 +276,10 @@ under the License.
                     </tr>
                 </tbody>
             </table>
-        </section>
-    </main>
-
-    <!--#include virtual="/includes/footer.html" -->
 </div>
+</article>        
+    <!--#include virtual="/includes/footer.html" -->
+
 <!--#include virtual="/includes/scripts.html" -->
 </body>
 </html>

Modified: ignite/site/trunk/features/machinelearning.html
URL: http://svn.apache.org/viewvc/ignite/site/trunk/features/machinelearning.html?rev=1875787&r1=1875786&r2=1875787&view=diff
==============================================================================
--- ignite/site/trunk/features/machinelearning.html (original)
+++ ignite/site/trunk/features/machinelearning.html Fri Mar 27 17:08:35 2020
@@ -39,108 +39,105 @@ under the License.
     <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>Machine Learning - Apache Ignite</title>
+
+    <meta name="description"
+          content="Apache Ignite Machine Learning is a set of simple, scalable, and efficient APIs that
+                        allow building predictive machine learning models at scale and to enable continuous learning."/>
+
     <!--#include virtual="/includes/styles.html" -->
 
     <!--#include virtual="/includes/sh.html" -->
 </head>
 <body>
-<div id="wrapper">
+
     <!--#include virtual="/includes/header.html" -->
+<article>
+    <header>
+        <div class="container">
+            <h1>Apache Ignite <strong>Machine Learning</strong></h1>
+        </div>
+    </header>
+    <div class="container">
+            <p>
+                Apache Ignite® Machine Learning (ML) is a set of simple, scalable, and efficient tools that
+                allow building predictive machine learning models without costly data transfers. The rationale for
+                adding machine and deep learning (DL) to Apache Ignite is quite simple.
+                Today's data scientists have to deal with two major factors that keep ML from mainstream adoption.
+            </p>
+            <h2>Problem #1: Constant Data Movement (ETL)</h2>
 
-    <main id="main" role="main" class="container">
-        <section id="machine-learning" class="page-section">
-            <h1 class="first">Machine Learning</h1>
-            <div class="col-sm-12 col-md-12 col-xs-12" style="padding-left:0; padding-right:0;">
-                <div class="col-sm-6 col-md-7 col-xs-12" style="padding-left:0; padding-right:0;">
-                    <p>Apache Ignite Machine Learning (ML) is a set of simple, scalable and efficient tools that allow
-                        building predictive machine learning models without costly data transfers.
-                    </p>
-                    <p>
-                        The rationale for adding machine and deep learning (DL) to Apache Ignite is quite simple.
-                        Today's data scientists have to deal with two major factors that keep ML from mainstream adoption.
-
-                    </p>
-                    <div class="page-heading">Problem #1: Constant Data Movement (ETL)</div>
-
-                    <p>
-                        First, the models are trained and deployed (after the training is over) in different systems.
-                        The data scientists have to wait for ETL or some other data transfer process to move the data
-                        into a system like Apache Mahout or Apache Spark for a training purpose. Then they have to wait
-                        while this process completes and redeploy the models in a production environment. The whole
-                        process can take hours moving terabytes of data from one system to another. Moreover, the
-                        training part usually happens over the old data set.
-                    </p>
-                </div>
-                <div class="col-sm-6 col-md-5 col-xs-12" style="padding-right:0; top: -10px;">
-                    <img class="img-responsive" src="/images/machine_learning.png" width="440px" style="float:right;"/>
-                </div>
-            </div>
+            <img class="diagram-right img-responsive" src="/images/svg-diagrams/machine_learning.svg" alt="Apache Ignite Machine Learning" />
+            <p>
+                First, the models are trained and deployed (after the training is over) in different systems.
+                The data scientists have to wait for ETL or some other data transfer process to move the data
+                into a system like Apache Mahout or Apache Spark for a training purpose. Then they have to wait
+                while this process completes and redeploy the models in a production environment. The whole
+                process can take hours moving terabytes of data from one system to another. Moreover, the
+                training part usually happens over the old data set.
+            </p>
+                    
 
-            <div class="page-heading">Problem #2: Lack of Horizontal Scalability</div>
+            <h2>Problem #2: Lack of Horizontal Scalability</h2>
 
             <p>
-                The second factor is related to scalability. ML and DL algorithms that have to
-                process data sets which no longer fit within a single server unit are constantly growing.
-                This urges the data scientist to come up with sophisticated solutions o​r turn to distributed
-                computing platforms such as Apache Spark and TensorFlow. However, those platforms mostly solve
-                only a part of the puzzle which is the models training, making it a burden of the developers to
-                decide how do deploy the models in production later.
+                The second factor relates to scalability. ML and DL algorithms have to process data sets that no
+                longer fit within a single server unit are continually growing. This requires data scientists to come
+                up with sophisticated solutions or turn to distributed computing platforms such as Apache Spark and
+                TensorFlow. However, those platforms mostly solve only a part of the puzzle, which is the models
+                training, making it a burden for the developers to decide how to deploy the models in production later.
             </p>
 
-            <div class="page-heading">Zero ETL and Massive Scalability</div>
+            <h2>Zero ETL and Massive Scalability</h2>
 
             <p>
-                Ignite Machine Learning relies on Ignite's memory-centric storage that brings massive scalability
+                Ignite Machine Learning relies on Ignite's multi-tier storage that brings massive scalability
                 for ML and DL tasks and eliminates the wait imposed by ETL between the different systems.
-                For instance, it allows users to run ML/DL training and inference directly on data stored across
+                For instance, it allows users to run ML/DL training and inference directly on the data stored across
                 memory and disk in an Ignite cluster. Next, Ignite provides a host
                 of ML and DL algorithms that are optimized for Ignite's collocated distributed processing.
                 These implementations deliver in-memory speed and unlimited horizontal scalability when running
                 in place against massive data sets or incrementally against incoming data streams, without
                 requiring the data to be moved into another store. By eliminating the data movement and the
-                long processing wait times, Ignite Machine learning enables continuous learning that can
+                lengthy processing wait times, Ignite Machine learning enables continuous learning that can
                 improve decisions based on the latest data as it arrives in real-time.
             </p>
 
-            <div class="page-heading">Fault Tolerance and Continuous Learning</div>
+            <h2>Fault Tolerance and Continuous Learning</h2>
             <p>
-                Apache Ignite Machine Learning is tolerant to node failures. This means that in the case of node
+                Ignite Machine Learning is tolerant to node failures. This means that in the case of node
                 failures during the learning process, all recovery procedures will be transparent to the user,
-                learning processes won't be interrupted, and we will get results in the time similar to the case when
-                all nodes work fine.
+                learning processes won't be interrupted, and you will get results in the time similar to the case when
+                all nodes are up and running.
             </p>
-            <p><a href="https://apacheignite.readme.io/docs/machine-learning" target="_blank" rel="noopener">Read more</a></p>
-        </section>
 
-        <section id="ga-grid" class="page-section">
-            <div class="col-sm-12 col-md-12 col-xs-12">
-                <div class="col-sm-6 col-md-7 col-xs-12" style="padding-left:0; padding-right:15px;">
-                    <h2 style="padding-bottom: 5px; margin-bottom: 20px;">Genetic Algorithms</h2>
-
-                    <p>Machine learning component goes with a set of genetic algorithms (GA) which is a method of
-                        solving optimization problems by simulating the process of biological evolution.
-                    </p>
-                    <p>
-                        GAs are excellent for searching through large and complex data sets for an optimal solution.
-                        Real world applications of GAs include:  automotive design, computer gaming, robotics, investments,
-                        traffic/shipment routing and more.
-                    </p>
-
-                    <div class="page-links">
-                        <a href="https://apacheignite.readme.io/docs/genetic-algorithms" target="_blank" rel="noopener">Genetic Algorithms<i class="fa fa-angle-double-right"></i></a>
+            <div class="jumbotron jumbotron-fluid">
+                <div class="container">
+                  <div class="title display-6">Learn More</div>
+                  <hr class="my-4">
+                  <div class="row">
+                    <div class="col-sm-6">
+                        <ul>
+                            <li><a href="https://apacheignite.readme.io/docs/machine-learning" target="docs">Ignite Machine Learning Documentation <i class="fa fa-angle-double-right"></i></a></li>
+                            <li><a href="https://apacheignite.readme.io/docs/ml-partition-based-dataset" target="docs">Partition-Based Data Sets <i class="fa fa-angle-double-right"></i></a></li>
+                        </ul>
+                    </div>
+                    <div class="col-sm-6">
+                        <ul>
+                            <li><a href="/features/tensorflow.html">Apache Ignite integration for TensorFlow <i class="fa fa-angle-double-right"></i></a></li>
+                        </ul>
                     </div>
                 </div>
-                <div class="col-sm-6 col-md-5 col-xs-12" style="padding-right:0;">
-                    <a href="/images/GAGrid_Overview.png"><img class="img-responsive" src="/images/GAGrid_Overview.png"></a>&nbsp;
-                    <p class="img-caption">Click on the image to view full size.</p>
-                </div>
-            </div><p>&nbsp;</p>
-        </section>
-    </main>
+            </div>
+        </div>
+
+    </div>
+    
+</article>
 
     <!--#include virtual="/includes/footer.html" -->
-</div>
+
 <!--#include virtual="/includes/scripts.html" -->
 </body>
 </html>

Modified: ignite/site/trunk/features/messaging.html
URL: http://svn.apache.org/viewvc/ignite/site/trunk/features/messaging.html?rev=1875787&r1=1875786&r2=1875787&view=diff
==============================================================================
--- ignite/site/trunk/features/messaging.html (original)
+++ ignite/site/trunk/features/messaging.html Fri Mar 27 17:08:35 2020
@@ -45,133 +45,131 @@ under the License.
     <!--#include virtual="/includes/sh.html" -->
 </head>
 <body>
-<div id="wrapper">
-    <!--#include virtual="/includes/header.html" -->
-
-    <main id="main" role="main" class="container">
-        <section id="messaging" class="page-section">
-            <h1 class="first">Distributed Messaging and Events</h1>
-            <p>
-                Ignite provides <b>high-performance cluster-wide messaging</b> functionality to exchange data via
-                publish-subscribe and direct point-to-point communication models. Messages can be exchanged in an
-                ordered or unordered fashion. Ordered messages are slightly slower, but when used, Ignite
-                guarantees that messages will be received in the same order they were sent.
-            </p>
-
-            <p>
-                Ignite <b>distributed events</b> functionality allows applications to receive notifications when a variety
-                of events occur in the distributed grid environment. You can automatically get notified for task executions,
-                read, write or query operations occurring on local or remote nodes within the cluster.
-                Event notifications can also be grouped together and sent in batches or timely intervals.
-            </p>
-            <div class="code-examples">
-                <div class="page-heading">Code 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>
-                    <li><a href="#events-example-local" aria-controls="profile" data-toggle="tab">Local Events</a></li>
-                    <li><a href="#events-example-remote" aria-controls="profile" data-toggle="tab">Remote Events</a></li>
-                </ul>
+ <!--#include virtual="/includes/header.html" -->
+ <article>
+    <header>
+        <div class="container">
+            <h1>Distributed <strong>Messaging and Events</strong></h1>
+        </div>
+    </header>
+    <div class="container">
+
+        <p>
+            Apache Ignite® provides <b>high-performance cluster-wide messaging</b> functionality to exchange data via publish-subscribe and direct point-to-point communication models. Messages can be exchanged in an ordered or unordered fashion. Ordered messages are slightly slower, but when used, Ignite guarantees that messages will be received in the same order they were sent.
+        </p>
+
+        <p> Ignite <b>distributed events</b> functionality allows applications to receive notifications when a variety of events occur in the distributed grid environment. You can automatically get notified for task executions,
+        read, write or query operations occurring on local or remote nodes within the cluster.
+        Event notifications can also be grouped together and sent in batches or timely intervals.
+        </p>
+                
+        <h2>Code Examples:</h2>
+        <!-- Nav tabs -->
+        <ul id="messaging-examples" class="nav nav-tabs">
+            <li><a class="active" 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>
+            <li><a href="#events-example-local" aria-controls="profile" data-toggle="tab">Local Events</a></li>
+            <li><a href="#events-example-remote" aria-controls="profile" data-toggle="tab">Remote Events</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 ordered 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), 0);
-                        </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 class="tab-pane" id="events-example-local">
-                        <pre class="brush:java">
-                            Ignite ignite = Ignition.ignite();
-
-                            // Local listener that listenes to local events.
-                            IgnitePredicate&lt;CacheEvent&gt; locLsnr = evt -> {
-                                System.out.println("Received local event [evt=" + evt.name() + "]");
-
-                                return true; // Continue listening.
-                            };
-
-                            // Subscribe to specified cache events occuring on local node.
-                            ignite.events().localListen(locLsnr,
-                                EventType.EVT_CACHE_OBJECT_PUT,
-                                EventType.EVT_CACHE_OBJECT_REMOVED);
-
-                            // Get an instance of named cache.
-                            final IgniteCache&lt;Integer, String&gt; cache = ignite.cache("cacheName");
-
-                            // Generate cache events.
-                            for (int i = 0; i < 20; i++)
-                                cache.put(i, Integer.toString(i));
-                        </pre>
-                    </div>
-                    <div class="tab-pane" id="events-example-remote">
-                        <pre class="brush:java">
-                            Ignite ignite = Ignition.ignite();
-
-                            // Get an instance of named cache.
-                            final IgniteCache&lt;Integer, String&gt; cache = ignite.jcache("cacheName");
-
-                            // Sample remote filter which only accepts events for keys
-                            // that are greater than or equal to 10.
-                            IgnitePredicate&lt;CacheEvent&gt; rmtLsnr = evt -> {
-                                System.out.println("Received remote event [evt=" + evt.&lt;Integer&gt;key() >= 10 + "]");
-
-                                return true; // Continue listening.
-                            };
-
-                            // 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_REMOVED);
-
-                            // Generate cache events.
-                            for (int i = 0; i < 20; i++)
-                                cache.put(i, Integer.toString(i));
-                        </pre>
-                    </div>
-                </div>
+        <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 ordered 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), 0);
+                </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 class="tab-pane" id="events-example-local">
+                <pre class="brush:java">
+                    Ignite ignite = Ignition.ignite();
+
+                    // Local listener that listenes to local events.
+                    IgnitePredicate&lt;CacheEvent&gt; locLsnr = evt -> {
+                        System.out.println("Received local event [evt=" + evt.name() + "]");
+
+                        return true; // Continue listening.
+                    };
+
+                    // Subscribe to specified cache events occuring on local node.
+                    ignite.events().localListen(locLsnr,
+                        EventType.EVT_CACHE_OBJECT_PUT,
+                        EventType.EVT_CACHE_OBJECT_REMOVED);
+
+                    // Get an instance of named cache.
+                    final IgniteCache&lt;Integer, String&gt; cache = ignite.cache("cacheName");
+
+                    // Generate cache events.
+                    for (int i = 0; i < 20; i++)
+                        cache.put(i, Integer.toString(i));
+                </pre>
             </div>
-            <div class="page-heading">GitHub Examples:</div>
-            <p>
-                Also see <a href="https://github.com/apache/ignite/tree/master/examples/src/main/java/org/apache/ignite/examples/messaging" target="github">messaging examples</a>
-                available on GitHub.
-            </p>
-        </section>
-        <section id="key-features" class="page-section">
-            <h2>Messaging & Events Features</h2>
-            <table class="formatted" name="Messaging Features">
+            <div class="tab-pane" id="events-example-remote">
+                <pre class="brush:java">
+                    Ignite ignite = Ignition.ignite();
+
+                    // Get an instance of named cache.
+                    final IgniteCache&lt;Integer, String&gt; cache = ignite.jcache("cacheName");
+
+                    // Sample remote filter which only accepts events for keys
+                    // that are greater than or equal to 10.
+                    IgnitePredicate&lt;CacheEvent&gt; rmtLsnr = evt -> {
+                        System.out.println("Received remote event [evt=" + evt.&lt;Integer&gt;key() >= 10 + "]");
+
+                        return true; // Continue listening.
+                    };
+
+                    // 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_REMOVED);
+
+                    // Generate cache events.
+                    for (int i = 0; i < 20; i++)
+                        cache.put(i, Integer.toString(i));
+                </pre>
+            </div>
+        </div>
+            
+        
+        <h2>GitHub Examples:</h2>
+        <p>
+            Also see <a href="https://github.com/apache/ignite/tree/master/examples/src/main/java/org/apache/ignite/examples/messaging" target="github">messaging examples</a>available on GitHub.
+        </p>
+            
+        
+			<h2>Messaging & Events Features</h2>
+            <table class="table table-bordered table-striped" name="Messaging Features">
                 <thead>
                     <tr>
                         <th width="35%" class="left">Feature</th>
@@ -249,11 +247,11 @@ under the License.
                 </tr>
                 </tbody>
             </table>
-        </section>
-    </main>
+        </div>
+        </article>			
 
     <!--#include virtual="/includes/footer.html" -->
-</div>
+
 <!--#include virtual="/includes/scripts.html" -->
 </body>
 </html>

Modified: ignite/site/trunk/features/multilanguage.html
URL: http://svn.apache.org/viewvc/ignite/site/trunk/features/multilanguage.html?rev=1875787&r1=1875786&r2=1875787&view=diff
==============================================================================
Binary files - no diff available.

Modified: ignite/site/trunk/features/rdbmsintegration.html
URL: http://svn.apache.org/viewvc/ignite/site/trunk/features/rdbmsintegration.html?rev=1875787&r1=1875786&r2=1875787&view=diff
==============================================================================
--- ignite/site/trunk/features/rdbmsintegration.html (original)
+++ ignite/site/trunk/features/rdbmsintegration.html Fri Mar 27 17:08:35 2020
@@ -45,169 +45,160 @@ under the License.
     <!--#include virtual="/includes/sh.html" -->
 </head>
 <body>
-<div id="wrapper">
-    <!--#include virtual="/includes/header.html" -->
-
-    <main id="main" role="main" class="container">
-        <section id="rdbms" class="page-section">
-            <h1 class="first">Automatically Integrate with RDBMSs</h1>
-            <div class="col-sm-12 col-md-12 col-xs-12" style="padding:0 0 2px 0;">
-                <div class="col-sm-6 col-md-8 col-xs-12" style="padding-left:0; padding-right:0">
-
-                    <p>
-                        Ignite provides support for integrating with a variety of persistence stores.
-                        It allows you to connect to the database, import schemas, configure indexed types, and automatically generate all the
-                        required XML OR-mapping configuration and Java domain model POJOs that you can easily download and copy into your project.
-                    </p>
-                    <p>Ignite can integrate with any relational database (RDBMS) that supports a JDBC driver - Oracle, PostgreSQL, Microsoft SQL Server, and MySQL.</p>
-                    <div class="page-heading">RDBMS Integration Wizard</div>
-                    <p>Ignite supports automatic RDBMS integration via <a href="https://console.gridgain.com" target="_blank" rel="noopener">Ignite Web Console</a>
-                        which is an interactive configuration wizard, management and monitoring tool that allows you to:</p>
-                        <ul class="page-list">
-                            <li>Create and download various configurations for your Ignite cluster.</li>
-                            <li>Automatically construct Ignite's SQL metadata from any RDBMS schemas.</li>
-                            <li>Execute SQL queries over your in-memory caches.</li>
-                            <li>View query execution plans, in-memory schemas and streaming charts.</li>
-                        </ul>
-                </div>
-                <div class="col-sm-6 col-md-4 col-xs-12" style="padding-right:0">
-                    <a href="/images/domain-model.png"><img class="img-responsive" src="/images/domain-model.png" width="350" style="float:right;"/></a> &nbsp;
-                    <p class="img-caption">Click on the image to view full size.</p>
-                </div>
-            </div>
-            <p>Ignite Web Console is an innovative tool that offers plenty of rich functionalities to manage the Ignite cluster and is not limited to features mentioned above.</p>
-            <div class="code-examples">
-                <div class="page-heading">Example</div>
-                <p>Here is an example of automatically generated Person class, as well as Java and XML configurations, imported from a MySQL PERSON table via Ignite Web Console.</p>
-                <!-- Nav tabs -->
-                <ul id="web-console-example" class="nav nav-tabs">
-                    <li class="active"><a href="#example-person" aria-controls="home" data-toggle="tab">Person</a></li>
-                    <li><a href="#example-xml" aria-controls="profile" data-toggle="tab">XML</a></li>
-                    <li><a href="#example-java" aria-controls="profile" data-toggle="tab">Java</a></li>
-                </ul>
+<!--#include virtual="/includes/header.html" -->
+<article>
+    <header>
+        <div class="container">
+            <h1>Automatically Integrate <strong>with RDBMSs</strong></h1>
+        </div>
+    </header>
+    <div class="container">
+        
+        <p>
+            Apache Ignite® provides support for integrating with a variety of persistence stores.
+            It allows you to connect to the database, import schemas, configure indexed types, and automatically generate all the
+            required XML OR-mapping configuration and Java domain model POJOs that you can easily download and copy into your project.
+        </p>
+        <a href="/images/domain-model.png"><img class="img-responsive diagram-right" src="/images/domain-model.png" alt="Automatically Integrate with RDBMSs" /></a>
+        <p>Ignite can integrate with any relational database (RDBMS) that supports a JDBC driver - Oracle, PostgreSQL, Microsoft SQL Server, and MySQL.</p>
+                    
+        <h2>RDBMS Integration Wizard</h2>
+        <p>Ignite supports automatic RDBMS integration via <a href="https://console.gridgain.com" target="_blank" rel="noopener">Ignite Web Console</a>
+            which is an interactive configuration wizard, management and monitoring tool that allows you to:</p>
+            <ul class="page-list">
+                <li>Create and download various configurations for your Ignite cluster.</li>
+                <li>Automatically construct Ignite's SQL metadata from any RDBMS schemas.</li>
+                <li>Execute SQL queries over your in-memory caches.</li>
+                <li>View query execution plans, in-memory schemas and streaming charts.</li>
+            </ul>
+                
+        <p>Ignite Web Console is an innovative tool that offers plenty of rich functionalities to manage the Ignite cluster and is not limited to features mentioned above.</p>
+                    
+        <h3>Example</h3>
+        <p>Here is an example of automatically generated Person class, as well as Java and XML configurations, imported from a MySQL PERSON table via Ignite Web Console.</p>
+        <!-- Nav tabs -->
+        <ul id="web-console-example" class="nav nav-tabs">
+            <li ><a class="active" href="#example-person" aria-controls="home" data-toggle="tab">Person</a></li>
+            <li><a href="#example-xml" aria-controls="profile" data-toggle="tab">XML</a></li>
+            <li><a href="#example-java" aria-controls="profile" data-toggle="tab">Java</a></li>
+        </ul>
 
                 <!-- Tab panes -->
-                <div class="tab-content">
-                    <div class="tab-pane" id="example-xml">
-                        <pre class="brush:xml">
-                            &lt;bean class="org.apache.ignite.configuration.IgniteConfiguration"&gt;
-                                ...
-                                &lt;property name="cacheStoreFactory"&gt;
-                                    &lt;bean class="org.apache.ignite.cache.store.jdbc.CacheJdbcPojoStoreFactory"&gt;
-                                        &lt;property name="dataSourceBean" value="dsMySQL"/&gt;
-                                        &lt;property name="dialect"&gt;
-                                            &lt;bean class="org.apache.ignite.cache.store.jdbc.dialect.MySQLDialect"/&gt;
-                                        &lt;/property&gt;
-                                        &lt;property name="types"&gt;
-                                            &lt;list&gt;
-                                                &lt;bean class="org.apache.ignite.cache.store.jdbc.JdbcType"&gt;
-                                                    &lt;property name="cacheName" value="PersonCache"/&gt;
-                                                    &lt;property name="keyType" value="java.lang.Integer"/&gt;
-                                                    &lt;property name="valueType" value="com.apache.ignite.myexample.model.Person"/&gt;
-                                                    &lt;property name="databaseSchema" value="test"/&gt;
-                                                    &lt;property name="databaseTable" value="person"/&gt;
-
-                                                    &lt;property name="keyFields"&gt;
-                                                        &lt;list&gt;
-                                                            ...
-                                                        &lt;/list&gt;
-                                                    &lt;/property&gt;
-
-                                                    &lt;property name="valueFields"&gt;
-                                                        &lt;list&gt;
-                                                            ...
-                                                        &lt;/list&gt;
-                                                    &lt;/property&gt;
-                                                &lt;/bean&gt;
-                                            &lt;/list&gt;
-                                        &lt;/property&gt;
-                                    &lt;/bean&gt;
+        <div class="tab-content">
+            <div class="tab-pane" id="example-xml">
+                <pre class="brush:xml">
+                    &lt;bean class="org.apache.ignite.configuration.IgniteConfiguration"&gt;
+                        ...
+                        &lt;property name="cacheStoreFactory"&gt;
+                            &lt;bean class="org.apache.ignite.cache.store.jdbc.CacheJdbcPojoStoreFactory"&gt;
+                                &lt;property name="dataSourceBean" value="dsMySQL"/&gt;
+                                &lt;property name="dialect"&gt;
+                                    &lt;bean class="org.apache.ignite.cache.store.jdbc.dialect.MySQLDialect"/&gt;
+                                &lt;/property&gt;
+                                &lt;property name="types"&gt;
+                                    &lt;list&gt;
+                                        &lt;bean class="org.apache.ignite.cache.store.jdbc.JdbcType"&gt;
+                                            &lt;property name="cacheName" value="PersonCache"/&gt;
+                                            &lt;property name="keyType" value="java.lang.Integer"/&gt;
+                                            &lt;property name="valueType" value="com.apache.ignite.myexample.model.Person"/&gt;
+                                            &lt;property name="databaseSchema" value="test"/&gt;
+                                            &lt;property name="databaseTable" value="person"/&gt;
+
+                                            &lt;property name="keyFields"&gt;
+                                                &lt;list&gt;
+                                                    ...
+                                                &lt;/list&gt;
+                                            &lt;/property&gt;
+
+                                            &lt;property name="valueFields"&gt;
+                                                &lt;list&gt;
+                                                    ...
+                                                &lt;/list&gt;
+                                            &lt;/property&gt;
+                                        &lt;/bean&gt;
+                                    &lt;/list&gt;
                                 &lt;/property&gt;
-                                ...
                             &lt;/bean&gt;
-                        </pre>
-                    </div>
-                    <div class="tab-pane" id="example-java">
-                        <pre class="brush:java">
-                        /**
-                         * This configuration was generated by GridGain Web Console (10/26/2016 11:12)
-                         */
-                        public class ClientConfigurationFactory {
-                            private static final Properties props = new Properties();
-
-                            static {
-                                try (InputStream in = IgniteConfiguration.class.getClassLoader().getResourceAsStream("secret.properties")) {
-                                    props.load(in);
-                                }
-                                catch (Exception ignored) {
-                                    // No-op.
-                                }
-                            }
-
-                            /** Helper class for datasource creation. */
-                            public static class DataSources {
-                                public static final MysqlDataSource INSTANCE_dsMySQL = createdsMySQL();
-
-                                private static MysqlDataSource createdsMySQL() {
-                                    MysqlDataSource dataSource = new MysqlDataSource();
-
-                                    dataSource.setURL(props.getProperty("dsMySQL.jdbc.url"));
-                                    dataSource.setUser(props.getProperty("dsMySQL.jdbc.username"));
-                                    dataSource.setPassword(props.getProperty("dsMySQL.jdbc.password"));
-
-                                    return dataSource;
-                                }
-                            }
-                            ...
-                        }
-                        </pre>
-                    </div>
-                    <div class="tab-pane  active" id="example-person">
-                        <pre class="brush:java">
-                            /**
-                             * Person definition.
-                             *
-                             * This POJO was generated by GridGain Web Console (10/26/2016 11:12)
-                             */
-                            public class Person implements Serializable {
-                                /** */
-                                private static final long serialVersionUID = 0L;
-
-                                /** Value for id. */
-                                private int id;
-
-                                /** Value for orgid. */
-                                private Integer orgid;
-
-                                /** Value for name. */
-                                private String name;
-
-                                /** Value for salary. */
-                                private Integer salary;
-
-                                ...
-                            }
-                        </pre>
-                    </div>
-                </div>
+                        &lt;/property&gt;
+                        ...
+                    &lt;/bean&gt;
+                </pre>
             </div>
+            <div class="tab-pane" id="example-java">
+                <pre class="brush:java">
+                /**
+                    * This configuration was generated by GridGain Web Console (10/26/2016 11:12)
+                    */
+                public class ClientConfigurationFactory {
+                    private static final Properties props = new Properties();
+
+                    static {
+                        try (InputStream in = IgniteConfiguration.class.getClassLoader().getResourceAsStream("secret.properties")) {
+                            props.load(in);
+                        }
+                        catch (Exception ignored) {
+                            // No-op.
+                        }
+                    }
 
-            <p>
-                <div class="page-heading">Hosted Management</div>
-                Visit our <a href="/addons.html" target="_blank" rel="noopener">Manage</a> page to learn more about the projects that intend to make user experience with Ignite easier.
-            </p>
+                    /** Helper class for datasource creation. */
+                    public static class DataSources {
+                        public static final MysqlDataSource INSTANCE_dsMySQL = createdsMySQL();
 
+                        private static MysqlDataSource createdsMySQL() {
+                            MysqlDataSource dataSource = new MysqlDataSource();
+
+                            dataSource.setURL(props.getProperty("dsMySQL.jdbc.url"));
+                            dataSource.setUser(props.getProperty("dsMySQL.jdbc.username"));
+                            dataSource.setPassword(props.getProperty("dsMySQL.jdbc.password"));
+
+                            return dataSource;
+                        }
+                    }
+                    ...
+                }
+                </pre>
+            </div>
+            <div class="tab-pane  active" id="example-person">
+                <pre class="brush:java">
+                    /**
+                        * Person definition.
+                        *
+                        * This POJO was generated by GridGain Web Console (10/26/2016 11:12)
+                        */
+                    public class Person implements Serializable {
+                        /** */
+                        private static final long serialVersionUID = 0L;
+
+                        /** Value for id. */
+                        private int id;
+
+                        /** Value for orgid. */
+                        private Integer orgid;
+
+                        /** Value for name. */
+                        private String name;
+
+                        /** Value for salary. */
+                        private Integer salary;
+
+                        ...
+                    }
+                </pre>
+            </div>
+        </div>
+            
+        
+        <h2>Hosted Management</h2>
+        <p>Visit our <a href="/addons.html" target="_blank" rel="noopener">Manage</a> page to learn more about the projects that intend to make user experience with Ignite easier.</p>
             <p>
                 <a href="https://apacheignite-tools.readme.io/docs" target="_blank" rel="noopener">
                     <b>Get started with Ignite Web Console <i class="fa fa-angle-double-right"></i></b>
                 </a>
             </p>
-
-        </section>
-    </main>
-
-    <!--#include virtual="/includes/footer.html" -->
-</div>
+    </div>
+</article>
+<!--#include virtual="/includes/footer.html" -->
 <!--#include virtual="/includes/scripts.html" -->
 </body>
 </html>

Modified: ignite/site/trunk/features/servicegrid.html
URL: http://svn.apache.org/viewvc/ignite/site/trunk/features/servicegrid.html?rev=1875787&r1=1875786&r2=1875787&view=diff
==============================================================================
--- ignite/site/trunk/features/servicegrid.html (original)
+++ ignite/site/trunk/features/servicegrid.html Fri Mar 27 17:08:35 2020
@@ -45,155 +45,152 @@ under the License.
     <!--#include virtual="/includes/sh.html" -->
 </head>
 <body>
-<div id="wrapper">
-    <!--#include virtual="/includes/header.html" -->
-
-    <main id="main" role="main" class="container">
-        <section id="servicegrid" class="page-section">
-            <h1 class="first">Deploy User-Defined Services</h1>
-            <div class="col-sm-12 col-md-12 col-xs-12" style="padding:0 0 20px 0;">
-                <div class="col-sm-6 col-md-6 col-xs-12" style="padding-left:0; padding-right:0">
+<!--#include virtual="/includes/header.html" -->
+<article>
+    <header>
+        <div class="container">
+            <h1>Deploy User-Defined <strong>Services</strong></h1>
+        </div>
+    </header>
+    <div class="container">
+            
+    
+    <p>
+        Apache Ignite® Service Grid allows for deployments of arbitrary user-defined services on the cluster.
+        You can implement and deploy any service, such as custom counters, ID generators,
+        hierarchical maps, etc.
+    </p>
+    <img class="diagram-right img-responsive" src="/images/ignite_service_grid_v1.png" style="max-width: 35%;" alt="Deploy User-Defined Services" />
+    <p>
+        The main use case of the service grid is ability to deploy various types of
+        <b>singleton services in the cluster</b>. However, in case if you need multiple instances
+        of a service, Ignite will also ensure proper deployment and fault tolerance of all
+        service instances.
+    </p>
+        
+                    
+    <h2>Code Examples:</h2>
+    <!-- Nav tabs -->
+    <ul id="service-examples" class="nav nav-tabs">
+        <li><a href="#service-define" aria-controls="home" data-toggle="tab" class="active">Service Definition</a></li>
+        <li><a href="#service-deploy" aria-controls="home" data-toggle="tab">Service Deployment</a></li>
+    </ul>
+
+    <!-- Tab panes -->
+    <div class="tab-content">
+        <div class="tab-pane active" id="service-define">
+            <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>
+        </div>
+        <div class="tab-pane" id="service-deploy">
+            <pre class="brush:java">
+                Ignite ignite = Ignition.ignite();
+
+                IgniteServices svcs = ignite.services();
+
+                // Deploy cluster-singleton service.
+                svcs.deployClusterSingleton("myClusterSingleton", new MyIgniteService());
+            </pre>
+        </div>
+    </div>
+           
+    
+    <h2>GitHub Examples:</h2>
+    <p>
+        Also see <a href="https://github.com/apache/ignite/tree/master/examples/src/main/java/org/apache/ignite/examples/servicegrid" target="github">service grid examples</a> available on GitHub.
+    </p>
+        
+    <h2>Service Grid Features</h2>
+    <table class="table table-bordered table-striped" name="Service Grid Features">
+        <thead>
+            <tr>
+                <th width="35%" class="left">Feature</th>
+                <th>Description</th>
+            </tr>
+        </thead>
+        <tbody>
+            <tr>
+                <td class="left">User-Defined Services</td>
+                <td>
                     <p>
-                        Ignite Service Grid allows for deployments of arbitrary user-defined services on the cluster.
-                        You can implement and deploy any service, such as custom counters, ID generators,
-                        hierarchical maps, etc.
+                        Users can define their own services and Ignite will automatically distribute
+                        these services over the cluster. For example, you can create your own specialized
+                        distributed counters, or a custom data loading service, or any other logic, and
+                        deploy it onto the cluster.
                     </p>
+                    <div class="page-links">
+                        <a href="http://apacheignite.readme.io/docs/service-grid" target="docs">Docs for this Feature <i class="fa fa-angle-double-right"></i></a>
+                    </div>
+                </td>
+            </tr>
+            <tr>
+                <td class="left">Cluster Singletons</td>
+                <td>
                     <p>
-                        The main use case of the service grid is ability to deploy various types of
-                        <b>singleton services in the cluster</b>. However, in case if you need multiple instances
-                        of a service, Ignite will also ensure proper deployment and fault tolerance of all
-                        service instances.
+                        Ignite allows to deploy any number of services on any of the grid nodes. However,
+                        the most commonly used feature is to deploy singleton services on the cluster.
+                        Ignite will manage the singleton contract regardless of topology changes and
+                        node crashes.
                     </p>
-                </div>
-
-                <div class="col-sm-6 col-md-6 col-xs-12" style="padding-right:0">
-                    <img class="img-responsive" src="/images/ignite_service_grid_v1.png" width="380px" style="float:right;"/>
-                </div>
-            </div>
-            <div class="code-examples">
-                <div class="page-heading">Code Examples:</div>
-                <!-- Nav tabs -->
-                <ul id="service-examples" class="nav nav-tabs">
-                    <li class="active"><a href="#service-define" aria-controls="home" data-toggle="tab">Service Definition</a></li>
-                    <li><a href="#service-deploy" aria-controls="home" data-toggle="tab">Service Deployment</a></li>
-                </ul>
-
-                <!-- Tab panes -->
-                <div class="tab-content">
-                    <div class="tab-pane active" id="service-define">
-                        <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>
+                    <div class="page-links">
+                        <a href="http://apacheignite.readme.io/docs/cluster-singletons" target="docs">Docs for this Feature <i class="fa fa-angle-double-right"></i></a>
                     </div>
-                    <div class="tab-pane" id="service-deploy">
-                        <pre class="brush:java">
-                            Ignite ignite = Ignition.ignite();
-
-                            IgniteServices svcs = ignite.services();
-
-                            // Deploy cluster-singleton service.
-                            svcs.deployClusterSingleton("myClusterSingleton", new MyIgniteService());
-                        </pre>
+                </td>
+            </tr>
+            <tr>
+                <td class="left">Fault Tolerance</td>
+                <td>
+                    <p>
+                        Ignite always guarantees that services are continuously available, and are deployed
+                        according to the specified configuration, regardless of any topology changes or
+                        node crashes.
+                    </p>
+                    <div class="page-links">
+                        <a href="http://apacheignite.readme.io/docs/service-grid#load-balancing" target="docs">Docs for this Feature <i class="fa fa-angle-double-right"></i></a>
                     </div>
-                </div>
-            </div>
-            <div class="page-heading">GitHub Examples:</div>
-            <p>
-                Also see <a href="https://github.com/apache/ignite/tree/master/examples/src/main/java/org/apache/ignite/examples/servicegrid" target="github">service grid examples</a>
-                available on GitHub.
-            </p>
-        </section>
-        <section id="key-features" class="page-section">
-            <h2>Service Grid Features</h2>
-            <table class="formatted" name="Service Grid Features">
-                <thead>
-                    <tr>
-                        <th width="35%" class="left">Feature</th>
-                        <th>Description</th>
-                    </tr>
-                </thead>
-                <tbody>
-                    <tr>
-                        <td class="left">User-Defined Services</td>
-                        <td>
-                            <p>
-                                Users can define their own services and Ignite will automatically distribute
-                                these services over the cluster. For example, you can create your own specialized
-                                distributed counters, or a custom data loading service, or any other logic, and
-                                deploy it onto the cluster.
-                            </p>
-                            <div class="page-links">
-                                <a href="http://apacheignite.readme.io/docs/service-grid" target="docs">Docs for this Feature <i class="fa fa-angle-double-right"></i></a>
-                            </div>
-                        </td>
-                    </tr>
-                    <tr>
-                        <td class="left">Cluster Singletons</td>
-                        <td>
-                            <p>
-                                Ignite allows to deploy any number of services on any of the grid nodes. However,
-                                the most commonly used feature is to deploy singleton services on the cluster.
-                                Ignite will manage the singleton contract regardless of topology changes and
-                                node crashes.
-                            </p>
-                            <div class="page-links">
-                                <a href="http://apacheignite.readme.io/docs/cluster-singletons" target="docs">Docs for this Feature <i class="fa fa-angle-double-right"></i></a>
-                            </div>
-                        </td>
-                    </tr>
-                    <tr>
-                        <td class="left">Fault Tolerance</td>
-                        <td>
-                            <p>
-                                Ignite always guarantees that services are continuously available, and are deployed
-                                according to the specified configuration, regardless of any topology changes or
-                                node crashes.
-                            </p>
-                            <div class="page-links">
-                                <a href="http://apacheignite.readme.io/docs/service-grid#load-balancing" target="docs">Docs for this Feature <i class="fa fa-angle-double-right"></i></a>
-                            </div>
-                        </td>
-                    </tr>
-                    <tr>
-                        <td class="left">Load Balancing</td>
-                        <td>
-                            <p>
-                                In all cases, other than singleton service deployment, Ignite will automatically make
-                                sure that about an equal number of services are deployed on each node within the
-                                cluster. Whenever cluster topology changes, Ignite will re-evaluate service
-                                deployments and may re-deploy an already deployed service on another node for better
-                                load balancing.
-                            </p>
-                            <div class="page-links">
-                                <a href="http://apacheignite.readme.io/docs/service-grid#load-balancing" target="docs">Docs for this Feature <i class="fa fa-angle-double-right"></i></a>
-                            </div>
-                        </td>
-                    </tr>
-                </tbody>
-            </table>
-        </section>
-    </main>
-
-    <!--#include virtual="/includes/footer.html" -->
+                </td>
+            </tr>
+            <tr>
+                <td class="left">Load Balancing</td>
+                <td>
+                    <p>
+                        In all cases, other than singleton service deployment, Ignite will automatically make
+                        sure that about an equal number of services are deployed on each node within the
+                        cluster. Whenever cluster topology changes, Ignite will re-evaluate service
+                        deployments and may re-deploy an already deployed service on another node for better
+                        load balancing.
+                    </p>
+                    <div class="page-links">
+                        <a href="http://apacheignite.readme.io/docs/service-grid#load-balancing" target="docs">Docs for this Feature <i class="fa fa-angle-double-right"></i></a>
+                    </div>
+                </td>
+            </tr>
+        </tbody>
+    </table>			 	
+
+    </div>
+</article>
+<!--#include virtual="/includes/footer.html" -->
 </div>
 <!--#include virtual="/includes/scripts.html" -->
 </body>