Apache Ignite
Distributed database, caching, and processing platform. Integrates SQL, NoSQL, and computing with memory-centric approach. ACID and transaction support.
Apache Ignite
Apache Ignite is a unified in-memory computing platform that functions as a distributed database, caching, and processing platform. It integrates SQL, NoSQL, and computing with a memory-centric approach while supporting ACID-compliant transaction processing.
Overview
Apache Ignite is an in-memory platform with modular architecture designed for high-performance distributed computing and data storage. With rapidly expanding adoption in big data processing and real-time analytics, it maintains high reliability as an Apache Software Foundation top-level project. Beyond traditional cache solutions, it serves as a comprehensive platform that can function as a complete database.
Features
Key Capabilities
Apache Ignite provides the following core functionalities:
- Unified Platform: Integrates database, cache, and compute processing in a single platform
- ACID Compliant: Supports full ACID-compliant transaction processing
- SQL Support: Supports both standard SQL queries and NoSQL key-value operations
- Distributed Architecture: Achieves horizontal scaling and high availability
- Persistence: Can persist in-memory data to disk
- Machine Learning: Provides in-memory machine learning algorithms
Architecture
Apache Ignite's core architecture consists of the following main layers:
- IgniteKernal: Main implementation of Ignite API and lifecycle control
- GridKernalContext: Central context for all managers and processors
- Managers: Node discovery, communication, deployment, event management
- Processors: Specific functions like cache management, query processing, service management
Performance Characteristics
- Ultra-fast data access through in-memory processing
- Scalability to hundreds of nodes
- Low-latency real-time processing
- High throughput through distributed data grid
Pros and Cons
Advantages
- Unified Platform: Integrates database, cache, and compute processing in one solution
- High Performance: Extremely fast data access and processing through in-memory operation
- Enterprise Features: Meets enterprise requirements with ACID compliance, transactions, SQL support
- High Scalability: Horizontal scaling possible to hundreds of nodes
- Rich Functionality: Advanced features like machine learning, stream processing, distributed computing
- Strong Reliability: Stability as an Apache Software Foundation project
Disadvantages
- Complexity: Configuration and operational complexity due to rich features
- Memory Requirements: Requires large memory resources
- Learning Curve: Time-consuming to master due to extensive features
- Java Dependency: Requires Java environment with high runtime dependencies
- Operational Difficulty: Challenging to manage as a distributed system
- Resource Consumption: Higher CPU and memory usage than other cache solutions
References
Code Examples
Installation and Setup
# Download Apache Ignite binary
wget https://archive.apache.org/dist/ignite/2.16.0/apache-ignite-2.16.0-bin.zip
unzip apache-ignite-2.16.0-bin.zip
cd apache-ignite-2.16.0-bin
# Set environment variables
export IGNITE_HOME=/path/to/apache-ignite-2.16.0-bin
export PATH=$IGNITE_HOME/bin:$PATH
# Start Ignite node
$IGNITE_HOME/bin/ignite.sh
# Or start with configuration file
$IGNITE_HOME/bin/ignite.sh config/default-config.xml
Basic Cache Operations (Java)
import org.apache.ignite.Ignite;
import org.apache.ignite.IgniteCache;
import org.apache.ignite.Ignition;
import org.apache.ignite.configuration.CacheConfiguration;
import org.apache.ignite.configuration.IgniteConfiguration;
public class IgniteCacheExample {
public static void main(String[] args) {
// Create Ignite configuration
IgniteConfiguration cfg = new IgniteConfiguration();
cfg.setClientMode(false); // Server mode
// Cache configuration
CacheConfiguration<Integer, String> cacheCfg = new CacheConfiguration<>("myCache");
cacheCfg.setIndexedTypes(Integer.class, String.class);
cfg.setCacheConfiguration(cacheCfg);
// Start Ignite node
try (Ignite ignite = Ignition.start(cfg)) {
// Get cache
IgniteCache<Integer, String> cache = ignite.cache("myCache");
// Insert data
cache.put(1, "Hello, Ignite!");
cache.put(2, "Apache Ignite is awesome");
// Retrieve data
String value1 = cache.get(1);
String value2 = cache.get(2);
System.out.println("Key 1: " + value1);
System.out.println("Key 2: " + value2);
// Display all keys
cache.forEach((key, value) -> {
System.out.println("Key: " + key + ", Value: " + value);
});
}
}
}
SQL Query Execution
import org.apache.ignite.cache.query.SqlFieldsQuery;
import java.util.List;
// Create SQL table
cache.query(new SqlFieldsQuery(
"CREATE TABLE IF NOT EXISTS Person (" +
"id INT PRIMARY KEY, " +
"name VARCHAR, " +
"age INT)"
)).getAll();
// Insert data
cache.query(new SqlFieldsQuery(
"INSERT INTO Person (id, name, age) VALUES (?, ?, ?)")
.setArgs(1, "John Doe", 30)
).getAll();
cache.query(new SqlFieldsQuery(
"INSERT INTO Person (id, name, age) VALUES (?, ?, ?)")
.setArgs(2, "Jane Smith", 25)
).getAll();
// Execute SQL query
List<List<?>> results = cache.query(new SqlFieldsQuery(
"SELECT name, age FROM Person WHERE age > ?")
.setArgs(20)
).getAll();
// Display results
for (List<?> row : results) {
System.out.println("Name: " + row.get(0) + ", Age: " + row.get(1));
}
Persistence Configuration
import org.apache.ignite.configuration.DataRegionConfiguration;
import org.apache.ignite.configuration.DataStorageConfiguration;
// Data storage configuration
DataStorageConfiguration dataStorageCfg = new DataStorageConfiguration();
// Enable persistence for default data region
DataRegionConfiguration defaultRegion = new DataRegionConfiguration();
defaultRegion.setName("Default_Region");
defaultRegion.setPersistenceEnabled(true);
defaultRegion.setMaxSize(100L * 1024 * 1024); // 100 MB
dataStorageCfg.setDefaultDataRegionConfiguration(defaultRegion);
// WAL (Write-Ahead Log) configuration
dataStorageCfg.setWalMode(WALMode.LOG_ONLY);
dataStorageCfg.setWalSegmentSize(64 * 1024 * 1024); // 64 MB
// Add to Ignite configuration
IgniteConfiguration cfg = new IgniteConfiguration();
cfg.setDataStorageConfiguration(dataStorageCfg);
// Start Ignite node and enable persistence
try (Ignite ignite = Ignition.start(cfg)) {
// Enable persistence (required only on first start)
ignite.cluster().state(ClusterState.ACTIVE);
System.out.println("Ignite with persistence enabled");
}
Distributed Computing
import org.apache.ignite.compute.ComputeJob;
import org.apache.ignite.compute.ComputeJobResult;
import org.apache.ignite.compute.ComputeTask;
import java.util.Collection;
import java.util.List;
import java.util.Map;
// Define distributed computation task
public class DistributedWordCountTask extends ComputeTask<String, Integer> {
@Override
public Map<? extends ComputeJob, ClusterNode> map(
List<ClusterNode> nodes, String text) {
Map<ComputeJob, ClusterNode> map = new HashMap<>();
String[] words = text.split(" ");
int wordsPerNode = words.length / nodes.size();
for (int i = 0; i < nodes.size(); i++) {
int startIdx = i * wordsPerNode;
int endIdx = (i == nodes.size() - 1) ? words.length : (i + 1) * wordsPerNode;
String[] nodeWords = Arrays.copyOfRange(words, startIdx, endIdx);
map.put(new WordCountJob(nodeWords), nodes.get(i));
}
return map;
}
@Override
public Integer reduce(List<ComputeJobResult> results) {
int totalWords = 0;
for (ComputeJobResult result : results) {
totalWords += result.<Integer>getData();
}
return totalWords;
}
private static class WordCountJob implements ComputeJob {
private String[] words;
public WordCountJob(String[] words) {
this.words = words;
}
@Override
public Integer execute() {
return words.length;
}
@Override
public void cancel() {
// Cancellation handling
}
}
}
// Execute distributed computation
String text = "Apache Ignite is a powerful distributed computing platform";
Integer wordCount = ignite.compute().execute(DistributedWordCountTask.class, text);
System.out.println("Total word count: " + wordCount);
Cluster Configuration
import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi;
import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;
// Configure cluster discovery
TcpDiscoverySpi discoverySpi = new TcpDiscoverySpi();
TcpDiscoveryVmIpFinder ipFinder = new TcpDiscoveryVmIpFinder();
ipFinder.setAddresses(Arrays.asList(
"192.168.1.100:47500..47509",
"192.168.1.101:47500..47509",
"192.168.1.102:47500..47509"
));
discoverySpi.setIpFinder(ipFinder);
IgniteConfiguration cfg = new IgniteConfiguration();
cfg.setDiscoverySpi(discoverySpi);
// Set cluster name
cfg.setIgniteInstanceName("my-ignite-cluster");
// Network configuration
cfg.setLocalHost("192.168.1.100");
cfg.setWorkDirectory("/opt/ignite/work");
try (Ignite ignite = Ignition.start(cfg)) {
System.out.println("Cluster started. Topology: " +
ignite.cluster().nodes().size() + " nodes");
// Display cluster information
for (ClusterNode node : ignite.cluster().nodes()) {
System.out.println("Node: " + node.id() +
", Address: " + node.addresses());
}
}
Basic Machine Learning Example
import org.apache.ignite.ml.dataset.DatasetBuilder;
import org.apache.ignite.ml.dataset.impl.local.LocalDatasetBuilder;
import org.apache.ignite.ml.math.primitives.vector.Vector;
import org.apache.ignite.ml.preprocessing.Preprocessor;
import org.apache.ignite.ml.selection.scoring.evaluator.Evaluator;
import org.apache.ignite.ml.tree.DecisionTreeClassificationTrainer;
// Prepare data
Map<Integer, Vector> data = new HashMap<>();
data.put(0, VectorUtils.of(1.0, 2.0));
data.put(1, VectorUtils.of(2.0, 3.0));
data.put(2, VectorUtils.of(3.0, 1.0));
// Prepare labels
Map<Integer, Double> labels = new HashMap<>();
labels.put(0, 1.0);
labels.put(1, 1.0);
labels.put(2, 0.0);
// Train decision tree classifier
DecisionTreeClassificationTrainer trainer = new DecisionTreeClassificationTrainer(5, 0);
DecisionTreeModel model = trainer.fit(
ignite,
cache,
(k, v) -> VectorUtils.of(/* feature extraction */),
(k, v) -> /* label extraction */ 1.0
);
// Execute prediction
Vector newData = VectorUtils.of(2.5, 2.5);
Double prediction = model.predict(newData);
System.out.println("Prediction: " + prediction);
Apache Ignite, with its comprehensive feature set, serves as a powerful solution for various use cases ranging from simple caching to complex distributed databases and machine learning platforms.