Der Zugriff auf das Apache Ignite-Grid kann über verschiedene Protokolle erfolgen. Dazu werden Treiber-Bibliotheken für verschiedene Programmiersprachen angeboten. Daneben ist auch ein REST-API vorgesehen.
Nachdem Ignite selbst in Java realisiert ist bietet es sich an, auch für Client-Anwendungen die Java-Plattform zu benutzen.
Direkter Zugriff auf einen Cache
Das Ansprechen eines Caches ist aus Sicht eines Programmierers nichts anderes als ein Map
-Zugriff. Folglich ist das folgende Programm, das den Beispielprogrammen der Ignite-Community auf GitHub entnommen wurde, sehr trivial:
public class ClientPutGetExample {
public static void main(String[] args) {
ClientConfiguration cfg = new ClientConfiguration().setAddresses("127.0.0.1:10800");
try (IgniteClient igniteClient = Ignition.startClient(cfg)) {
final String CACHE_NAME = "put-get-example";
ClientCache cache = igniteClient.getOrCreateCache(CACHE_NAME);
Integer key = 1;
Address val = new Address("1545 Jackson Street", 94612);
cache.put(key, val);
Address cachedVal = cache.get(key);
System.out.println("Found address: " + cachedVal);
}
catch (ClientException e) {
System.err.println(e.getMessage());
}
catch (Exception e) {
System.err.format("Unexpected failure: %s\n", e);
}
}
}
Das SQL-Grid
Obwohl Ignite ein Key-Value-Store ist werden auch SQL-Abfragen unterstützt. Für die Java-Programmierung stellt sich Ignite damit als relationales Datenbank-System dar, das über einen JDBC-Treiber angesprochen wird:
public class SqlJdbcExample {
public static void main(String[] args) throws Exception {
try (Connection conn = DriverManager.getConnection("jdbc:ignite:thin://127.0.0.1/")) {
try (Statement stmt = conn.createStatement()) {
stmt.executeUpdate("CREATE TABLE city (id LONG PRIMARY KEY, name VARCHAR) " +
"WITH \"template=replicated\"");
stmt.executeUpdate("CREATE TABLE person (id LONG, name VARCHAR, city_id LONG, " +
"PRIMARY KEY (id, city_id)) WITH \"backups=1, affinity_key=city_id\"");
stmt.executeUpdate("CREATE INDEX on Person (city_id)");
}
try (PreparedStatement stmt = conn.prepareStatement("INSERT INTO city (id, name) VALUES (?, ?)")) {
stmt.setLong(1, 1L);
stmt.setString(2, "Forest Hill");
stmt.executeUpdate();
stmt.setLong(1, 2L);
stmt.setString(2, "Denver");
stmt.executeUpdate();
stmt.setLong(1, 3L);
stmt.setString(2, "St. Petersburg");
stmt.executeUpdate();
}
// Populate Person table with PreparedStatement.
try (PreparedStatement stmt =
conn.prepareStatement("INSERT INTO person (id, name, city_id) values (?, ?, ?)")) {
stmt.setLong(1, 1L);
stmt.setString(2, "John Doe");
stmt.setLong(3, 3L);
stmt.executeUpdate();
stmt.setLong(1, 2L);
stmt.setString(2, "Jane Roe");
stmt.setLong(3, 2L);
stmt.executeUpdate();
stmt.setLong(1, 3L);
stmt.setString(2, "Mary Major");
stmt.setLong(3, 1L);
stmt.executeUpdate();
stmt.setLong(1, 4L);
stmt.setString(2, "Richard Miles");
stmt.setLong(3, 2L);
stmt.executeUpdate();
}
try (Statement stmt = conn.createStatement()) {
try (ResultSet rs =
stmt.executeQuery("SELECT p.name, c.name FROM Person p INNER JOIN City c on c.id = p.city_id")) {
while (rs.next())
System.out.println(rs.getString(1) + ", " + rs.getString(2));
}
}
try (Statement stmt = conn.createStatement()) {
stmt.executeUpdate("DROP TABLE Person");
stmt.executeUpdate("DROP TABLE City");
}
}
}
}
Zu beachten ist, dass die Ablage der Daten immer noch in einem Key-Value-Store erfolgt: Die „Tabellen“ sind damit Caches!
Weitere Grids
Ignite bietet noch weitere Grids an:
- Das Compute-Grid ermöglicht die Ausführung einer beliebigen Programm-Sequenz auf den Knoten des Ignite-Clusters. Dazu überträgt der Java-Client beispielsweise eine Lambda-Funktion oder ein
Runnable
-Objekt. Typischerweise sind diese Programme als Map-Reduce-Funktionen ausgebildet, die auf den in den Caches gespeicherten Daten operieren. - Mit dem Service-Grid werden auf den Cluster Services installiert. Damit wird Ignite faktisch zu einem Applikationsserver.
- Eine Sonderform des Compute-Grids ist Machine Learning: Die dazu benötigten Algorithmen werden als Bestandteil der Ignite-Distribution fertig implementiert zur Verfügung gestellt.