Learn how to create a Hello World Pravega app. This guide covers:
- Starting Pravega standalone
- Creating a Pravega Stream.
- Creating an Event Writer and write events into a Pravega Stream.
- Create an Event Reader and read events from the Pravega Stream.
To complete this guide, you need:
-
less than 15 minutes
-
an IDE
-
JDK 11+ installed with JAVA_HOME configured appropriately
-
Gradle 6.5.1+
Installation : https://gradle.org/install/!! Verify Gradle is using the Java you expect. You can verify which JDK Gradle uses by running
gradle --version
.!!
In this guide, we will create a straightforward application that creates a Stream on Pravega and writes an event into the Stream and reads back from it. We recommend that you follow the instructions from Bootstrapping project onwards to create the application step by step. However, you can go straight to the completed example at Pravega-samples-repo.
Command to clone the pravega-samples repo
git clone https://github.com/pravega/pravega-samples.git
The solution is located in the pravega-client-examples directory.
In standalone mode, the Pravega server is accessible from clients through the localhost
interface only. Controller REST APIs, however, are accessible from remote hosts/machines.
You can launch a standalone mode server using either of the following options:
- From source code
Commands to start standalone from source code
Checkout the source code:
$ git clone https://github.com/pravega/pravega.git
$ cd pravega
Build the Pravega standalone mode distribution:
./gradlew startStandalone
- From installation package
Commands to start standalone from installation package
Download the Pravega release from the GitHub Releases.
$ tar xfvz pravega-<version>.tgz
Download and extract either tarball or zip files. Follow the instructions provided for the tar files (same can be applied for zip file) to launch all the components of Pravega on your local machine.
Run Pravega Standalone:
$ pravega-<version>/bin/pravega-standalone
The easiest way to bootstrap a sample application against Pravega is to run the following command in a folder of your choice.
gradle init --type java-application
Add the below snippet to dependencies section of build.gradle in the app directory
// https://mvnrepository.com/artifact/io.pravega/pravega-client
implementation group: 'io.pravega', name: 'pravega-client', version: '0.8.1'
Invoke gradle run
to run the project.
Expected output
osboxes@osboxes:/tmp/demo$ gradle run
> Task :app:run
Hello World!
BUILD SUCCESSFUL in 890ms
2 actionable tasks: 2 executed
Let’s first get to know Pravega’s client APIs by creating a stream with a fixed scaling policy of 1 segment. We’ll need a StreamConfiguration to define this:
StreamConfiguration streamConfig = StreamConfiguration.builder()
.scalingPolicy(ScalingPolicy.fixed(1))
.build();
With this streamConfig, we can create streams that feel a bit more like traditional append-only files. Streams exist within scopes, which provide a namespace for related streams. We use a StreamManager to tell a Pravega cluster controller to create our scope and our streams. Since we are using a standalone Pravega let's use the below controller address.
URI controllerURI = URI.create("tcp://localhost:9090");
The code to create a Pravega stream is as follows
try (StreamManager streamManager = StreamManager.create(controllerURI)) {
streamManager.createScope("examples");
streamManager.createStream("examples", "helloStream", streamConfig);
}
Executing the above lines should ensure we have created a Pravega scope called examples
and a Pravega Stream called helloStream
.
Let's create a Pravega Event Writer using the EventStreamClientFactory
try (EventStreamClientFactory clientFactory = EventStreamClientFactory.withScope("examples",
ClientConfig.builder().controllerURI(controllerURI).build());
EventStreamWriter<String> writer = clientFactory.createEventWriter("helloStream",
new UTF8StringSerializer(), EventWriterConfig.builder().build())) {
writer.writeEvent("helloRoutingKey", "hello world!"); // write an event.
}
The above snippet creates an Event Writer and writes an event into the Pravega stream. Note that writeEvent()
returns a CompletableFuture
, which can be captured for use or will be resolved when calling flush()
or close()
, and, if destined for the same segment, the futures write in the order writeEvent()
is called.
When instantiating the EventStreamWriter above, we passed in a UTF8StringSerializer instance. Pravega uses a Serializer interface in its writers and readers to simplify the act of writing and reading an object’s bytes to and from streams. The JavaSerializer can handle any Serializable
object.
Readers are associated with reader groups, which track the readers’ progress and allow more than one reader to coordinate over which segments they’ll read. A ReaderGroupManager is used to create a new reader group on the Pravega Stream.
The below snippet create a ReaderGroup
try (ReaderGroupManager readerGroupManager = ReaderGroupManager.withScope("examples", controllerURI)) {
ReaderGroupConfig readerGroupConfig = ReaderGroupConfig.builder()
.stream(Stream.of("examples", "helloStream"))
.disableAutomaticCheckpoints()
.build();
readerGroupManager.createReaderGroup("readerGroup", readerGroupConfig);
}
We can attach an Pravega Event Reader to this reader group and read the data from the Pravega Stream helloStream
. The below snippet creates an EventReader called reader
and reads the value from the Pravega Stream.
try (EventStreamClientFactory clientFactory = EventStreamClientFactory.withScope("examples",
ClientConfig.builder().controllerURI(controllerURI).build());
EventStreamReader<String> reader = clientFactory.createReader("reader",
"readerGroup",
new UTF8StringSerializer(),
ReaderConfig.builder().build())) {
String event = reader.readNextEvent(5000).getEvent();
System.out.println(event);
}
This guide covered the creation of a application that writes and reads from Pravega. However, there is much more. We recommend continuing the journey by going through Pravega-client-101 and other samples present in the Pravega Samples repo.