Apache Ignite: Programmierung

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. 

Seminare zum Thema

Dr. Rainer Sawitzki / Dr. Rainer Sawitzki

Nach seinem Studium der Physik und anschließender Promotion Wechsel in die IT-Branche. Seit mehr als 20 Jahren als Entwickler, Berater und Projektleiter vorwiegend im Bereich Java und JavaScript unterwegs. Parallel dazu in der Entwicklung und Durchführung von hochwertigen Seminaren für die Integrata im Einsatz.

Schreibe einen Kommentar