Edgent provides an programming model and runtime for executing streaming analytics at the edge.

Apache Edgent is an effort undergoing incubation at The Apache Software Foundation (ASF), sponsored by Apache Incubator PMC. Incubation is required of all newly accepted projects until a further review indicates that the infrastructure, communications, and decision making process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.

Edgent

  1. Overview
  2. Programming Model
  3. Getting Started

Overview

Edgent provides an programming model and runtime for executing streaming analytics at the edge. Edgent is focusing on two edge cases: In both cases Edgent applications analyze live data and send results of that analytics and/or data intermittently to back-end systems for deeper analysis. An Edgent application can use analytics to decide when to send information to back-end systems, such as when the behaviour of the system is outside normal parameters (e.g. an engine running too hot).
Edgent applications do not send data continually to back-end systems as the cost of communication may be high (e.g. cellular networks) or bandwidth may be limited.

Edgent applications communicate with back-end systems through some form of message hub as there may be millions of edge devices. Edgent supports these message hubs:

Back-end analytic systems are used to perform analysis on information from Edgent applications that cannot be performed at the edge. Such analysis may be:


Back-end systems can interact or control devices based upon their analytics, by sending commands to specific devices, e.g. reduce maximum engine revs to reduce chance of failure before the next scheduled service, or send an alert of an accident ahead.

Programming Model

Edgent applications are streaming applications in which each tuple (data item or event) in a stream of data is processed as it occurs. Additionally, you can process windows (logical subsets) of data. For example, you could analyze the last 90 seconds of data from a sensor to identify trends in the data

Topology functional API

Overview

The primary api is {@link org.apache.edgent.topology.Topology} which uses a functional model to build a topology of {@link org.apache.edgent.topology.TStream streams} for an application.
{@link org.apache.edgent.topology.TStream TStream} is a declaration of a stream of tuples, an application will create streams that source data (e.g. sensor readings) and then apply functions that transform those streams into derived streams, for example simply filtering a stream containg engine temperator readings to a derived stream that only contains readings thar are greater than 100°C.
An application terminates processing for a stream by sinking it. Sinking effectively terminates a stream by applying processing to each tuple on the stream (as it occurs) that does not produce a result. Typically this sinking is transmitting the tuple to an external system, for example the messgae hub to send the data to a back-end system, or locally sending the data to a user interface.

This programming style is typical for streaming systems and similar APIs are supported by systems such as Apache Flink, Apache Spark Streaming, IBM Streams and Java 8 streams.

Functions

Edgent supports Java 8 and it is encouraged to use Java 8 as functions can be easily and clearly written using lambda expressions.

Arbitrary Topology

Simple applications may just be a pipeline of streams, for example, logically:
{@code source --> filter --> transform --> aggregate --> send to MQTT}
However Edgent allows arbitrary topologies including:

Graph API

Overview

The {@link org.apache.edgent.graph.Graph graph} API is a lower-level API that the topology api is built on top of. A graph consists of {@link org.apache.edgent.oplet.Oplet oplet} invocations connected by streams. The oplet invocations contain the processing applied to each tuple on streams connected to their input ports. Processing by the oplet submits tuples to its output ports for subsequent processing by downstream connected oplet invocations.

Getting Started

Below, {@code } refers to an Edgent release's platform target directory such as {@code .../edgent/java8}.

A number of sample Java applications are provided that demonstrate use of Edgent.
The Java code for the samples is under {@code /samples}.

Shell scripts to run the samples are {@code /scripts}. See the {@code README} there.

Summary of samples:
SampleDescriptionFocus
{@link org.apache.edgent.samples.topology.HelloEdgent} Prints Hello Edgent! to standard output. Basic mechanics of declaring a topology and executing it.
{@link org.apache.edgent.samples.topology.PeriodicSource} Polls a random number generator for a new value every second and then prints out the raw value and a filtered and transformed stream. Polling of a data value to create a source stream.
{@link org.apache.edgent.samples.topology.SensorsAggregates} Demonstrates partitioned aggregation and filtering of simulated sensors that are bursty in nature, so that only intermittently is the data output to {@code System.out} Simulated sensors with windowed aggregation
{@link org.apache.edgent.samples.topology.SimpleFilterTransform}
File Write a stream of tuples to files. Watch a directory for new files and create a stream of tuples from the file contents. Use of the File stream connector
IotfSensors, IotfQuickstart Sends simulated sensor readings to an IBM Watson IoT Platform instance as device events. Use of the IBM Watson IoT Platform connector to send device events and receive device commands.
JDBC Write a stream of tuples to an Apache Derby database table. Create a stream of tuples by reading a table. Use of the JDBC stream connector
Kafka Publish a stream of tuples to a Kafka topic. Create a stream of tuples by subscribing to a topic and receiving messages from it. Use of the Kafka stream connector
MQTT Publish a stream of tuples to a MQTT topic. Create a stream of tuples by subscribing to a topic and receiving messages from it. Use of the MQTT stream connector
SensorAnalytics Demonstrates a Sensor Analytics application that includes: configuration control, a device of one or more sensors and some typical analytics, use of MQTT for publishing results and receiving commands, local results logging, conditional stream tracing. A more complete sample application demonstrating common themes.

Other samples are also provided but have not yet been fully documented. Feel free to explore them.

Building Applications

You need to include one or more Edgent jars in your {@code classpath} depending on what features your application uses.

Include one or more of the topology providers:

Include the jar of any Edgent connector you use: [*] You also need to include a {@code javax.websocket} client implementation if you use the {@code wsclient} connector. Include the following to use an Eclipse Jetty based implementation:

Include jars for any Edgent analytic features you use:

Include jars for any Edgent utility features you use: Edgent uses slf4j for logging, leaving the decision of the actual logging implementation to your application (e.g., {@code java.util.logging} or {@code log4j}). For {@code java.util.logging} you can include: