diff --git a/hadoop-hdds/docs/content/feature/Streaming-Write-Pipeline.md b/hadoop-hdds/docs/content/feature/Streaming-Write-Pipeline.md new file mode 100644 index 000000000000..5f55afebc3c8 --- /dev/null +++ b/hadoop-hdds/docs/content/feature/Streaming-Write-Pipeline.md @@ -0,0 +1,136 @@ +--- +title: "Streaming Write Pipeline" +weight: 1 +menu: + main: + parent: Features +summary: A new write pipeline using Ratis Streaming. +--- + + +This document discusses the new Streaming Write Pipeline feature in Ozone. +It is implemented with the Ratis Streaming API. +Note that the existing Ozone Write Pipeline is implemented with the Ratis Async API. +We refer the new Streaming Write Pipeline as Write Pipeline V2 +and the existing Async Write Pipeline as Write Pipeline V1. + +The Streaming Write Pipeline V2 increases the performance +by providing better network topology awareness +and removing the performance bottlenecks in V1. +The V2 implementation also avoids unnecessary buffer copying +(by Netty zero copy) +and has a better utilization of the CPUs and the disks in each datanode. + +## Configuration Properties + +Set the following properties to the Ozone configuration file `ozone-site.xml`. + +- To enable the Streaming Write Pipeline feature, set the following property to true. +```XML + + dfs.container.ratis.datastream.enabled + false + OZONE, CONTAINER, RATIS, DATASTREAM + It specifies whether to enable data stream of container. + +``` +- Datanodes listen to the following port for the streaming traffic. +```XML + + dfs.container.ratis.datastream.port + 9855 + OZONE, CONTAINER, RATIS, DATASTREAM + The datastream port number of container. + +``` +- To use Streaming in FileSystem API, set the following property to true. +```XML + + ozone.fs.datastream.enabled + false + OZONE, DATANODE + + To enable/disable filesystem write via ratis streaming. + + +``` + +## Client APIs + +### OzoneDataStreamOutput + +The new `OzoneDataStreamOutput` class is very similar to the existing `OzoneOutputStream` class, +except that `OzoneDataStreamOutput` uses `ByteBuffer` as a parameter in the `write` methods +while `OzoneOutputStream` uses `byte[]`. +The reason of using a `ByteBuffer`, instead of a `byte[]`, +is to support zero buffer copying. +A typical `write` method is shown below: + +- OzoneDataStreamOutput +```java + public void write(ByteBuffer b, int off, int len) throws IOException; +``` + +- OzoneOutputStream +```java + public void write(byte[] b, int off, int len) throws IOException; +``` +### OzoneBucket + +The following new methods are added to `OzoneBucket` +for creating keys using the Streaming Write Pipeline. + +- createStreamKey +```java + public OzoneDataStreamOutput createStreamKey(String key, long size) + throws IOException; +``` + +```java + public OzoneDataStreamOutput createStreamKey(String key, long size, + ReplicationConfig replicationConfig, Map keyMetadata) + throws IOException; +``` +- createMultipartStreamKey +```java + public OzoneDataStreamOutput createMultipartStreamKey(String key, long size, + int partNumber, String uploadID) throws IOException; +``` + +Note that the methods above have the same parameter list +as the existing `createKey` and `createMultipartKey` methods. + +Below is an example to create a key from a local file using a memory-mapped buffer. +```java + // Create a memory-mapped buffer from a local file: + final FileChannel channel = ... // local file channel + final long length = ... // length of the data + final ByteBuffer mapped = channel.map(FileChannel.MapMode.READ_ONLY, 0, length); + + // Create an OzoneDataStreamOutput + final OzoneBucket bucket = ... // an Ozone bucket + final String key = ... // the key name + final OzoneDataStreamOutput out = bucket.createStreamKey(key, length); + + // Write the memory-mapped buffer to the key output + out.write(mapped); + + // close + out.close(); // In practice, use try-with-resource to close it. + channel.close(); // In practice, use try-with-resource to close it. +``` \ No newline at end of file