blob: 19c1b035397a2c306e3a97326574ec1f9450a9cc [file] [log] [blame]
<!DOCTYPE html>
<html lang="en">
<head>
<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-61232409-1"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'UA-61232409-1');
</script>
<meta charset="UTF-8">
<meta name="ignite-version" content="2.9.0" />
<title>Distributed Computing | Ignite Documentation</title>
<link rel="canonical" href="/docs/latest/distributed-computing/distributed-computing" />
<link rel="stylesheet" href="/assets/css/styles.css?1600372552">
<link rel="stylesheet" href="/assets/css/asciidoc-pygments.css">
<link rel="shortcut icon" href="/favicon.ico">
<meta name='viewport' content='width=device-width, height=device-height, initial-scale=1.0, minimum-scale=1.0'>
<script type="text/javascript" src="/assets/js/anchor.min.js?1600372552"></script>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/docsearch.js@2/dist/cdn/docsearch.min.css" />
</head>
<body>
<header>
<div class="container">
<button type='button' class='menu' title='Docs menu'>
<img src="/assets/images/menu-icon.svg"/>
</button>
<div class='home'>
<a href="/" class='home' title='Apache Ignite home'>
<img src="/assets/images/apache_ignite_logo.svg" alt="Apache Ignite logo" width="103" >
</a>
</div>
<nav>
</nav>
<select id="version-selector">
<option value="2.9.0">2.9.0</option>
</select>
<a href="https://github.com/apache/ignite" title='GitHub' class='github' target="_blank">
<img src="/assets/images/github-gray.svg" alt="GitHub logo">
</a>
<form class='search'>
<button class="search-close" type='button'><img src='/assets/images/cancel.svg'></button>
<input type="search" placeholder="Search…" id="search-input">
</form>
<button type='button' class='search-toggle'><img src='/assets/images/search.svg'></button>
<button type='button' class='top-nav-toggle'></button>
</div>
</header>
<link rel="stylesheet" href="/assets/css/docs.css">
<section class='page-docs'>
<nav class='left-nav' data-swiftype-index='false'>
<li>
<a href="/docs/latest/preface" class='' >Preface</a>
</li>
<li>
<button type='button' data-guide-url="" class='group-toggle collapsed '>Quick Start Guides<img class="state-indicator" src="/assets/images/left-nav-arrow.svg"></button>
<nav class='nav-group collapsed'>
<li>
<a href="/docs/latest/quick-start/java"
class=''
>Java</a>
</li>
<li>
<a href="/docs/latest/quick-start/dotnet"
class=''
>.NET/C#</a>
</li>
<li>
<a href="/docs/latest/quick-start/cpp"
class=''
>C++</a>
</li>
<li>
<a href="/docs/latest/quick-start/python"
class=''
>Python</a>
</li>
<li>
<a href="/docs/latest/quick-start/nodejs"
class=''
>Node.JS</a>
</li>
<li>
<a href="/docs/latest/quick-start/sql"
class=''
>SQL</a>
</li>
<li>
<a href="/docs/latest/quick-start/php"
class=''
>PHP</a>
</li>
<li>
<a href="/docs/latest/quick-start/restapi"
class=''
>REST API</a>
</li>
</nav>
</li>
<li>
<button type='button' data-guide-url="/installation" class='group-toggle collapsed '>Installation<img class="state-indicator" src="/assets/images/left-nav-arrow.svg"></button>
<nav class='nav-group collapsed'>
<li>
<a href="/docs/latest/installation/installing-using-zip"
class=''
>Installing Using ZIP Archive</a>
</li>
<li>
<a href="/docs/latest/installation/installing-using-docker"
class=''
>Installing Using Docker</a>
</li>
<li>
<a href="/docs/latest/installation/deb-rpm"
class=''
>Installing DEB or RPM package</a>
</li>
<li>
<button
type='button'
class='collapsed '>Kubernetes<img class="state-indicator" src="/assets/images/left-nav-arrow.svg"></button>
<nav class="sub_pages collapsed">
<li><a href="/docs/latest//installation/kubernetes/amazon-eks-deployment" class=''>Amazon EKS</a></li>
<li><a href="/docs/latest//installation/kubernetes/azure-deployment" class=''>Azure Kubernetes Service</a></li>
<li><a href="/docs/latest//installation/kubernetes/gke-deployment" class=''>Google Kubernetes Engine</a></li>
</nav>
</li>
</nav>
</li>
<li>
<button type='button' data-guide-url="" class='group-toggle collapsed '>Setting Up<img class="state-indicator" src="/assets/images/left-nav-arrow.svg"></button>
<nav class='nav-group collapsed'>
<li>
<a href="/docs/latest/setup"
class=''
>Setting Up Ignite for Java</a>
</li>
<li>
<a href="/docs/latest/setup-dotnet"
class=''
>Setting Up Ignite for .NET/C#</a>
</li>
</nav>
</li>
<li>
<a href="/docs/latest/understanding-configuration" class='' >Understanding Configuration</a>
</li>
<li>
<a href="/docs/latest/logging" class='' >Configuring Logging</a>
</li>
<li>
<a href="/docs/latest/starting-nodes" class='' >Starting and Stopping Nodes</a>
</li>
<li>
<button type='button' data-guide-url="" class='group-toggle collapsed '>Clustering<img class="state-indicator" src="/assets/images/left-nav-arrow.svg"></button>
<nav class='nav-group collapsed'>
<li>
<a href="/docs/latest/clustering/clustering"
class=''
>Overview</a>
</li>
<li>
<a href="/docs/latest/clustering/tcp-ip-discovery"
class=''
>TCP/IP Discovery</a>
</li>
<li>
<a href="/docs/latest/clustering/zookeeper-discovery"
class=''
>ZooKeeper Discovery</a>
</li>
<li>
<a href="/docs/latest/clustering/discovery-in-the-cloud"
class=''
>Discovery in the Cloud</a>
</li>
<li>
<a href="/docs/latest/clustering/network-configuration"
class=''
>Network Configuration</a>
</li>
<li>
<a href="/docs/latest/clustering/connect-client-nodes"
class=''
>Connecting Client Nodes</a>
</li>
<li>
<a href="/docs/latest/clustering/running-client-nodes-behind-nat"
class=''
>Running Client Nodes Behind NAT</a>
</li>
</nav>
</li>
<li>
<button type='button' data-guide-url="" class='group-toggle collapsed '>Data Modeling<img class="state-indicator" src="/assets/images/left-nav-arrow.svg"></button>
<nav class='nav-group collapsed'>
<li>
<a href="/docs/latest/data-modeling/data-modeling"
class=''
>Introduction</a>
</li>
<li>
<a href="/docs/latest/data-modeling/data-partitioning"
class=''
>Data Partitioning</a>
</li>
<li>
<a href="/docs/latest/data-modeling/affinity-collocation"
class=''
>Affinity Colocation</a>
</li>
</nav>
</li>
<li>
<button type='button' data-guide-url="" class='group-toggle collapsed '>Configuring Memory<img class="state-indicator" src="/assets/images/left-nav-arrow.svg"></button>
<nav class='nav-group collapsed'>
<li>
<a href="/docs/latest/memory-architecture"
class=''
>Memory Architecture</a>
</li>
<li>
<a href="/docs/latest/memory-configuration/data-regions"
class=''
>Configuring Data Regions</a>
</li>
<li>
<a href="/docs/latest/memory-configuration/eviction-policies"
class=''
>Eviction Policies</a>
</li>
</nav>
</li>
<li>
<button type='button' data-guide-url="" class='group-toggle collapsed '>Configuring Caches<img class="state-indicator" src="/assets/images/left-nav-arrow.svg"></button>
<nav class='nav-group collapsed'>
<li>
<a href="/docs/latest/configuring-caches/configuration-overview"
class=''
>Cache Configuration</a>
</li>
<li>
<a href="/docs/latest/configuring-caches/configuring-backups"
class=''
>Configuring Partition Backups</a>
</li>
<li>
<a href="/docs/latest/configuring-caches/atomicity-modes"
class=''
>Atomicity Modes</a>
</li>
<li>
<a href="/docs/latest/configuring-caches/expiry-policies"
class=''
>Expiry Policy</a>
</li>
<li>
<a href="/docs/latest/configuring-caches/on-heap-caching"
class=''
>On-Heap Caching</a>
</li>
<li>
<a href="/docs/latest/configuring-caches/cache-groups"
class=''
>Cache Groups</a>
</li>
</nav>
</li>
<li>
<button type='button' data-guide-url="" class='group-toggle collapsed '>Persistence<img class="state-indicator" src="/assets/images/left-nav-arrow.svg"></button>
<nav class='nav-group collapsed'>
<li>
<a href="/docs/latest/persistence/native-persistence"
class=''
>Ignite Persistence</a>
</li>
<li>
<a href="/docs/latest/persistence/external-storage"
class=''
>External Storage</a>
</li>
<li>
<a href="/docs/latest/persistence/swap"
class=''
>Swapping</a>
</li>
<li>
<a href="/docs/latest/persistence/custom-cache-store"
class=''
>Implementing Custom Cache Store</a>
</li>
<li>
<a href="/docs/latest/persistence/snapshots"
class=''
>Cluster Snapshots</a>
</li>
<li>
<a href="/docs/latest/persistence/disk-compression"
class=''
>Disk Compression</a>
</li>
<li>
<a href="/docs/latest/persistence/persistence-tuning"
class=''
>Tuning Persistence</a>
</li>
</nav>
</li>
<li>
<a href="/docs/latest/baseline-topology" class='' >Baseline Topology</a>
</li>
<li>
<a href="/docs/latest/cluster-states" class='' >Cluster States</a>
</li>
<li>
<a href="/docs/latest/data-rebalancing" class='' >Data Rebalancing</a>
</li>
<li>
<a href="/docs/latest/partition-loss-policy" class='' >Partition Loss Policy</a>
</li>
<li>
<a href="/docs/latest/deploying-user-code" class='' >Deploying User Code</a>
</li>
<li>
<a href="/docs/latest/peer-class-loading" class='' >Peer Class Loading</a>
</li>
<li>
<a href="/docs/latest/data-streaming" class='' >Data Streaming</a>
</li>
<li>
<button type='button' data-guide-url="" class='group-toggle collapsed '>Using Key-Value Cache API<img class="state-indicator" src="/assets/images/left-nav-arrow.svg"></button>
<nav class='nav-group collapsed'>
<li>
<a href="/docs/latest/key-value-api/basic-cache-operations"
class=''
>Basic Cache Operations</a>
</li>
<li>
<a href="/docs/latest/key-value-api/binary-objects"
class=''
>Working with Binary Objects</a>
</li>
<li>
<a href="/docs/latest/key-value-api/using-scan-queries"
class=''
>Using Scan Queries</a>
</li>
<li>
<a href="/docs/latest/read-repair"
class=''
>Read Repair</a>
</li>
</nav>
</li>
<li>
<a href="/docs/latest/key-value-api/continuous-queries" class='' >Using Continuous Queries</a>
</li>
<li>
<a href="/docs/latest/key-value-api/transactions" class='' >Performing Transactions</a>
</li>
<li>
<button type='button' data-guide-url="" class='group-toggle collapsed '>Working with SQL<img class="state-indicator" src="/assets/images/left-nav-arrow.svg"></button>
<nav class='nav-group collapsed'>
<li>
<a href="/docs/latest/SQL/sql-introduction"
class=''
>Introduction</a>
</li>
<li>
<a href="/docs/latest/SQL/schemas"
class=''
>Understanding Schemas</a>
</li>
<li>
<a href="/docs/latest/SQL/indexes"
class=''
>Defining Indexes</a>
</li>
<li>
<a href="/docs/latest/SQL/sql-api"
class=''
>Using SQL API</a>
</li>
<li>
<a href="/docs/latest/SQL/distributed-joins"
class=''
>Distributed Joins</a>
</li>
<li>
<a href="/docs/latest/SQL/sql-transactions"
class=''
>SQL Transactions</a>
</li>
<li>
<a href="/docs/latest/SQL/custom-sql-func"
class=''
>Custom SQL Functions</a>
</li>
<li>
<a href="/docs/latest/SQL/JDBC/jdbc-driver"
class=''
>JDBC Driver</a>
</li>
<li>
<a href="/docs/latest/SQL/JDBC/jdbc-client-driver"
class=''
>JDBC Client Driver</a>
</li>
<li>
<a href="/docs/latest/transactions/mvcc"
class=''
>Multiversion Concurrency Control</a>
</li>
</nav>
</li>
<li>
<button type='button' data-guide-url="" class='group-toggle collapsed '>Distributed Computing<img class="state-indicator" src="/assets/images/left-nav-arrow.svg"></button>
<nav class='nav-group collapsed'>
<li>
<a href="/docs/latest/distributed-computing/distributed-computing"
class=''
>Distributed Computing API</a>
</li>
<li>
<a href="/docs/latest/distributed-computing/cluster-groups"
class=''
>Cluster Groups</a>
</li>
<li>
<a href="/docs/latest/distributed-computing/executor-service"
class=''
>Executor Service</a>
</li>
<li>
<a href="/docs/latest/distributed-computing/map-reduce"
class=''
>MapReduce API</a>
</li>
<li>
<a href="/docs/latest/distributed-computing/load-balancing"
class=''
>Load Balancing</a>
</li>
<li>
<a href="/docs/latest/distributed-computing/fault-tolerance"
class=''
>Fault Tolerance</a>
</li>
<li>
<a href="/docs/latest/distributed-computing/job-scheduling"
class=''
>Job Scheduling</a>
</li>
</nav>
</li>
<li>
<a href="/docs/latest/collocated-computations" class='' >Colocating Computations with Data</a>
</li>
<li>
<button type='button' data-guide-url="" class='group-toggle collapsed '>Working with Events<img class="state-indicator" src="/assets/images/left-nav-arrow.svg"></button>
<nav class='nav-group collapsed'>
<li>
<a href="/docs/latest/events/listening-to-events"
class=''
>Enabling and Listenting to Events</a>
</li>
<li>
<a href="/docs/latest/events/events"
class=''
>Events</a>
</li>
</nav>
</li>
<li>
<a href="/docs/latest/near-cache" class='' >Near Caches</a>
</li>
<li>
<a href="/docs/latest/platform-cache" class='' >.NET Platform Cache</a>
</li>
<li>
<a href="/docs/latest/services/services" class='' >Services</a>
</li>
<li>
<button type='button' data-guide-url="" class='group-toggle collapsed '>Distributed Data Structures<img class="state-indicator" src="/assets/images/left-nav-arrow.svg"></button>
<nav class='nav-group collapsed'>
<li>
<a href="/docs/latest/data-structures/queue-and-set"
class=''
>Queue and Set</a>
</li>
<li>
<a href="/docs/latest/data-structures/atomic-types"
class=''
>Atomic Types</a>
</li>
<li>
<a href="/docs/latest/data-structures/countdownlatch"
class=''
>CountDownLatch</a>
</li>
<li>
<a href="/docs/latest/data-structures/atomic-sequence"
class=''
>Atomic Sequence</a>
</li>
<li>
<a href="/docs/latest/data-structures/semaphore"
class=''
>Semaphore</a>
</li>
</nav>
</li>
<li>
<button type='button' data-guide-url="" class='group-toggle collapsed '>Machine Learning<img class="state-indicator" src="/assets/images/left-nav-arrow.svg"></button>
<nav class='nav-group collapsed'>
<li>
<a href="/docs/latest/machine-learning/machine-learning"
class=''
>Machine Learning</a>
</li>
<li>
<a href="/docs/latest/machine-learning/partition-based-dataset"
class=''
>Partition Based Dataset</a>
</li>
<li>
<a href="/docs/latest/machine-learning/updating-trained-models"
class=''
>Updating Trained Models</a>
</li>
<li>
<button
type='button'
class='collapsed '>Binary Classification<img class="state-indicator" src="/assets/images/left-nav-arrow.svg"></button>
<nav class="sub_pages collapsed">
<li><a href="/docs/latest//machine-learning/binary-classification/introduction" class=''>Introduction</a></li>
<li><a href="/docs/latest//machine-learning/binary-classification/linear-svm" class=''>Linear SVM (Support Vector Machine)</a></li>
<li><a href="/docs/latest//machine-learning/binary-classification/decision-trees" class=''>Decision Trees</a></li>
<li><a href="/docs/latest//machine-learning/binary-classification/multilayer-perceptron" class=''>Multilayer Perceptron</a></li>
<li><a href="/docs/latest//machine-learning/binary-classification/logistic-regression" class=''>Logistic Regression</a></li>
<li><a href="/docs/latest//machine-learning/binary-classification/knn-classification" class=''>k-NN Classification</a></li>
<li><a href="/docs/latest//machine-learning/binary-classification/ann" class=''>ANN (Approximate Nearest Neighbor)</a></li>
<li><a href="/docs/latest//machine-learning/binary-classification/naive-bayes" class=''>Naive Bayes</a></li>
</nav>
</li>
<li>
<button
type='button'
class='collapsed '>Regression<img class="state-indicator" src="/assets/images/left-nav-arrow.svg"></button>
<nav class="sub_pages collapsed">
<li><a href="/docs/latest//machine-learning/regression/introduction" class=''>Introduction</a></li>
<li><a href="/docs/latest//machine-learning/regression/linear-regression" class=''>Linear Regression</a></li>
<li><a href="/docs/latest//machine-learning/regression/decision-trees-regression" class=''>Decision Trees Regression</a></li>
<li><a href="/docs/latest//machine-learning/regression/knn-regression" class=''>k-NN Regression</a></li>
</nav>
</li>
<li>
<button
type='button'
class='collapsed '>Clustering<img class="state-indicator" src="/assets/images/left-nav-arrow.svg"></button>
<nav class="sub_pages collapsed">
<li><a href="/docs/latest//machine-learning/clustering/introduction" class=''>Introduction</a></li>
<li><a href="/docs/latest//machine-learning/clustering/k-means-clustering" class=''>K-Means Clustering</a></li>
<li><a href="/docs/latest//machine-learning/clustering/gaussian-mixture" class=''>Gaussian mixture (GMM)</a></li>
</nav>
</li>
<li>
<a href="/docs/latest/machine-learning/preprocessing"
class=''
>Preprocessing</a>
</li>
<li>
<button
type='button'
class='collapsed '>Model Selection<img class="state-indicator" src="/assets/images/left-nav-arrow.svg"></button>
<nav class="sub_pages collapsed">
<li><a href="/docs/latest//machine-learning/model-selection/introduction" class=''>Introduction</a></li>
<li><a href="/docs/latest//machine-learning/model-selection/evaluator" class=''>Evaluator</a></li>
<li><a href="/docs/latest//machine-learning/model-selection/split-the-dataset-on-test-and-train-datasets" class=''>Split the dataset on test and train datasets</a></li>
<li><a href="/docs/latest//machine-learning/model-selection/hyper-parameter-tuning" class=''>Hyper-parameter tuning</a></li>
<li><a href="/docs/latest//machine-learning/model-selection/pipeline-api" class=''>Pipeline API</a></li>
</nav>
</li>
<li>
<a href="/docs/latest/machine-learning/multiclass-classification"
class=''
>Multiclass Classification</a>
</li>
<li>
<button
type='button'
class='collapsed '>Ensemble Methods<img class="state-indicator" src="/assets/images/left-nav-arrow.svg"></button>
<nav class="sub_pages collapsed">
<li><a href="/docs/latest//machine-learning/ensemble-methods/introduction" class=''></a></li>
<li><a href="/docs/latest//machine-learning/ensemble-methods/stacking" class=''>Stacking</a></li>
<li><a href="/docs/latest//machine-learning/ensemble-methods/baggin" class=''>Bagging</a></li>
<li><a href="/docs/latest//machine-learning/ensemble-methods/random-forest" class=''>Random Forest</a></li>
<li><a href="/docs/latest//machine-learning/ensemble-methods/gradient-boosting" class=''>Gradient Boosting</a></li>
</nav>
</li>
<li>
<a href="/docs/latest/machine-learning/recommendation-systems"
class=''
>Recommendation Systems</a>
</li>
<li>
<button
type='button'
class='collapsed '>Importing Model<img class="state-indicator" src="/assets/images/left-nav-arrow.svg"></button>
<nav class="sub_pages collapsed">
<li><a href="/docs/latest//machine-learning/importing-model/introduction" class=''>Introduction</a></li>
<li><a href="/docs/latest//machine-learning/importing-model/model-import-from-gxboost" class=''>Import Model from XGBoost</a></li>
<li><a href="/docs/latest//machine-learning/importing-model/model-import-from-apache-spark" class=''>Import Model from Apache Spark</a></li>
</nav>
</li>
</nav>
</li>
<li>
<button type='button' data-guide-url="" class='group-toggle collapsed '>Monitoring<img class="state-indicator" src="/assets/images/left-nav-arrow.svg"></button>
<nav class='nav-group collapsed'>
<li>
<a href="/docs/latest/monitoring-metrics/intro"
class=''
>Introduction</a>
</li>
<li>
<a href="/docs/latest/monitoring-metrics/cluster-id"
class=''
>Cluster ID and Tag</a>
</li>
<li>
<button
type='button'
class='collapsed '>Metrics<img class="state-indicator" src="/assets/images/left-nav-arrow.svg"></button>
<nav class="sub_pages collapsed">
<li><a href="/docs/latest//monitoring-metrics/configuring-metrics" class=''>Configuring Metrics</a></li>
<li><a href="/docs/latest//monitoring-metrics/metrics" class=''>JMX Metrics</a></li>
</nav>
</li>
<li>
<button
type='button'
class='collapsed '>New Metrics System<img class="state-indicator" src="/assets/images/left-nav-arrow.svg"></button>
<nav class="sub_pages collapsed">
<li><a href="/docs/latest//monitoring-metrics/new-metrics-system" class=''>Introduction</a></li>
<li><a href="/docs/latest//monitoring-metrics/new-metrics" class=''>Metrics</a></li>
</nav>
</li>
<li>
<a href="/docs/latest/monitoring-metrics/system-views"
class=''
>System Views</a>
</li>
<li>
<a href="/docs/latest/monitoring-metrics/tracing"
class=''
>Tracing</a>
</li>
</nav>
</li>
<li>
<button type='button' data-guide-url="/security" class='group-toggle collapsed '>Security<img class="state-indicator" src="/assets/images/left-nav-arrow.svg"></button>
<nav class='nav-group collapsed'>
<li>
<a href="/docs/latest/security/authentication"
class=''
>Authentication</a>
</li>
<li>
<a href="/docs/latest/security/ssl-tls"
class=''
>SSL/TLS</a>
</li>
<li>
<button
type='button'
class='collapsed '>Transparent Data Encryption<img class="state-indicator" src="/assets/images/left-nav-arrow.svg"></button>
<nav class="sub_pages collapsed">
<li><a href="/docs/latest//security/tde" class=''>Introduction</a></li>
<li><a href="/docs/latest//security/master-key-rotation" class=''>Master key rotation</a></li>
</nav>
</li>
</nav>
</li>
<li>
<button type='button' data-guide-url="" class='group-toggle collapsed '>Thin Clients<img class="state-indicator" src="/assets/images/left-nav-arrow.svg"></button>
<nav class='nav-group collapsed'>
<li>
<a href="/docs/latest/thin-clients/getting-started-with-thin-clients"
class=''
>Thin Clients Overview</a>
</li>
<li>
<a href="/docs/latest/thin-clients/java-thin-client"
class=''
>Java Thin Client</a>
</li>
<li>
<a href="/docs/latest/thin-clients/dotnet-thin-client"
class=''
>.NET Thin Client</a>
</li>
<li>
<a href="/docs/latest/thin-clients/cpp-thin-client"
class=''
>C++ Thin Client</a>
</li>
<li>
<a href="/docs/latest/thin-clients/python-thin-client"
class=''
>Python Thin Client</a>
</li>
<li>
<a href="/docs/latest/thin-clients/php-thin-client"
class=''
>PHP Thin Client</a>
</li>
<li>
<a href="/docs/latest/thin-clients/nodejs-thin-client"
class=''
>Node.js Thin Client</a>
</li>
<li>
<button
type='button'
class='collapsed '>Binary Client Protocol<img class="state-indicator" src="/assets/images/left-nav-arrow.svg"></button>
<nav class="sub_pages collapsed">
<li><a href="/docs/latest//binary-client-protocol/binary-client-protocol" class=''>Binary Client Protocol</a></li>
<li><a href="/docs/latest//binary-client-protocol/data-format" class=''>Data Format</a></li>
<li><a href="/docs/latest//binary-client-protocol/key-value-queries" class=''>Key-Value Queries</a></li>
<li><a href="/docs/latest//binary-client-protocol/sql-and-scan-queries" class=''>SQL and Scan Queries</a></li>
<li><a href="/docs/latest//binary-client-protocol/binary-type-metadata" class=''>Binary Types Metadata</a></li>
<li><a href="/docs/latest//binary-client-protocol/cache-configuration" class=''>Cache Configuration</a></li>
</nav>
</li>
</nav>
</li>
<li>
<button type='button' data-guide-url="" class='group-toggle collapsed '>ODBC Driver<img class="state-indicator" src="/assets/images/left-nav-arrow.svg"></button>
<nav class='nav-group collapsed'>
<li>
<a href="/docs/latest/SQL/ODBC/odbc-driver"
class=''
>ODBC Driver</a>
</li>
<li>
<a href="/docs/latest/SQL/ODBC/connection-string-dsn"
class=''
>Connection String and DSN</a>
</li>
<li>
<a href="/docs/latest/SQL/ODBC/querying-modifying-data"
class=''
>Querying and Modifying Data</a>
</li>
<li>
<a href="/docs/latest/SQL/ODBC/specification"
class=''
>Specification</a>
</li>
<li>
<a href="/docs/latest/SQL/ODBC/data-types"
class=''
>Data Types</a>
</li>
<li>
<a href="/docs/latest/SQL/ODBC/error-codes"
class=''
>Error Codes</a>
</li>
</nav>
</li>
<li>
<a href="/docs/latest/restapi" class='' >REST API</a>
</li>
<li>
<a href="/docs/latest/control-script" class='' >Control Script</a>
</li>
<li>
<a href="/docs/latest/plugins" class='' >Plugins</a>
</li>
<li>
<a href="/docs/latest/sqlline" class='' >SQLLine</a>
</li>
<li>
<button type='button' data-guide-url="" class='group-toggle collapsed '>Ignite for Spark<img class="state-indicator" src="/assets/images/left-nav-arrow.svg"></button>
<nav class='nav-group collapsed'>
<li>
<a href="/docs/latest/ignite-for-spark/overview"
class=''
>Overview</a>
</li>
<li>
<a href="/docs/latest/ignite-for-spark/ignitecontext-and-rdd"
class=''
>IgniteContext and IgniteRDD</a>
</li>
<li>
<a href="/docs/latest/ignite-for-spark/ignite-dataframe"
class=''
>Ignite DataFrame</a>
</li>
<li>
<a href="/docs/latest/ignite-for-spark/installation"
class=''
>Installation</a>
</li>
<li>
<a href="/docs/latest/ignite-for-spark/spark-shell"
class=''
>Test Ignite with Spark-shell</a>
</li>
<li>
<a href="/docs/latest/ignite-for-spark/troubleshooting"
class=''
>Troubleshooting</a>
</li>
</nav>
</li>
<li>
<button type='button' data-guide-url="/sql-reference/sql-reference-overview" class='group-toggle collapsed '>SQL Reference<img class="state-indicator" src="/assets/images/left-nav-arrow.svg"></button>
<nav class='nav-group collapsed'>
<li>
<a href="/docs/latest/sql-reference/sql-conformance"
class=''
>SQL Conformance</a>
</li>
<li>
<a href="/docs/latest/sql-reference/ddl"
class=''
>Data Definition Language (DDL)</a>
</li>
<li>
<a href="/docs/latest/sql-reference/dml"
class=''
>Data Manipulation Language (DML)</a>
</li>
<li>
<a href="/docs/latest/sql-reference/transactions"
class=''
>Transactions</a>
</li>
<li>
<a href="/docs/latest/sql-reference/operational-commands"
class=''
>Operational Commands</a>
</li>
<li>
<a href="/docs/latest/sql-reference/aggregate-functions"
class=''
>Aggregate functions</a>
</li>
<li>
<a href="/docs/latest/sql-reference/numeric-functions"
class=''
>Numeric Functions</a>
</li>
<li>
<a href="/docs/latest/sql-reference/string-functions"
class=''
>String Functions</a>
</li>
<li>
<a href="/docs/latest/sql-reference/date-time-functions"
class=''
>Data and Time Functions</a>
</li>
<li>
<a href="/docs/latest/sql-reference/system-functions"
class=''
>System Functions</a>
</li>
<li>
<a href="/docs/latest/sql-reference/data-types"
class=''
>Data Types</a>
</li>
</nav>
</li>
</nav>
<div class="left-nav__overlay"></div>
<article data-swiftype-index='true'>
<a class='edit-link' href="https://github.com/apache/ignite/tree/IGNITE-7595/docs/_docs/distributed-computing/distributed-computing.adoc" target="_blank">Edit</a>
<h1>Distributed Computing</h1>
<div id="preamble">
<div class="sectionbody">
<div class="paragraph">
<p>Ignite provides an API for distributing computations across cluster nodes in a balanced and fault-tolerant manner. You can submit individual tasks for execution as well as implement the MapReduce pattern with automatic task splitting. The API provides fine-grained control over the <a href="/docs/latest/distributed-computing/load-balancing">job distribution strategy</a>.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="getting-the-compute-interface">Getting the Compute Interface</h2>
<div class="sectionbody">
<div class="paragraph">
<p>The main entry point for running distributed computations is the compute interface, which can be obtained from an instance of <code>Ignite</code>.</p>
</div>
<code-tabs><code-tab data-tab='Java'><div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="java"><span class="nc">Ignite</span> <span class="n">ignite</span> <span class="o">=</span> <span class="nc">Ignition</span><span class="o">.</span><span class="na">start</span><span class="o">();</span>
<span class="nc">IgniteCompute</span> <span class="n">compute</span> <span class="o">=</span> <span class="n">ignite</span><span class="o">.</span><span class="na">compute</span><span class="o">();</span></code></pre>
</div>
</div></code-tab><code-tab data-tab='C#/.NET'><div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="csharp"><span class="kt">var</span> <span class="n">ignite</span> <span class="p">=</span> <span class="n">Ignition</span><span class="p">.</span><span class="nf">Start</span><span class="p">();</span>
<span class="kt">var</span> <span class="n">compute</span> <span class="p">=</span> <span class="n">ignite</span><span class="p">.</span><span class="nf">GetCompute</span><span class="p">();</span></code></pre>
</div>
</div></code-tab><code-tab data-tab='C++'><div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="cpp"><span class="n">Ignite</span> <span class="n">ignite</span> <span class="o">=</span> <span class="n">Ignition</span><span class="o">::</span><span class="n">Start</span><span class="p">(</span><span class="n">cfg</span><span class="p">);</span>
<span class="n">Compute</span> <span class="n">compute</span> <span class="o">=</span> <span class="n">ignite</span><span class="p">.</span><span class="n">GetCompute</span><span class="p">();</span></code></pre>
</div>
</div></code-tab></code-tabs>
<div class="paragraph">
<p>The compute interface provides methods for distributing different types of tasks over cluster nodes and running <a href="/docs/latest/collocated-computations">colocated computations</a>.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="specifying-the-set-of-nodes-for-computations">Specifying the Set of Nodes for Computations</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Each instance of the compute interface is associated with a <a href="/docs/latest/distributed-computing/cluster-groups">set of nodes</a> on which the tasks are executed.
When called without arguments, <code>ignite.compute()</code> returns the compute interface that is associated with all server nodes.
To obtain an instance for a specific subset of nodes, use <code>Ignite.compute(ClusterGroup group)</code>.
In the following example, the compute interface is bound to the remote nodes only, i.e. all nodes except for the one that runs this code.</p>
</div>
<code-tabs><code-tab data-tab='Java'><div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="java"><span class="nc">Ignite</span> <span class="n">ignite</span> <span class="o">=</span> <span class="nc">Ignition</span><span class="o">.</span><span class="na">start</span><span class="o">();</span>
<span class="nc">IgniteCompute</span> <span class="n">compute</span> <span class="o">=</span> <span class="n">ignite</span><span class="o">.</span><span class="na">compute</span><span class="o">(</span><span class="n">ignite</span><span class="o">.</span><span class="na">cluster</span><span class="o">().</span><span class="na">forRemotes</span><span class="o">());</span></code></pre>
</div>
</div></code-tab><code-tab data-tab='C#/.NET'><div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="csharp"><span class="kt">var</span> <span class="n">ignite</span> <span class="p">=</span> <span class="n">Ignition</span><span class="p">.</span><span class="nf">Start</span><span class="p">();</span>
<span class="kt">var</span> <span class="n">compute</span> <span class="p">=</span> <span class="n">ignite</span><span class="p">.</span><span class="nf">GetCluster</span><span class="p">().</span><span class="nf">ForRemotes</span><span class="p">().</span><span class="nf">GetCompute</span><span class="p">();</span></code></pre>
</div>
</div></code-tab><code-tab data-tab='C++' data-unavailable='true'><div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code>This API is not presently available for C++.</code></pre>
</div>
</div></code-tab></code-tabs>
</div>
</div>
<div class="sect1">
<h2 id="executing-tasks">Executing Tasks</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Ignite provides three interfaces that can be implemented to represent a task and executed via the compute interface:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><code>IgniteRunnable</code> — an extension of <code>java.lang.Runnable</code> that can be used to implement calculations that do not have input parameters and return no result.</p>
</li>
<li>
<p><code>IgniteCallable</code> — an extension of <code>java.util.concurrent.Callable</code> that returns a specific value.</p>
</li>
<li>
<p><code>IgniteClosure</code> — a functional interface that accepts a parameter and returns a value.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>You can execute a task once (on one of the nodes) or broadcast it to all nodes.</p>
</div>
<div class="admonitionblock important">
<table>
<tr>
<td class="icon">
<div class="title">Important</div>
</td>
<td class="content">
<div class="paragraph">
<p>In order to run tasks on the remote nodes, make sure the class definitions of the tasks are available on the nodes.
You can do this in two ways:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Add the classes to the classpath of the nodes;</p>
</li>
<li>
<p>Enable <a href="/docs/latest/peer-class-loading">peer class loading</a>.</p>
</li>
</ul>
</div>
</td>
</tr>
</table>
</div>
<div class="sect2">
<h3 id="executing-a-runnable-task">Executing a Runnable Task</h3>
<div class="paragraph">
<p>To execute a runnable task, use the <code>run(&#8230;&#8203;)</code> method of the compute interface. The task is sent to one of the nodes associated with the compute instance.</p>
</div>
<code-tabs><code-tab data-tab='Java'><div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="java"><span class="nc">IgniteCompute</span> <span class="n">compute</span> <span class="o">=</span> <span class="n">ignite</span><span class="o">.</span><span class="na">compute</span><span class="o">();</span>
<span class="c1">// Iterate through all words and print</span>
<span class="c1">// each word on a different cluster node.</span>
<span class="k">for</span> <span class="o">(</span><span class="nc">String</span> <span class="n">word</span> <span class="o">:</span> <span class="s">"Print words on different cluster nodes"</span><span class="o">.</span><span class="na">split</span><span class="o">(</span><span class="s">" "</span><span class="o">))</span> <span class="o">{</span>
<span class="n">compute</span><span class="o">.</span><span class="na">run</span><span class="o">(()</span> <span class="o">-&gt;</span> <span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">word</span><span class="o">));</span>
<span class="o">}</span></code></pre>
</div>
</div></code-tab><code-tab data-tab='C#/.NET'><div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="csharp"><span class="k">class</span> <span class="nc">PrintWordAction</span> <span class="p">:</span> <span class="n">IComputeAction</span>
<span class="p">{</span>
<span class="k">public</span> <span class="k">void</span> <span class="nf">Invoke</span><span class="p">()</span>
<span class="p">{</span>
<span class="k">foreach</span> <span class="p">(</span><span class="kt">var</span> <span class="n">s</span> <span class="k">in</span> <span class="s">"Print words on different cluster nodes"</span><span class="p">.</span><span class="nf">Split</span><span class="p">(</span><span class="s">" "</span><span class="p">))</span>
<span class="p">{</span>
<span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="n">s</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="k">public</span> <span class="k">static</span> <span class="k">void</span> <span class="nf">ComputeRunDemo</span><span class="p">()</span>
<span class="p">{</span>
<span class="kt">var</span> <span class="n">ignite</span> <span class="p">=</span> <span class="n">Ignition</span><span class="p">.</span><span class="nf">Start</span><span class="p">(</span>
<span class="k">new</span> <span class="n">IgniteConfiguration</span>
<span class="p">{</span>
<span class="n">DiscoverySpi</span> <span class="p">=</span> <span class="k">new</span> <span class="n">TcpDiscoverySpi</span>
<span class="p">{</span>
<span class="n">LocalPort</span> <span class="p">=</span> <span class="m">48500</span><span class="p">,</span>
<span class="n">LocalPortRange</span> <span class="p">=</span> <span class="m">20</span><span class="p">,</span>
<span class="n">IpFinder</span> <span class="p">=</span> <span class="k">new</span> <span class="n">TcpDiscoveryStaticIpFinder</span>
<span class="p">{</span>
<span class="n">Endpoints</span> <span class="p">=</span> <span class="k">new</span><span class="p">[]</span>
<span class="p">{</span>
<span class="s">"127.0.0.1:48500..48520"</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="p">);</span>
<span class="n">ignite</span><span class="p">.</span><span class="nf">GetCompute</span><span class="p">().</span><span class="nf">Run</span><span class="p">(</span><span class="k">new</span> <span class="nf">PrintWordAction</span><span class="p">());</span>
<span class="p">}</span></code></pre>
</div>
</div></code-tab><code-tab data-tab='C++'><div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="cpp"><span class="cm">/*
* Function class.
*/</span>
<span class="k">class</span> <span class="nc">PrintWord</span> <span class="o">:</span> <span class="k">public</span> <span class="n">compute</span><span class="o">::</span><span class="n">ComputeFunc</span><span class="o">&lt;</span><span class="kt">void</span><span class="o">&gt;</span>
<span class="p">{</span>
<span class="k">friend</span> <span class="k">struct</span> <span class="nc">ignite</span><span class="o">::</span><span class="n">binary</span><span class="o">::</span><span class="n">BinaryType</span><span class="o">&lt;</span><span class="n">PrintWord</span><span class="o">&gt;</span><span class="p">;</span>
<span class="nl">public:</span>
<span class="cm">/*
* Default constructor.
*/</span>
<span class="n">PrintWord</span><span class="p">()</span>
<span class="p">{</span>
<span class="c1">// No-op.</span>
<span class="p">}</span>
<span class="cm">/*
* Constructor.
*
* @param text Text.
*/</span>
<span class="n">PrintWord</span><span class="p">(</span><span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&amp;</span> <span class="n">word</span><span class="p">)</span> <span class="o">:</span>
<span class="n">word</span><span class="p">(</span><span class="n">word</span><span class="p">)</span>
<span class="p">{</span>
<span class="c1">// No-op.</span>
<span class="p">}</span>
<span class="cm">/**
* Callback.
*/</span>
<span class="k">virtual</span> <span class="kt">void</span> <span class="n">Call</span><span class="p">()</span>
<span class="p">{</span>
<span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">word</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
<span class="p">}</span>
<span class="cm">/** Word to print. */</span>
<span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">word</span><span class="p">;</span>
<span class="p">};</span>
<span class="cm">/**
* Binary type structure. Defines a set of functions required for type to be serialized and deserialized.
*/</span>
<span class="k">namespace</span> <span class="n">ignite</span>
<span class="p">{</span>
<span class="k">namespace</span> <span class="n">binary</span>
<span class="p">{</span>
<span class="k">template</span><span class="o">&lt;</span><span class="p">&gt;</span>
<span class="k">struct</span> <span class="nc">BinaryType</span><span class="o">&lt;</span><span class="n">PrintWord</span><span class="o">&gt;</span>
<span class="p">{</span>
<span class="k">static</span> <span class="kt">int32_t</span> <span class="n">GetTypeId</span><span class="p">()</span>
<span class="p">{</span>
<span class="k">return</span> <span class="n">GetBinaryStringHashCode</span><span class="p">(</span><span class="s">"PrintWord"</span><span class="p">);</span>
<span class="p">}</span>
<span class="k">static</span> <span class="kt">void</span> <span class="n">GetTypeName</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&amp;</span> <span class="n">dst</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">dst</span> <span class="o">=</span> <span class="s">"PrintWord"</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">static</span> <span class="kt">int32_t</span> <span class="n">GetFieldId</span><span class="p">(</span><span class="k">const</span> <span class="kt">char</span><span class="o">*</span> <span class="n">name</span><span class="p">)</span>
<span class="p">{</span>
<span class="k">return</span> <span class="n">GetBinaryStringHashCode</span><span class="p">(</span><span class="n">name</span><span class="p">);</span>
<span class="p">}</span>
<span class="k">static</span> <span class="kt">int32_t</span> <span class="n">GetHashCode</span><span class="p">(</span><span class="k">const</span> <span class="n">PrintWord</span><span class="o">&amp;</span> <span class="n">obj</span><span class="p">)</span>
<span class="p">{</span>
<span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">static</span> <span class="kt">bool</span> <span class="n">IsNull</span><span class="p">(</span><span class="k">const</span> <span class="n">PrintWord</span><span class="o">&amp;</span> <span class="n">obj</span><span class="p">)</span>
<span class="p">{</span>
<span class="k">return</span> <span class="nb">false</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">static</span> <span class="kt">void</span> <span class="n">GetNull</span><span class="p">(</span><span class="n">PrintWord</span><span class="o">&amp;</span> <span class="n">dst</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">dst</span> <span class="o">=</span> <span class="n">PrintWord</span><span class="p">(</span><span class="s">""</span><span class="p">);</span>
<span class="p">}</span>
<span class="k">static</span> <span class="kt">void</span> <span class="n">Write</span><span class="p">(</span><span class="n">BinaryWriter</span><span class="o">&amp;</span> <span class="n">writer</span><span class="p">,</span> <span class="k">const</span> <span class="n">PrintWord</span><span class="o">&amp;</span> <span class="n">obj</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">writer</span><span class="p">.</span><span class="n">RawWriter</span><span class="p">().</span><span class="n">WriteString</span><span class="p">(</span><span class="n">obj</span><span class="p">.</span><span class="n">word</span><span class="p">);</span>
<span class="p">}</span>
<span class="k">static</span> <span class="kt">void</span> <span class="n">Read</span><span class="p">(</span><span class="n">BinaryReader</span><span class="o">&amp;</span> <span class="n">reader</span><span class="p">,</span> <span class="n">PrintWord</span><span class="o">&amp;</span> <span class="n">dst</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">dst</span><span class="p">.</span><span class="n">word</span> <span class="o">=</span> <span class="n">reader</span><span class="p">.</span><span class="n">RawReader</span><span class="p">().</span><span class="n">ReadString</span><span class="p">();</span>
<span class="p">}</span>
<span class="p">};</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="kt">int</span> <span class="nf">main</span><span class="p">()</span>
<span class="p">{</span>
<span class="n">IgniteConfiguration</span> <span class="n">cfg</span><span class="p">;</span>
<span class="n">cfg</span><span class="p">.</span><span class="n">springCfgPath</span> <span class="o">=</span> <span class="s">"/path/to/configuration.xml"</span><span class="p">;</span>
<span class="n">Ignite</span> <span class="n">ignite</span> <span class="o">=</span> <span class="n">Ignition</span><span class="o">::</span><span class="n">Start</span><span class="p">(</span><span class="n">cfg</span><span class="p">);</span>
<span class="c1">// Get binding instance.</span>
<span class="n">IgniteBinding</span> <span class="n">binding</span> <span class="o">=</span> <span class="n">ignite</span><span class="p">.</span><span class="n">GetBinding</span><span class="p">();</span>
<span class="c1">// Registering our class as a compute function.</span>
<span class="n">binding</span><span class="p">.</span><span class="n">RegisterComputeFunc</span><span class="o">&lt;</span><span class="n">PrintWord</span><span class="o">&gt;</span><span class="p">();</span>
<span class="c1">// Get compute instance.</span>
<span class="n">compute</span><span class="o">::</span><span class="n">Compute</span> <span class="n">compute</span> <span class="o">=</span> <span class="n">ignite</span><span class="p">.</span><span class="n">GetCompute</span><span class="p">();</span>
<span class="n">std</span><span class="o">::</span><span class="n">istringstream</span> <span class="n">iss</span><span class="p">(</span><span class="s">"Print words on different cluster nodes"</span><span class="p">);</span>
<span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&gt;</span> <span class="n">words</span><span class="p">((</span><span class="n">std</span><span class="o">::</span><span class="n">istream_iterator</span><span class="o">&lt;</span><span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&gt;</span><span class="p">(</span><span class="n">iss</span><span class="p">)),</span>
<span class="n">std</span><span class="o">::</span><span class="n">istream_iterator</span><span class="o">&lt;</span><span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&gt;</span><span class="p">());</span>
<span class="c1">// Iterate through all words and print</span>
<span class="c1">// each word on a different cluster node.</span>
<span class="k">for</span> <span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">word</span> <span class="o">:</span> <span class="n">words</span><span class="p">)</span>
<span class="p">{</span>
<span class="c1">// Run compute task.</span>
<span class="n">compute</span><span class="p">.</span><span class="n">Run</span><span class="p">(</span><span class="n">PrintWord</span><span class="p">(</span><span class="n">word</span><span class="p">));</span>
<span class="p">}</span>
<span class="p">}</span></code></pre>
</div>
</div></code-tab></code-tabs>
</div>
<div class="sect2">
<h3 id="executing-a-callable-task">Executing a Callable Task</h3>
<div class="paragraph">
<p>To execute a callable task, use the <code>call(&#8230;&#8203;)</code> method of the compute interface.</p>
</div>
<code-tabs><code-tab data-tab='Java'><div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="java"><span class="nc">Collection</span><span class="o">&lt;</span><span class="nc">IgniteCallable</span><span class="o">&lt;</span><span class="nc">Integer</span><span class="o">&gt;&gt;</span> <span class="n">calls</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">ArrayList</span><span class="o">&lt;&gt;();</span>
<span class="c1">// Iterate through all words in the sentence and create callable jobs.</span>
<span class="k">for</span> <span class="o">(</span><span class="nc">String</span> <span class="n">word</span> <span class="o">:</span> <span class="s">"How many characters"</span><span class="o">.</span><span class="na">split</span><span class="o">(</span><span class="s">" "</span><span class="o">))</span>
<span class="n">calls</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="nl">word:</span><span class="o">:</span><span class="n">length</span><span class="o">);</span>
<span class="c1">// Execute the collection of callables on the cluster.</span>
<span class="nc">Collection</span><span class="o">&lt;</span><span class="nc">Integer</span><span class="o">&gt;</span> <span class="n">res</span> <span class="o">=</span> <span class="n">ignite</span><span class="o">.</span><span class="na">compute</span><span class="o">().</span><span class="na">call</span><span class="o">(</span><span class="n">calls</span><span class="o">);</span>
<span class="c1">// Add all the word lengths received from cluster nodes.</span>
<span class="kt">int</span> <span class="n">total</span> <span class="o">=</span> <span class="n">res</span><span class="o">.</span><span class="na">stream</span><span class="o">().</span><span class="na">mapToInt</span><span class="o">(</span><span class="nl">Integer:</span><span class="o">:</span><span class="n">intValue</span><span class="o">).</span><span class="na">sum</span><span class="o">();</span></code></pre>
</div>
</div></code-tab><code-tab data-tab='C#/.NET'><div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="csharp"><span class="k">class</span> <span class="nc">CharCounter</span> <span class="p">:</span> <span class="n">IComputeFunc</span><span class="p">&lt;</span><span class="kt">int</span><span class="p">&gt;</span>
<span class="p">{</span>
<span class="k">private</span> <span class="k">readonly</span> <span class="kt">string</span> <span class="n">arg</span><span class="p">;</span>
<span class="k">public</span> <span class="nf">CharCounter</span><span class="p">(</span><span class="kt">string</span> <span class="n">arg</span><span class="p">)</span>
<span class="p">{</span>
<span class="k">this</span><span class="p">.</span><span class="n">arg</span> <span class="p">=</span> <span class="n">arg</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">public</span> <span class="kt">int</span> <span class="nf">Invoke</span><span class="p">()</span>
<span class="p">{</span>
<span class="k">return</span> <span class="n">arg</span><span class="p">.</span><span class="n">Length</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="k">public</span> <span class="k">static</span> <span class="k">void</span> <span class="nf">ComputeFuncDemo</span><span class="p">()</span>
<span class="p">{</span>
<span class="kt">var</span> <span class="n">ignite</span> <span class="p">=</span> <span class="n">Ignition</span><span class="p">.</span><span class="nf">Start</span><span class="p">(</span>
<span class="k">new</span> <span class="n">IgniteConfiguration</span>
<span class="p">{</span>
<span class="n">DiscoverySpi</span> <span class="p">=</span> <span class="k">new</span> <span class="n">TcpDiscoverySpi</span>
<span class="p">{</span>
<span class="n">LocalPort</span> <span class="p">=</span> <span class="m">48500</span><span class="p">,</span>
<span class="n">LocalPortRange</span> <span class="p">=</span> <span class="m">20</span><span class="p">,</span>
<span class="n">IpFinder</span> <span class="p">=</span> <span class="k">new</span> <span class="n">TcpDiscoveryStaticIpFinder</span>
<span class="p">{</span>
<span class="n">Endpoints</span> <span class="p">=</span> <span class="k">new</span><span class="p">[]</span>
<span class="p">{</span>
<span class="s">"127.0.0.1:48500..48520"</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="p">);</span>
<span class="c1">// Iterate through all words in the sentence and create callable jobs.</span>
<span class="kt">var</span> <span class="n">calls</span> <span class="p">=</span> <span class="s">"How many characters"</span><span class="p">.</span><span class="nf">Split</span><span class="p">(</span><span class="s">" "</span><span class="p">).</span><span class="nf">Select</span><span class="p">(</span><span class="n">s</span> <span class="p">=&gt;</span> <span class="k">new</span> <span class="nf">CharCounter</span><span class="p">(</span><span class="n">s</span><span class="p">)).</span><span class="nf">ToList</span><span class="p">();</span>
<span class="c1">// Execute the collection of calls on the cluster.</span>
<span class="kt">var</span> <span class="n">res</span> <span class="p">=</span> <span class="n">ignite</span><span class="p">.</span><span class="nf">GetCompute</span><span class="p">().</span><span class="nf">Call</span><span class="p">(</span><span class="n">calls</span><span class="p">);</span>
<span class="c1">// Add all the word lengths received from cluster nodes.</span>
<span class="kt">var</span> <span class="n">total</span> <span class="p">=</span> <span class="n">res</span><span class="p">.</span><span class="nf">Sum</span><span class="p">();</span>
<span class="p">}</span></code></pre>
</div>
</div></code-tab><code-tab data-tab='C++'><div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="cpp"><span class="cm">/*
* Function class.
*/</span>
<span class="k">class</span> <span class="nc">CountLength</span> <span class="o">:</span> <span class="k">public</span> <span class="n">compute</span><span class="o">::</span><span class="n">ComputeFunc</span><span class="o">&lt;</span><span class="kt">int32_t</span><span class="o">&gt;</span>
<span class="p">{</span>
<span class="k">friend</span> <span class="k">struct</span> <span class="nc">ignite</span><span class="o">::</span><span class="n">binary</span><span class="o">::</span><span class="n">BinaryType</span><span class="o">&lt;</span><span class="n">CountLength</span><span class="o">&gt;</span><span class="p">;</span>
<span class="nl">public:</span>
<span class="cm">/*
* Default constructor.
*/</span>
<span class="n">CountLength</span><span class="p">()</span>
<span class="p">{</span>
<span class="c1">// No-op.</span>
<span class="p">}</span>
<span class="cm">/*
* Constructor.
*
* @param text Text.
*/</span>
<span class="n">CountLength</span><span class="p">(</span><span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&amp;</span> <span class="n">word</span><span class="p">)</span> <span class="o">:</span>
<span class="n">word</span><span class="p">(</span><span class="n">word</span><span class="p">)</span>
<span class="p">{</span>
<span class="c1">// No-op.</span>
<span class="p">}</span>
<span class="cm">/**
* Callback.
* Counts number of characters in provided word.
*
* @return Word's length.
*/</span>
<span class="k">virtual</span> <span class="kt">int32_t</span> <span class="n">Call</span><span class="p">()</span>
<span class="p">{</span>
<span class="k">return</span> <span class="n">word</span><span class="p">.</span><span class="n">length</span><span class="p">();</span>
<span class="p">}</span>
<span class="cm">/** Word to print. */</span>
<span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">word</span><span class="p">;</span>
<span class="p">};</span>
<span class="cm">/**
* Binary type structure. Defines a set of functions required for type to be serialized and deserialized.
*/</span>
<span class="k">namespace</span> <span class="n">ignite</span>
<span class="p">{</span>
<span class="k">namespace</span> <span class="n">binary</span>
<span class="p">{</span>
<span class="k">template</span><span class="o">&lt;</span><span class="p">&gt;</span>
<span class="k">struct</span> <span class="nc">BinaryType</span><span class="o">&lt;</span><span class="n">CountLength</span><span class="o">&gt;</span>
<span class="p">{</span>
<span class="k">static</span> <span class="kt">int32_t</span> <span class="n">GetTypeId</span><span class="p">()</span>
<span class="p">{</span>
<span class="k">return</span> <span class="n">GetBinaryStringHashCode</span><span class="p">(</span><span class="s">"CountLength"</span><span class="p">);</span>
<span class="p">}</span>
<span class="k">static</span> <span class="kt">void</span> <span class="n">GetTypeName</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&amp;</span> <span class="n">dst</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">dst</span> <span class="o">=</span> <span class="s">"CountLength"</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">static</span> <span class="kt">int32_t</span> <span class="n">GetFieldId</span><span class="p">(</span><span class="k">const</span> <span class="kt">char</span><span class="o">*</span> <span class="n">name</span><span class="p">)</span>
<span class="p">{</span>
<span class="k">return</span> <span class="n">GetBinaryStringHashCode</span><span class="p">(</span><span class="n">name</span><span class="p">);</span>
<span class="p">}</span>
<span class="k">static</span> <span class="kt">int32_t</span> <span class="n">GetHashCode</span><span class="p">(</span><span class="k">const</span> <span class="n">CountLength</span><span class="o">&amp;</span> <span class="n">obj</span><span class="p">)</span>
<span class="p">{</span>
<span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">static</span> <span class="kt">bool</span> <span class="n">IsNull</span><span class="p">(</span><span class="k">const</span> <span class="n">CountLength</span><span class="o">&amp;</span> <span class="n">obj</span><span class="p">)</span>
<span class="p">{</span>
<span class="k">return</span> <span class="nb">false</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">static</span> <span class="kt">void</span> <span class="n">GetNull</span><span class="p">(</span><span class="n">CountLength</span><span class="o">&amp;</span> <span class="n">dst</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">dst</span> <span class="o">=</span> <span class="n">CountLength</span><span class="p">(</span><span class="s">""</span><span class="p">);</span>
<span class="p">}</span>
<span class="k">static</span> <span class="kt">void</span> <span class="n">Write</span><span class="p">(</span><span class="n">BinaryWriter</span><span class="o">&amp;</span> <span class="n">writer</span><span class="p">,</span> <span class="k">const</span> <span class="n">CountLength</span><span class="o">&amp;</span> <span class="n">obj</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">writer</span><span class="p">.</span><span class="n">RawWriter</span><span class="p">().</span><span class="n">WriteString</span><span class="p">(</span><span class="n">obj</span><span class="p">.</span><span class="n">word</span><span class="p">);</span>
<span class="p">}</span>
<span class="k">static</span> <span class="kt">void</span> <span class="n">Read</span><span class="p">(</span><span class="n">BinaryReader</span><span class="o">&amp;</span> <span class="n">reader</span><span class="p">,</span> <span class="n">CountLength</span><span class="o">&amp;</span> <span class="n">dst</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">dst</span><span class="p">.</span><span class="n">word</span> <span class="o">=</span> <span class="n">reader</span><span class="p">.</span><span class="n">RawReader</span><span class="p">().</span><span class="n">ReadString</span><span class="p">();</span>
<span class="p">}</span>
<span class="p">};</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="kt">int</span> <span class="nf">main</span><span class="p">()</span>
<span class="p">{</span>
<span class="n">IgniteConfiguration</span> <span class="n">cfg</span><span class="p">;</span>
<span class="n">cfg</span><span class="p">.</span><span class="n">springCfgPath</span> <span class="o">=</span> <span class="s">"/path/to/configuration.xml"</span><span class="p">;</span>
<span class="n">Ignite</span> <span class="n">ignite</span> <span class="o">=</span> <span class="n">Ignition</span><span class="o">::</span><span class="n">Start</span><span class="p">(</span><span class="n">cfg</span><span class="p">);</span>
<span class="c1">// Get binding instance.</span>
<span class="n">IgniteBinding</span> <span class="n">binding</span> <span class="o">=</span> <span class="n">ignite</span><span class="p">.</span><span class="n">GetBinding</span><span class="p">();</span>
<span class="c1">// Registering our class as a compute function.</span>
<span class="n">binding</span><span class="p">.</span><span class="n">RegisterComputeFunc</span><span class="o">&lt;</span><span class="n">CountLength</span><span class="o">&gt;</span><span class="p">();</span>
<span class="c1">// Get compute instance.</span>
<span class="n">compute</span><span class="o">::</span><span class="n">Compute</span> <span class="n">compute</span> <span class="o">=</span> <span class="n">ignite</span><span class="p">.</span><span class="n">GetCompute</span><span class="p">();</span>
<span class="n">std</span><span class="o">::</span><span class="n">istringstream</span> <span class="n">iss</span><span class="p">(</span><span class="s">"How many characters"</span><span class="p">);</span>
<span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&gt;</span> <span class="n">words</span><span class="p">((</span><span class="n">std</span><span class="o">::</span><span class="n">istream_iterator</span><span class="o">&lt;</span><span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&gt;</span><span class="p">(</span><span class="n">iss</span><span class="p">)),</span>
<span class="n">std</span><span class="o">::</span><span class="n">istream_iterator</span><span class="o">&lt;</span><span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&gt;</span><span class="p">());</span>
<span class="kt">int32_t</span> <span class="n">total</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
<span class="c1">// Iterate through all words in the sentence, create and call jobs.</span>
<span class="k">for</span> <span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">word</span> <span class="o">:</span> <span class="n">words</span><span class="p">)</span>
<span class="p">{</span>
<span class="c1">// Add word length received from cluster node.</span>
<span class="n">total</span> <span class="o">+=</span> <span class="n">compute</span><span class="p">.</span><span class="n">Call</span><span class="o">&lt;</span><span class="kt">int32_t</span><span class="o">&gt;</span><span class="p">(</span><span class="n">CountLength</span><span class="p">(</span><span class="n">word</span><span class="p">));</span>
<span class="p">}</span>
<span class="p">}</span></code></pre>
</div>
</div></code-tab></code-tabs>
</div>
<div class="sect2">
<h3 id="executing-an-igniteclosure">Executing an IgniteClosure</h3>
<div class="paragraph">
<p>To execute an <code>IgniteClosure</code>, use the <code>apply(&#8230;&#8203;)</code> method of the compute interface. The method accepts a task and an input parameter for the task. The parameter is passed to the given <code>IgniteClosure</code> at the execution time.</p>
</div>
<code-tabs><code-tab data-tab='Java'><div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="java"><span class="nc">IgniteCompute</span> <span class="n">compute</span> <span class="o">=</span> <span class="n">ignite</span><span class="o">.</span><span class="na">compute</span><span class="o">();</span>
<span class="c1">// Execute closure on all cluster nodes.</span>
<span class="nc">Collection</span><span class="o">&lt;</span><span class="nc">Integer</span><span class="o">&gt;</span> <span class="n">res</span> <span class="o">=</span> <span class="n">compute</span><span class="o">.</span><span class="na">apply</span><span class="o">(</span><span class="nl">String:</span><span class="o">:</span><span class="n">length</span><span class="o">,</span> <span class="nc">Arrays</span><span class="o">.</span><span class="na">asList</span><span class="o">(</span><span class="s">"How many characters"</span><span class="o">.</span><span class="na">split</span><span class="o">(</span><span class="s">" "</span><span class="o">)));</span>
<span class="c1">// Add all the word lengths received from cluster nodes.</span>
<span class="kt">int</span> <span class="n">total</span> <span class="o">=</span> <span class="n">res</span><span class="o">.</span><span class="na">stream</span><span class="o">().</span><span class="na">mapToInt</span><span class="o">(</span><span class="nl">Integer:</span><span class="o">:</span><span class="n">intValue</span><span class="o">).</span><span class="na">sum</span><span class="o">();</span></code></pre>
</div>
</div></code-tab><code-tab data-tab='C#/.NET'><div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="csharp"><span class="k">class</span> <span class="nc">CharCountingFunc</span> <span class="p">:</span> <span class="n">IComputeFunc</span><span class="p">&lt;</span><span class="kt">string</span><span class="p">,</span> <span class="kt">int</span><span class="p">&gt;</span>
<span class="p">{</span>
<span class="k">public</span> <span class="kt">int</span> <span class="nf">Invoke</span><span class="p">(</span><span class="kt">string</span> <span class="n">arg</span><span class="p">)</span>
<span class="p">{</span>
<span class="k">return</span> <span class="n">arg</span><span class="p">.</span><span class="n">Length</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="k">public</span> <span class="k">static</span> <span class="k">void</span> <span class="nf">Foo</span><span class="p">()</span>
<span class="p">{</span>
<span class="kt">var</span> <span class="n">ignite</span> <span class="p">=</span> <span class="n">Ignition</span><span class="p">.</span><span class="nf">Start</span><span class="p">(</span>
<span class="k">new</span> <span class="n">IgniteConfiguration</span>
<span class="p">{</span>
<span class="n">DiscoverySpi</span> <span class="p">=</span> <span class="k">new</span> <span class="n">TcpDiscoverySpi</span>
<span class="p">{</span>
<span class="n">LocalPort</span> <span class="p">=</span> <span class="m">48500</span><span class="p">,</span>
<span class="n">LocalPortRange</span> <span class="p">=</span> <span class="m">20</span><span class="p">,</span>
<span class="n">IpFinder</span> <span class="p">=</span> <span class="k">new</span> <span class="n">TcpDiscoveryStaticIpFinder</span>
<span class="p">{</span>
<span class="n">Endpoints</span> <span class="p">=</span> <span class="k">new</span><span class="p">[]</span>
<span class="p">{</span>
<span class="s">"127.0.0.1:48500..48520"</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="p">);</span>
<span class="kt">var</span> <span class="n">res</span> <span class="p">=</span> <span class="n">ignite</span><span class="p">.</span><span class="nf">GetCompute</span><span class="p">().</span><span class="nf">Apply</span><span class="p">(</span><span class="k">new</span> <span class="nf">CharCountingFunc</span><span class="p">(),</span> <span class="s">"How many characters"</span><span class="p">.</span><span class="nf">Split</span><span class="p">());</span>
<span class="kt">int</span> <span class="n">total</span> <span class="p">=</span> <span class="n">res</span><span class="p">.</span><span class="nf">Sum</span><span class="p">();</span>
<span class="p">}</span></code></pre>
</div>
</div></code-tab><code-tab data-tab='C++' data-unavailable='true'><div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code>This API is not presently available for C++.</code></pre>
</div>
</div></code-tab></code-tabs>
</div>
<div class="sect2">
<h3 id="broadcasting-a-task">Broadcasting a Task</h3>
<div class="paragraph">
<p>The <code>broadcast()</code> method executes a task on <em>all nodes</em> associated with the compute instance.</p>
</div>
<code-tabs><code-tab data-tab='Java'><div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="java"><span class="c1">// Limit broadcast to remote nodes only.</span>
<span class="nc">IgniteCompute</span> <span class="n">compute</span> <span class="o">=</span> <span class="n">ignite</span><span class="o">.</span><span class="na">compute</span><span class="o">(</span><span class="n">ignite</span><span class="o">.</span><span class="na">cluster</span><span class="o">().</span><span class="na">forRemotes</span><span class="o">());</span>
<span class="c1">// Print out hello message on remote nodes in the cluster group.</span>
<span class="n">compute</span><span class="o">.</span><span class="na">broadcast</span><span class="o">(()</span> <span class="o">-&gt;</span> <span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"Hello Node: "</span> <span class="o">+</span> <span class="n">ignite</span><span class="o">.</span><span class="na">cluster</span><span class="o">().</span><span class="na">localNode</span><span class="o">().</span><span class="na">id</span><span class="o">()));</span></code></pre>
</div>
</div></code-tab><code-tab data-tab='C#/.NET'><div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="csharp"><span class="k">class</span> <span class="nc">PrintNodeIdAction</span> <span class="p">:</span> <span class="n">IComputeAction</span>
<span class="p">{</span>
<span class="k">public</span> <span class="k">void</span> <span class="nf">Invoke</span><span class="p">()</span>
<span class="p">{</span>
<span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="s">"Hello node: "</span> <span class="p">+</span>
<span class="n">Ignition</span><span class="p">.</span><span class="nf">GetIgnite</span><span class="p">().</span><span class="nf">GetCluster</span><span class="p">().</span><span class="nf">GetLocalNode</span><span class="p">().</span><span class="n">Id</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="k">public</span> <span class="k">static</span> <span class="k">void</span> <span class="nf">BroadcastDemo</span><span class="p">()</span>
<span class="p">{</span>
<span class="kt">var</span> <span class="n">ignite</span> <span class="p">=</span> <span class="n">Ignition</span><span class="p">.</span><span class="nf">Start</span><span class="p">(</span>
<span class="k">new</span> <span class="n">IgniteConfiguration</span>
<span class="p">{</span>
<span class="n">DiscoverySpi</span> <span class="p">=</span> <span class="k">new</span> <span class="n">TcpDiscoverySpi</span>
<span class="p">{</span>
<span class="n">LocalPort</span> <span class="p">=</span> <span class="m">48500</span><span class="p">,</span>
<span class="n">LocalPortRange</span> <span class="p">=</span> <span class="m">20</span><span class="p">,</span>
<span class="n">IpFinder</span> <span class="p">=</span> <span class="k">new</span> <span class="n">TcpDiscoveryStaticIpFinder</span>
<span class="p">{</span>
<span class="n">Endpoints</span> <span class="p">=</span> <span class="k">new</span><span class="p">[]</span>
<span class="p">{</span>
<span class="s">"127.0.0.1:48500..48520"</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="p">);</span>
<span class="c1">// Limit broadcast to remote nodes only.</span>
<span class="kt">var</span> <span class="n">compute</span> <span class="p">=</span> <span class="n">ignite</span><span class="p">.</span><span class="nf">GetCluster</span><span class="p">().</span><span class="nf">ForRemotes</span><span class="p">().</span><span class="nf">GetCompute</span><span class="p">();</span>
<span class="c1">// Print out hello message on remote nodes in the cluster group.</span>
<span class="n">compute</span><span class="p">.</span><span class="nf">Broadcast</span><span class="p">(</span><span class="k">new</span> <span class="nf">PrintNodeIdAction</span><span class="p">());</span>
<span class="p">}</span></code></pre>
</div>
</div></code-tab><code-tab data-tab='C++'><div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="cpp"><span class="cm">/*
* Function class.
*/</span>
<span class="k">class</span> <span class="nc">Hello</span> <span class="o">:</span> <span class="k">public</span> <span class="n">compute</span><span class="o">::</span><span class="n">ComputeFunc</span><span class="o">&lt;</span><span class="kt">void</span><span class="o">&gt;</span>
<span class="p">{</span>
<span class="k">friend</span> <span class="k">struct</span> <span class="nc">ignite</span><span class="o">::</span><span class="n">binary</span><span class="o">::</span><span class="n">BinaryType</span><span class="o">&lt;</span><span class="n">Hello</span><span class="o">&gt;</span><span class="p">;</span>
<span class="nl">public:</span>
<span class="cm">/*
* Default constructor.
*/</span>
<span class="n">Hello</span><span class="p">()</span>
<span class="p">{</span>
<span class="c1">// No-op.</span>
<span class="p">}</span>
<span class="cm">/**
* Callback.
*/</span>
<span class="k">virtual</span> <span class="kt">void</span> <span class="n">Call</span><span class="p">()</span>
<span class="p">{</span>
<span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">"Hello"</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">};</span>
<span class="cm">/**
* Binary type structure. Defines a set of functions required for type to be serialized and deserialized.
*/</span>
<span class="k">namespace</span> <span class="n">ignite</span>
<span class="p">{</span>
<span class="k">namespace</span> <span class="n">binary</span>
<span class="p">{</span>
<span class="k">template</span><span class="o">&lt;</span><span class="p">&gt;</span>
<span class="k">struct</span> <span class="nc">BinaryType</span><span class="o">&lt;</span><span class="n">Hello</span><span class="o">&gt;</span>
<span class="p">{</span>
<span class="k">static</span> <span class="kt">int32_t</span> <span class="n">GetTypeId</span><span class="p">()</span>
<span class="p">{</span>
<span class="k">return</span> <span class="n">GetBinaryStringHashCode</span><span class="p">(</span><span class="s">"Hello"</span><span class="p">);</span>
<span class="p">}</span>
<span class="k">static</span> <span class="kt">void</span> <span class="n">GetTypeName</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&amp;</span> <span class="n">dst</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">dst</span> <span class="o">=</span> <span class="s">"Hello"</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">static</span> <span class="kt">int32_t</span> <span class="n">GetFieldId</span><span class="p">(</span><span class="k">const</span> <span class="kt">char</span><span class="o">*</span> <span class="n">name</span><span class="p">)</span>
<span class="p">{</span>
<span class="k">return</span> <span class="n">GetBinaryStringHashCode</span><span class="p">(</span><span class="n">name</span><span class="p">);</span>
<span class="p">}</span>
<span class="k">static</span> <span class="kt">int32_t</span> <span class="n">GetHashCode</span><span class="p">(</span><span class="k">const</span> <span class="n">Hello</span><span class="o">&amp;</span> <span class="n">obj</span><span class="p">)</span>
<span class="p">{</span>
<span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">static</span> <span class="kt">bool</span> <span class="n">IsNull</span><span class="p">(</span><span class="k">const</span> <span class="n">Hello</span><span class="o">&amp;</span> <span class="n">obj</span><span class="p">)</span>
<span class="p">{</span>
<span class="k">return</span> <span class="nb">false</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">static</span> <span class="kt">void</span> <span class="n">GetNull</span><span class="p">(</span><span class="n">Hello</span><span class="o">&amp;</span> <span class="n">dst</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">dst</span> <span class="o">=</span> <span class="n">Hello</span><span class="p">();</span>
<span class="p">}</span>
<span class="k">static</span> <span class="kt">void</span> <span class="n">Write</span><span class="p">(</span><span class="n">BinaryWriter</span><span class="o">&amp;</span> <span class="n">writer</span><span class="p">,</span> <span class="k">const</span> <span class="n">Hello</span><span class="o">&amp;</span> <span class="n">obj</span><span class="p">)</span>
<span class="p">{</span>
<span class="c1">// No-op.</span>
<span class="p">}</span>
<span class="k">static</span> <span class="kt">void</span> <span class="n">Read</span><span class="p">(</span><span class="n">BinaryReader</span><span class="o">&amp;</span> <span class="n">reader</span><span class="p">,</span> <span class="n">Hello</span><span class="o">&amp;</span> <span class="n">dst</span><span class="p">)</span>
<span class="p">{</span>
<span class="c1">// No-op.</span>
<span class="p">}</span>
<span class="p">};</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="kt">int</span> <span class="nf">main</span><span class="p">()</span>
<span class="p">{</span>
<span class="n">IgniteConfiguration</span> <span class="n">cfg</span><span class="p">;</span>
<span class="n">cfg</span><span class="p">.</span><span class="n">springCfgPath</span> <span class="o">=</span> <span class="s">"/path/to/configuration.xml"</span><span class="p">;</span>
<span class="n">Ignite</span> <span class="n">ignite</span> <span class="o">=</span> <span class="n">Ignition</span><span class="o">::</span><span class="n">Start</span><span class="p">(</span><span class="n">cfg</span><span class="p">);</span>
<span class="c1">// Get binding instance.</span>
<span class="n">IgniteBinding</span> <span class="n">binding</span> <span class="o">=</span> <span class="n">ignite</span><span class="p">.</span><span class="n">GetBinding</span><span class="p">();</span>
<span class="c1">// Registering our class as a compute function.</span>
<span class="n">binding</span><span class="p">.</span><span class="n">RegisterComputeFunc</span><span class="o">&lt;</span><span class="n">Hello</span><span class="o">&gt;</span><span class="p">();</span>
<span class="c1">// Broadcast to all nodes.</span>
<span class="n">compute</span><span class="o">::</span><span class="n">Compute</span> <span class="n">compute</span> <span class="o">=</span> <span class="n">ignite</span><span class="p">.</span><span class="n">GetCompute</span><span class="p">();</span>
<span class="c1">// Declaring function instance.</span>
<span class="n">Hello</span> <span class="n">hello</span><span class="p">;</span>
<span class="c1">// Print out hello message on nodes in the cluster group.</span>
<span class="n">compute</span><span class="p">.</span><span class="n">Broadcast</span><span class="p">(</span><span class="n">hello</span><span class="p">);</span>
<span class="p">}</span></code></pre>
</div>
</div></code-tab></code-tabs>
</div>
<div class="sect2">
<h3 id="asynchronous-execution">Asynchronous Execution</h3>
<div class="paragraph">
<p>All methods described in the previous sections have asynchronous counterparts:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><code>callAsync(&#8230;&#8203;)</code></p>
</li>
<li>
<p><code>runAsync(&#8230;&#8203;)</code></p>
</li>
<li>
<p><code>applyAsync(&#8230;&#8203;)</code></p>
</li>
<li>
<p><code>broadcastAsync(&#8230;&#8203;)</code></p>
</li>
</ul>
</div>
<div class="paragraph">
<p>The asynchronous methods return an <code>IgniteFuture</code> that represents the result of the operation. In the following example, a collection of callable tasks is executed asynchronously.</p>
</div>
<code-tabs><code-tab data-tab='Java'><div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="java"><span class="nc">IgniteCompute</span> <span class="n">compute</span> <span class="o">=</span> <span class="n">ignite</span><span class="o">.</span><span class="na">compute</span><span class="o">();</span>
<span class="nc">Collection</span><span class="o">&lt;</span><span class="nc">IgniteCallable</span><span class="o">&lt;</span><span class="nc">Integer</span><span class="o">&gt;&gt;</span> <span class="n">calls</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">ArrayList</span><span class="o">&lt;&gt;();</span>
<span class="c1">// Iterate through all words in the sentence and create callable jobs.</span>
<span class="k">for</span> <span class="o">(</span><span class="nc">String</span> <span class="n">word</span> <span class="o">:</span> <span class="s">"Count characters using a callable"</span><span class="o">.</span><span class="na">split</span><span class="o">(</span><span class="s">" "</span><span class="o">))</span>
<span class="n">calls</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="nl">word:</span><span class="o">:</span><span class="n">length</span><span class="o">);</span>
<span class="nc">IgniteFuture</span><span class="o">&lt;</span><span class="nc">Collection</span><span class="o">&lt;</span><span class="nc">Integer</span><span class="o">&gt;&gt;</span> <span class="n">future</span> <span class="o">=</span> <span class="n">compute</span><span class="o">.</span><span class="na">callAsync</span><span class="o">(</span><span class="n">calls</span><span class="o">);</span>
<span class="n">future</span><span class="o">.</span><span class="na">listen</span><span class="o">(</span><span class="n">fut</span> <span class="o">-&gt;</span> <span class="o">{</span>
<span class="c1">// Total number of characters.</span>
<span class="kt">int</span> <span class="n">total</span> <span class="o">=</span> <span class="n">fut</span><span class="o">.</span><span class="na">get</span><span class="o">().</span><span class="na">stream</span><span class="o">().</span><span class="na">mapToInt</span><span class="o">(</span><span class="nl">Integer:</span><span class="o">:</span><span class="n">intValue</span><span class="o">).</span><span class="na">sum</span><span class="o">();</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"Total number of characters: "</span> <span class="o">+</span> <span class="n">total</span><span class="o">);</span>
<span class="o">});</span></code></pre>
</div>
</div></code-tab><code-tab data-tab='C#/.NET'><div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="csharp"><span class="k">class</span> <span class="nc">CharCounter</span> <span class="p">:</span> <span class="n">IComputeFunc</span><span class="p">&lt;</span><span class="kt">int</span><span class="p">&gt;</span>
<span class="p">{</span>
<span class="k">private</span> <span class="k">readonly</span> <span class="kt">string</span> <span class="n">arg</span><span class="p">;</span>
<span class="k">public</span> <span class="nf">CharCounter</span><span class="p">(</span><span class="kt">string</span> <span class="n">arg</span><span class="p">)</span>
<span class="p">{</span>
<span class="k">this</span><span class="p">.</span><span class="n">arg</span> <span class="p">=</span> <span class="n">arg</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">public</span> <span class="kt">int</span> <span class="nf">Invoke</span><span class="p">()</span>
<span class="p">{</span>
<span class="k">return</span> <span class="n">arg</span><span class="p">.</span><span class="n">Length</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="k">public</span> <span class="k">static</span> <span class="k">void</span> <span class="nf">AsyncDemo</span><span class="p">()</span>
<span class="p">{</span>
<span class="kt">var</span> <span class="n">ignite</span> <span class="p">=</span> <span class="n">Ignition</span><span class="p">.</span><span class="nf">Start</span><span class="p">(</span>
<span class="k">new</span> <span class="n">IgniteConfiguration</span>
<span class="p">{</span>
<span class="n">DiscoverySpi</span> <span class="p">=</span> <span class="k">new</span> <span class="n">TcpDiscoverySpi</span>
<span class="p">{</span>
<span class="n">LocalPort</span> <span class="p">=</span> <span class="m">48500</span><span class="p">,</span>
<span class="n">LocalPortRange</span> <span class="p">=</span> <span class="m">20</span><span class="p">,</span>
<span class="n">IpFinder</span> <span class="p">=</span> <span class="k">new</span> <span class="n">TcpDiscoveryStaticIpFinder</span>
<span class="p">{</span>
<span class="n">Endpoints</span> <span class="p">=</span> <span class="k">new</span><span class="p">[]</span>
<span class="p">{</span>
<span class="s">"127.0.0.1:48500..48520"</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="p">);</span>
<span class="kt">var</span> <span class="n">calls</span> <span class="p">=</span> <span class="s">"Count character using async compute"</span>
<span class="p">.</span><span class="nf">Split</span><span class="p">(</span><span class="s">" "</span><span class="p">).</span><span class="nf">Select</span><span class="p">(</span><span class="n">s</span> <span class="p">=&gt;</span> <span class="k">new</span> <span class="nf">CharCounter</span><span class="p">(</span><span class="n">s</span><span class="p">)).</span><span class="nf">ToList</span><span class="p">();</span>
<span class="kt">var</span> <span class="n">future</span> <span class="p">=</span> <span class="n">ignite</span><span class="p">.</span><span class="nf">GetCompute</span><span class="p">().</span><span class="nf">CallAsync</span><span class="p">(</span><span class="n">calls</span><span class="p">);</span>
<span class="n">future</span><span class="p">.</span><span class="nf">ContinueWith</span><span class="p">(</span><span class="n">fut</span> <span class="p">=&gt;</span>
<span class="p">{</span>
<span class="kt">var</span> <span class="n">total</span> <span class="p">=</span> <span class="n">fut</span><span class="p">.</span><span class="n">Result</span><span class="p">.</span><span class="nf">Sum</span><span class="p">();</span>
<span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="s">"Total number of characters: "</span> <span class="p">+</span> <span class="n">total</span><span class="p">);</span>
<span class="p">});</span>
<span class="p">}</span></code></pre>
</div>
</div></code-tab><code-tab data-tab='C++'><div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="cpp"><span class="cm">/*
* Function class.
*/</span>
<span class="k">class</span> <span class="nc">CountLength</span> <span class="o">:</span> <span class="k">public</span> <span class="n">compute</span><span class="o">::</span><span class="n">ComputeFunc</span><span class="o">&lt;</span><span class="kt">int32_t</span><span class="o">&gt;</span>
<span class="p">{</span>
<span class="k">friend</span> <span class="k">struct</span> <span class="nc">ignite</span><span class="o">::</span><span class="n">binary</span><span class="o">::</span><span class="n">BinaryType</span><span class="o">&lt;</span><span class="n">CountLength</span><span class="o">&gt;</span><span class="p">;</span>
<span class="nl">public:</span>
<span class="cm">/*
* Default constructor.
*/</span>
<span class="n">CountLength</span><span class="p">()</span>
<span class="p">{</span>
<span class="c1">// No-op.</span>
<span class="p">}</span>
<span class="cm">/*
* Constructor.
*
* @param text Text.
*/</span>
<span class="n">CountLength</span><span class="p">(</span><span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&amp;</span> <span class="n">word</span><span class="p">)</span> <span class="o">:</span>
<span class="n">word</span><span class="p">(</span><span class="n">word</span><span class="p">)</span>
<span class="p">{</span>
<span class="c1">// No-op.</span>
<span class="p">}</span>
<span class="cm">/**
* Callback.
* Counts number of characters in provided word.
*
* @return Word's length.
*/</span>
<span class="k">virtual</span> <span class="kt">int32_t</span> <span class="n">Call</span><span class="p">()</span>
<span class="p">{</span>
<span class="k">return</span> <span class="n">word</span><span class="p">.</span><span class="n">length</span><span class="p">();</span>
<span class="p">}</span>
<span class="cm">/** Word to print. */</span>
<span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">word</span><span class="p">;</span>
<span class="p">};</span>
<span class="cm">/**
* Binary type structure. Defines a set of functions required for type to be serialized and deserialized.
*/</span>
<span class="k">namespace</span> <span class="n">ignite</span>
<span class="p">{</span>
<span class="k">namespace</span> <span class="n">binary</span>
<span class="p">{</span>
<span class="k">template</span><span class="o">&lt;</span><span class="p">&gt;</span>
<span class="k">struct</span> <span class="nc">BinaryType</span><span class="o">&lt;</span><span class="n">CountLength</span><span class="o">&gt;</span>
<span class="p">{</span>
<span class="k">static</span> <span class="kt">int32_t</span> <span class="n">GetTypeId</span><span class="p">()</span>
<span class="p">{</span>
<span class="k">return</span> <span class="n">GetBinaryStringHashCode</span><span class="p">(</span><span class="s">"CountLength"</span><span class="p">);</span>
<span class="p">}</span>
<span class="k">static</span> <span class="kt">void</span> <span class="n">GetTypeName</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&amp;</span> <span class="n">dst</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">dst</span> <span class="o">=</span> <span class="s">"CountLength"</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">static</span> <span class="kt">int32_t</span> <span class="n">GetFieldId</span><span class="p">(</span><span class="k">const</span> <span class="kt">char</span><span class="o">*</span> <span class="n">name</span><span class="p">)</span>
<span class="p">{</span>
<span class="k">return</span> <span class="n">GetBinaryStringHashCode</span><span class="p">(</span><span class="n">name</span><span class="p">);</span>
<span class="p">}</span>
<span class="k">static</span> <span class="kt">int32_t</span> <span class="n">GetHashCode</span><span class="p">(</span><span class="k">const</span> <span class="n">CountLength</span><span class="o">&amp;</span> <span class="n">obj</span><span class="p">)</span>
<span class="p">{</span>
<span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">static</span> <span class="kt">bool</span> <span class="n">IsNull</span><span class="p">(</span><span class="k">const</span> <span class="n">CountLength</span><span class="o">&amp;</span> <span class="n">obj</span><span class="p">)</span>
<span class="p">{</span>
<span class="k">return</span> <span class="nb">false</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">static</span> <span class="kt">void</span> <span class="n">GetNull</span><span class="p">(</span><span class="n">CountLength</span><span class="o">&amp;</span> <span class="n">dst</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">dst</span> <span class="o">=</span> <span class="n">CountLength</span><span class="p">(</span><span class="s">""</span><span class="p">);</span>
<span class="p">}</span>
<span class="k">static</span> <span class="kt">void</span> <span class="n">Write</span><span class="p">(</span><span class="n">BinaryWriter</span><span class="o">&amp;</span> <span class="n">writer</span><span class="p">,</span> <span class="k">const</span> <span class="n">CountLength</span><span class="o">&amp;</span> <span class="n">obj</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">writer</span><span class="p">.</span><span class="n">RawWriter</span><span class="p">().</span><span class="n">WriteString</span><span class="p">(</span><span class="n">obj</span><span class="p">.</span><span class="n">word</span><span class="p">);</span>
<span class="p">}</span>
<span class="k">static</span> <span class="kt">void</span> <span class="n">Read</span><span class="p">(</span><span class="n">BinaryReader</span><span class="o">&amp;</span> <span class="n">reader</span><span class="p">,</span> <span class="n">CountLength</span><span class="o">&amp;</span> <span class="n">dst</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">dst</span><span class="p">.</span><span class="n">word</span> <span class="o">=</span> <span class="n">reader</span><span class="p">.</span><span class="n">RawReader</span><span class="p">().</span><span class="n">ReadString</span><span class="p">();</span>
<span class="p">}</span>
<span class="p">};</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="kt">int</span> <span class="nf">main</span><span class="p">()</span>
<span class="p">{</span>
<span class="n">IgniteConfiguration</span> <span class="n">cfg</span><span class="p">;</span>
<span class="n">cfg</span><span class="p">.</span><span class="n">springCfgPath</span> <span class="o">=</span> <span class="s">"/path/to/configuration.xml"</span><span class="p">;</span>
<span class="n">Ignite</span> <span class="n">ignite</span> <span class="o">=</span> <span class="n">Ignition</span><span class="o">::</span><span class="n">Start</span><span class="p">(</span><span class="n">cfg</span><span class="p">);</span>
<span class="c1">// Get binding instance.</span>
<span class="n">IgniteBinding</span> <span class="n">binding</span> <span class="o">=</span> <span class="n">ignite</span><span class="p">.</span><span class="n">GetBinding</span><span class="p">();</span>
<span class="c1">// Registering our class as a compute function.</span>
<span class="n">binding</span><span class="p">.</span><span class="n">RegisterComputeFunc</span><span class="o">&lt;</span><span class="n">CountLength</span><span class="o">&gt;</span><span class="p">();</span>
<span class="c1">// Get compute instance.</span>
<span class="n">compute</span><span class="o">::</span><span class="n">Compute</span> <span class="n">asyncCompute</span> <span class="o">=</span> <span class="n">ignite</span><span class="p">.</span><span class="n">GetCompute</span><span class="p">();</span>
<span class="n">std</span><span class="o">::</span><span class="n">istringstream</span> <span class="n">iss</span><span class="p">(</span><span class="s">"Count characters using callable"</span><span class="p">);</span>
<span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&gt;</span> <span class="n">words</span><span class="p">((</span><span class="n">std</span><span class="o">::</span><span class="n">istream_iterator</span><span class="o">&lt;</span><span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&gt;</span><span class="p">(</span><span class="n">iss</span><span class="p">)),</span>
<span class="n">std</span><span class="o">::</span><span class="n">istream_iterator</span><span class="o">&lt;</span><span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&gt;</span><span class="p">());</span>
<span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="n">Future</span><span class="o">&lt;</span><span class="kt">int32_t</span><span class="o">&gt;&gt;</span> <span class="n">futures</span><span class="p">;</span>
<span class="c1">// Iterate through all words in the sentence, create and call jobs.</span>
<span class="k">for</span> <span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">word</span> <span class="o">:</span> <span class="n">words</span><span class="p">)</span>
<span class="p">{</span>
<span class="c1">// Counting number of characters remotely.</span>
<span class="n">futures</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="n">asyncCompute</span><span class="p">.</span><span class="n">CallAsync</span><span class="o">&lt;</span><span class="kt">int32_t</span><span class="o">&gt;</span><span class="p">(</span><span class="n">CountLength</span><span class="p">(</span><span class="n">word</span><span class="p">)));</span>
<span class="p">}</span>
<span class="kt">int32_t</span> <span class="n">total</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
<span class="c1">// Counting total number of characters.</span>
<span class="k">for</span> <span class="p">(</span><span class="n">Future</span><span class="o">&lt;</span><span class="kt">int32_t</span><span class="o">&gt;</span> <span class="n">future</span> <span class="o">:</span> <span class="n">futures</span><span class="p">)</span>
<span class="p">{</span>
<span class="c1">// Waiting for results.</span>
<span class="n">future</span><span class="p">.</span><span class="n">Wait</span><span class="p">();</span>
<span class="n">total</span> <span class="o">+=</span> <span class="n">future</span><span class="p">.</span><span class="n">GetValue</span><span class="p">();</span>
<span class="p">}</span>
<span class="c1">// Printing result.</span>
<span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">"Total number of characters: "</span> <span class="o">&lt;&lt;</span> <span class="n">total</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
<span class="p">}</span></code></pre>
</div>
</div></code-tab></code-tabs>
</div>
</div>
</div>
<div class="sect1">
<h2 id="task-execution-timeout">Task Execution Timeout</h2>
<div class="sectionbody">
<div class="paragraph">
<p>You can set a timeout for task execution.
If the task does not finish within the given time frame, it be stopped and all jobs produced by this task are cancelled.</p>
</div>
<div class="paragraph">
<p>To execute a task with a timeout, use the <code>withTimeout(&#8230;&#8203;)</code> method of the compute interface.
The method returns a compute interface that executes the first task given to it in a time-limited manner.
Consequent tasks do not have a timeout: you need to call <code>withTimeout(&#8230;&#8203;)</code> for every task that should have a timeout.</p>
</div>
<code-tabs><code-tab data-tab='Java'><div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="java"><span class="nc">IgniteCompute</span> <span class="n">compute</span> <span class="o">=</span> <span class="n">ignite</span><span class="o">.</span><span class="na">compute</span><span class="o">();</span>
<span class="n">compute</span><span class="o">.</span><span class="na">withTimeout</span><span class="o">(</span><span class="mi">300_000</span><span class="o">).</span><span class="na">run</span><span class="o">(()</span> <span class="o">-&gt;</span> <span class="o">{</span>
<span class="c1">// your computation</span>
<span class="c1">// ...</span>
<span class="o">});</span></code></pre>
</div>
</div></code-tab></code-tabs>
</div>
</div>
<div class="sect1">
<h2 id="sharing-state-between-jobs-on-local-node">Sharing State Between Jobs on Local Node</h2>
<div class="sectionbody">
<div class="paragraph">
<p>It is often useful to share a state between different compute jobs executed on one node. For this purpose, there is a shared concurrent local map available on each node.</p>
</div>
<code-tabs><code-tab data-tab='Java'><div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="java"><span class="nc">IgniteCluster</span> <span class="n">cluster</span> <span class="o">=</span> <span class="n">ignite</span><span class="o">.</span><span class="na">cluster</span><span class="o">();</span>
<span class="nc">ConcurrentMap</span><span class="o">&lt;</span><span class="nc">String</span><span class="o">,</span> <span class="nc">Integer</span><span class="o">&gt;</span> <span class="n">nodeLocalMap</span> <span class="o">=</span> <span class="n">cluster</span><span class="o">.</span><span class="na">nodeLocalMap</span><span class="o">();</span></code></pre>
</div>
</div></code-tab><code-tab data-tab='C#/.NET' data-unavailable='true'><div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code>This API is not presently available for C#/.NET.</code></pre>
</div>
</div></code-tab><code-tab data-tab='C++' data-unavailable='true'><div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code>This API is not presently available for C++.</code></pre>
</div>
</div></code-tab></code-tabs>
<div class="paragraph">
<p>Node-local values are similar to thread local variables in that these values are not distributed and kept only on the local node.
Node-local data can be used to share the state between compute jobs.
It can also be used by deployed services.</p>
</div>
<div class="paragraph">
<p>In the following example, a job increments a node-local counter every time it executes on some node. As a result, the node-local counter on each node tells us how many times the job has executed on that node.</p>
</div>
<code-tabs><code-tab data-tab='Java'><div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="java"><span class="nc">IgniteCallable</span><span class="o">&lt;</span><span class="nc">Long</span><span class="o">&gt;</span> <span class="n">job</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">IgniteCallable</span><span class="o">&lt;</span><span class="nc">Long</span><span class="o">&gt;()</span> <span class="o">{</span>
<span class="nd">@IgniteInstanceResource</span>
<span class="kd">private</span> <span class="nc">Ignite</span> <span class="n">ignite</span><span class="o">;</span>
<span class="nd">@Override</span>
<span class="kd">public</span> <span class="nc">Long</span> <span class="nf">call</span><span class="o">()</span> <span class="o">{</span>
<span class="c1">// Get a reference to node local.</span>
<span class="nc">ConcurrentMap</span><span class="o">&lt;</span><span class="nc">String</span><span class="o">,</span> <span class="nc">AtomicLong</span><span class="o">&gt;</span> <span class="n">nodeLocalMap</span> <span class="o">=</span> <span class="n">ignite</span><span class="o">.</span><span class="na">cluster</span><span class="o">().</span><span class="na">nodeLocalMap</span><span class="o">();</span>
<span class="nc">AtomicLong</span> <span class="n">cntr</span> <span class="o">=</span> <span class="n">nodeLocalMap</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="s">"counter"</span><span class="o">);</span>
<span class="k">if</span> <span class="o">(</span><span class="n">cntr</span> <span class="o">==</span> <span class="kc">null</span><span class="o">)</span> <span class="o">{</span>
<span class="nc">AtomicLong</span> <span class="n">old</span> <span class="o">=</span> <span class="n">nodeLocalMap</span><span class="o">.</span><span class="na">putIfAbsent</span><span class="o">(</span><span class="s">"counter"</span><span class="o">,</span> <span class="n">cntr</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">AtomicLong</span><span class="o">());</span>
<span class="k">if</span> <span class="o">(</span><span class="n">old</span> <span class="o">!=</span> <span class="kc">null</span><span class="o">)</span>
<span class="n">cntr</span> <span class="o">=</span> <span class="n">old</span><span class="o">;</span>
<span class="o">}</span>
<span class="k">return</span> <span class="n">cntr</span><span class="o">.</span><span class="na">incrementAndGet</span><span class="o">();</span>
<span class="o">}</span>
<span class="o">};</span></code></pre>
</div>
</div></code-tab><code-tab data-tab='C#/.NET' data-unavailable='true'><div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code>This API is not presently available for C#/.NET.</code></pre>
</div>
</div></code-tab><code-tab data-tab='C++' data-unavailable='true'><div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code>This API is not presently available for C++.</code></pre>
</div>
</div></code-tab></code-tabs>
</div>
</div>
<div class="sect1">
<h2 id="accessing-data-from-computational-tasks">Accessing Data from Computational Tasks</h2>
<div class="sectionbody">
<div class="paragraph">
<p>If your computational task needs to access the data stored in caches, you can do it via the instance of <code>Ignite</code>:</p>
</div>
<code-tabs><code-tab data-tab='Java'><div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="java"><span class="kd">public</span> <span class="kd">class</span> <span class="nc">MyCallableTask</span> <span class="kd">implements</span> <span class="nc">IgniteCallable</span><span class="o">&lt;</span><span class="nc">Integer</span><span class="o">&gt;</span> <span class="o">{</span>
<span class="nd">@IgniteInstanceResource</span>
<span class="kd">private</span> <span class="nc">Ignite</span> <span class="n">ignite</span><span class="o">;</span>
<span class="nd">@Override</span>
<span class="kd">public</span> <span class="nc">Integer</span> <span class="nf">call</span><span class="o">()</span> <span class="kd">throws</span> <span class="nc">Exception</span> <span class="o">{</span>
<span class="nc">IgniteCache</span><span class="o">&lt;</span><span class="nc">Long</span><span class="o">,</span> <span class="nc">Person</span><span class="o">&gt;</span> <span class="n">cache</span> <span class="o">=</span> <span class="n">ignite</span><span class="o">.</span><span class="na">cache</span><span class="o">(</span><span class="s">"person"</span><span class="o">);</span>
<span class="c1">// Get the data you need</span>
<span class="nc">Person</span> <span class="n">person</span> <span class="o">=</span> <span class="n">cache</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="mi">1L</span><span class="o">);</span>
<span class="c1">// do with the data what you need to do</span>
<span class="k">return</span> <span class="mi">1</span><span class="o">;</span>
<span class="o">}</span>
<span class="o">}</span></code></pre>
</div>
</div></code-tab><code-tab data-tab='C#/.NET'><div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="csharp"><span class="k">class</span> <span class="nc">FuncWithDataAccess</span> <span class="p">:</span> <span class="n">IComputeFunc</span><span class="p">&lt;</span><span class="kt">int</span><span class="p">&gt;</span>
<span class="p">{</span>
<span class="p">[</span><span class="n">InstanceResource</span><span class="p">]</span> <span class="k">private</span> <span class="n">IIgnite</span> <span class="n">_ignite</span><span class="p">;</span>
<span class="k">public</span> <span class="kt">int</span> <span class="nf">Invoke</span><span class="p">()</span>
<span class="p">{</span>
<span class="kt">var</span> <span class="n">cache</span> <span class="p">=</span> <span class="n">_ignite</span><span class="p">.</span><span class="n">GetCache</span><span class="p">&lt;</span><span class="kt">int</span><span class="p">,</span> <span class="kt">string</span><span class="p">&gt;(</span><span class="s">"someCache"</span><span class="p">);</span>
<span class="c1">// get the data you need</span>
<span class="kt">string</span> <span class="n">cached</span> <span class="p">=</span> <span class="n">cache</span><span class="p">.</span><span class="nf">Get</span><span class="p">(</span><span class="m">1</span><span class="p">);</span>
<span class="c1">// do with data what you need to do, for example:</span>
<span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="n">cached</span><span class="p">);</span>
<span class="k">return</span> <span class="m">1</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span></code></pre>
</div>
</div></code-tab><code-tab data-tab='C++'><div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="cpp"><span class="cm">/*
* Function class.
*/</span>
<span class="k">class</span> <span class="nc">GetValue</span> <span class="o">:</span> <span class="k">public</span> <span class="n">compute</span><span class="o">::</span><span class="n">ComputeFunc</span><span class="o">&lt;</span><span class="kt">void</span><span class="o">&gt;</span>
<span class="p">{</span>
<span class="k">friend</span> <span class="k">struct</span> <span class="nc">ignite</span><span class="o">::</span><span class="n">binary</span><span class="o">::</span><span class="n">BinaryType</span><span class="o">&lt;</span><span class="n">GetValue</span><span class="o">&gt;</span><span class="p">;</span>
<span class="nl">public:</span>
<span class="cm">/*
* Default constructor.
*/</span>
<span class="n">GetValue</span><span class="p">()</span>
<span class="p">{</span>
<span class="c1">// No-op.</span>
<span class="p">}</span>
<span class="cm">/**
* Callback.
*/</span>
<span class="k">virtual</span> <span class="kt">void</span> <span class="n">Call</span><span class="p">()</span>
<span class="p">{</span>
<span class="n">Ignite</span><span class="o">&amp;</span> <span class="n">node</span> <span class="o">=</span> <span class="n">GetIgnite</span><span class="p">();</span>
<span class="c1">// Get the data you need</span>
<span class="n">Cache</span><span class="o">&lt;</span><span class="kt">int64_t</span><span class="p">,</span> <span class="n">Person</span><span class="o">&gt;</span> <span class="n">cache</span> <span class="o">=</span> <span class="n">node</span><span class="p">.</span><span class="n">GetCache</span><span class="o">&lt;</span><span class="kt">int64_t</span><span class="p">,</span> <span class="n">Person</span><span class="o">&gt;</span><span class="p">(</span><span class="s">"person"</span><span class="p">);</span>
<span class="c1">// do with the data what you need to do</span>
<span class="n">Person</span> <span class="n">person</span> <span class="o">=</span> <span class="n">cache</span><span class="p">.</span><span class="n">Get</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">};</span></code></pre>
</div>
</div></code-tab></code-tabs>
<div class="paragraph">
<p>Note that the example shown above may not be the most effective way.
The reason is that the person object that corresponds to key <code>1</code> may be located on a node that is different from the node where the task is executed.
In this case, the object is fetched via network. This can be avoided by <a href="/docs/latest/collocated-computations">colocating the task with the data</a>.</p>
</div>
<div class="admonitionblock caution">
<table>
<tr>
<td class="icon">
<div class="title">Caution</div>
</td>
<td class="content">
<div class="paragraph">
<p>If you want to use the key and value objects inside <code>IgniteCallable</code> and <code>IgniteRunnable</code> tasks, make sure the key and value classes are deployed on all cluster nodes.</p>
</div>
</td>
</tr>
</table>
</div>
</div>
</div>
<div class="copyright">
© 2020 The Apache Software Foundation.<br/>
Apache, Apache Ignite, the Apache feather and the Apache Ignite logo are either registered trademarks or trademarks of The Apache Software Foundation.
</div>
</article>
<nav class="right-nav" data-swiftype-index='false'>
<ul class="sectlevel1">
<li><a href="#getting-the-compute-interface">Getting the Compute Interface</a></li>
<li><a href="#specifying-the-set-of-nodes-for-computations">Specifying the Set of Nodes for Computations</a></li>
<li><a href="#executing-tasks">Executing Tasks</a>
<ul class="sectlevel2">
<li><a href="#executing-a-runnable-task">Executing a Runnable Task</a></li>
<li><a href="#executing-a-callable-task">Executing a Callable Task</a></li>
<li><a href="#executing-an-igniteclosure">Executing an IgniteClosure</a></li>
<li><a href="#broadcasting-a-task">Broadcasting a Task</a></li>
<li><a href="#asynchronous-execution">Asynchronous Execution</a></li>
</ul>
</li>
<li><a href="#task-execution-timeout">Task Execution Timeout</a></li>
<li><a href="#sharing-state-between-jobs-on-local-node">Sharing State Between Jobs on Local Node</a></li>
<li><a href="#accessing-data-from-computational-tasks">Accessing Data from Computational Tasks</a></li>
</ul>
<footer>
</footer>
</nav>
</section>
<script type='module' src='/assets/js/code-copy-to-clipboard.js' async crossorigin></script>
<script>
// inits deep anchors -- needs to be done here because of https://www.bryanbraun.com/anchorjs/#dont-run-it-too-late
anchors.add('.page-docs h1, .page-docs h2, .page-docs h3:not(.discrete), .page-docs h4, .page-docs h5');
anchors.options = {
placement: 'right',
visible: 'always'
};
</script>
<!-- load google fonts async -->
<script type="text/javascript">
WebFontConfig = {
google: { families: [ 'Open+Sans:300,400,600,700&display=swap' ] }
};
(function() {
var wf = document.createElement('script');
wf.src = 'https://ajax.googleapis.com/ajax/libs/webfont/1/webfont.js';
wf.type = 'text/javascript';
wf.async = 'true';
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(wf, s);
})(); </script>
<script src="https://cdn.jsdelivr.net/npm/docsearch.js@2/dist/cdn/docsearch.min.js"></script>
<script>
docsearch({
// Your apiKey and indexName will be given to you once
// we create your config
apiKey: '3eee686c0ebe39eff3baeb18c56fa5f8',
indexName: 'apache_ignite',
// Replace inputSelector with a CSS selector
// matching your search input
inputSelector: '#search-input',
// algoliaOptions: { 'facetFilters': ["version:$VERSION"] },
// Set debug to true to inspect the dropdown
debug: false,
});
</script>
<script type='module' src='/assets/js/index.js?1600372552' async crossorigin></script>
<script type='module' src='/assets/js/versioning.js?1600372552' async crossorigin></script>
</body>
</html>