Hazelcast Cloud is an enterprise-grade in-memory computing platform deployed and managed by the Hazelcast CloudOps team. The service
is powered by Hazelcast IMDG Enterprise HD and leverages widely adopted technologies, such as Docker and Kubernetes, to provide dynamic orchestration and containerization. Hazelcast Cloud supports applications developed in some of the most common languages, including Java, Node.js, Python. Go, and .NET.
Hazelcast Cloud delivers enterprise-grade Hazelcast software in the cloud, deployed as a fully managed service. Leveraging over a decade of experience and best practices, Hazelcast Cloud delivers a high-throughput, low-latency service that scales to your needs while remaining simple to deploy. If you’re considering moving to the Cloud, or are looking for an easy ramp on deploying in-memory technology, this white paper on migrating in-memory to the cloud is an informative and helpful resource.
Setting up servers and configuring software can get in the way of the problems you are trying to solve. With Hazelcast Cloud we take all of those pain points away.
Join this webinar on April 11th at 8:00 am PT / 11:00 am ET / 4:00 pm GMT to learn how you can instantly fire up and then work with Hazelcast Cloud from anywhere in the world. With our auto-generated client stubs for Java, Go, Node.js, Python and .NET, we can have you connected and coding in less than a minute!
Get a 30-day free trial.
Get started today with the
industry’s leading in-memory computing platform.
The in-memory speed you count on, with the convenience and scalability of cloud.
The streaming benchmark is intended to measure the latency overhead for a streaming system under different conditions such as message rate and window size. It compares Hazelcast Jet, Apache Flink, and Apache Spark Streaming.
Summary of Findings
The streaming benchmark is based on a stock exchange aggregation. Each message representing a trade is published to Kafka and then a simple windowed aggregation which calculates the number of traders per ticker symbol is done using various data processing frameworks.
The latency is measured as the delay between the earliest time we could have received results for the window the event is in, and the actual time the result was received.
For example, if we want the result for events happening between 12:00:00.000 and 12:00:01.000, theoretically, the earliest time we can get an aggregated result is at 12:00:01.000. However, this does not take into account that events happening at 12:00:00.999 might not reach the system immediately and there also can be some out of orderness due to partitioning (Kafka only guarantees ordering by partition).
As a solution, we need to allow for some delay to allow all the events to reach the system. If the delay is configured as one second, we should wait until receiving an event with timestamp 12:00:02 before we can compute the window for events that happened between 12:00:00-12:00:01. Based on this, the earliest time we can get a result will be the time when we received an event with a timestamp 12:00:02.000. If the system’s actual output happens at 12:00.02.100, then we define the latency as 100ms. This latency includes all of the following:
Each framework is expected to output tuples to one or more files in the following format:
(WINDOW_TIME, TICKER, COUNT, CALCULATION_TIME, LATENCY)
WINDOW_TIME is defined as the end time of a window. For example, for a window of events between 12:00:00 and 12:00:01, the WINDOW value would be 12:00:01. Latency can then be calculated based on the difference between the WINDOW and the CALCULATION_TIME.
A sample output could look as follows:
The first value is the window close timestamp, which indicates what time period this value is for (WINDOW_TIME). The second value is the stock ticker, and the third the count for that ticker within that window. The next value represents when the processing for that window was completed (CALCULATION_TIME), and the last value (LATENCY) is simply CALCULATION_TIME – WINDOW_TIME.
If the allowed latency was 1000 ms, then this number should also be subtracted from LATENCY to find the real latency of the processing framework.
The following windowing combinations are tested:
Allowed out of orderness is 1 sec
The output files as above are parsed by a simple log parser written in Python to calculate the average latencies.
All source is available here: big-data-benchmark
Benchmark Tool Configuration
All latency results are given in milliseconds, to three significant digits.
Due to clock skew between machines, there is a ±20 ms uncertainty in the results. This is especially relevant to Jet’s results, where we measured about 22 ms minimum latency. The real minimum latency may be closer 0-2 ms and average latency about 20 ms.
Duration of a benchmark run: 140 seconds.
The tests used 2 million messages per second and 10,000 distinct keys.
Latency Distribution Charts
The 1-second tumbling window is the only benchmark for which it makes sense to compare all three of Jet, Flink and Spark on the same chart.
One-second tumbling window:
10-second window sliding by 1 second:
10-second window sliding by 0.1 seconds: