From 3c5c7283ba4eca00bc78b1757746b574ac79a3d7 Mon Sep 17 00:00:00 2001 From: Chamikara Jayalath Date: Thu, 10 Aug 2023 15:24:25 -0700 Subject: [PATCH] Adds documentation regarding the Transform Service (#27946) * updates * Adds documentation regarding the Transform Service * updates * updates * Addresses reviewer comments --- .../en/documentation/programming-guide.md | 70 ++++++++++++++++++ .../site/static/images/transform_service.png | Bin 0 -> 41817 bytes 2 files changed, 70 insertions(+) create mode 100644 website/www/site/static/images/transform_service.png diff --git a/website/www/site/content/en/documentation/programming-guide.md b/website/www/site/content/en/documentation/programming-guide.md index b0118df39872..24d784644ec7 100644 --- a/website/www/site/content/en/documentation/programming-guide.md +++ b/website/www/site/content/en/documentation/programming-guide.md @@ -8081,3 +8081,73 @@ class RetrieveTimingDoFn(beam.DoFn):   def infer_output_type(self, input_type):     return input_type {{< /highlight >}} + +## 15 Transform Service {#transform-service} + +Starting version 2.49.0, Beam introduced a [Docker Compose](https://docs.docker.com/compose/) based service named _Transform Service_. The Transform Service allows Beam portable +pipelines to perform expansion of supported transforms using Docker. + +The basic architecture of the Transform Service is given below. + +![Diagram of the transform service architecture](/images/transform_service.png) + +The Transform Service can be useful in many contexts. We have identified two primary use-cases below. Note that to use the transform service, Docker (and Docker Compose) needs to be available in the machine where the service will be started at. + +* Perform expansion of cross-language transforms without installing other language runtimes. + +Transforms Service allows multi-language pipelines to use/expand cross-language transforms implemented in other SDKs without installing runtimes for implementation languages of such SDKs. +For example, with the Transform Service, a Beam Python pipeline can use Java GCP I/O transforms and Java Kafka I/O transforms without installing a Java runtime locally. + +* Upgrade transforms without upgrading the Beam version. + +The transform service can be used to upgrade individual transforms used by Beam pipelines to a new Beam version without upgrading the Beam version used by the pipeline. +This feature is currently in development. Please see the [tracking issue](https://github.com/apache/beam/issues/27943) for more details. + +### 15.1 Using the the Transform Service {#transform-service-usage} + +Beam SDKs may automatically startup a transform service to perform expansion when using cross-language transforms. More specifically, + +* Java [PythonExternalTransform API](https://github.com/apache/beam/blob/master/sdks/java/extensions/python/src/main/java/org/apache/beam/sdk/extensions/python/PythonExternalTransform.java) will automatically +startup the Transform Service for you if a Python runtime is not available locally but Docker is available. + +* Beam Python multi-language wrappers may automatically startup a Transform Service for you when using Java transforms, if a Java language runtime is not available locally but Docker is available. + +Additionally, if needed, a Transform Service instance can be manually started using utilities provided with Beam SDKs. + +{{< highlight java >}} +java -jar beam-sdks-java-transform-service-launcher-.jar --port --beam_version --project_name --command up +{{< /highlight >}} + +{{< highlight py >}} +python -m apache_beam.utils.transform_service_launcher --port --beam_version --project_name --command up +{{< /highlight >}} + +{{< highlight go >}} +This feature is currently in development. +{{< /highlight >}} + +To stop the transform service use the following commands. + +{{< highlight java >}} +java -jar beam-sdks-java-transform-service-launcher-.jar --port --beam_version --project_name --command down +{{< /highlight >}} + +{{< highlight py >}} +python -m apache_beam.utils.transform_service_launcher --port --beam_version --project_name --command down +{{< /highlight >}} + +{{< highlight go >}} +This feature is currently in development. +{{< /highlight >}} + +### 15.2 Portable Transforms included in the Transform Service {#transform-service-included-transforms} + +Transforms service includes a number of portable transforms implemented in Beam Java and Python SDKs. + +Some of the transforms currently included in the Trasnform Service are given below. + +* Java transforms - GCP I/O connectors, Kafka I/O connector, JDBC I/O connector. + +* Python transforms - all portable transforms implemented within Beam Python SDK, for example, RunInference and Dataframe transforms. + +For a more detailed list of available transforms, please see [here](https://cwiki.apache.org/confluence/display/BEAM/Transform+Service). diff --git a/website/www/site/static/images/transform_service.png b/website/www/site/static/images/transform_service.png new file mode 100644 index 0000000000000000000000000000000000000000..f3763bac64eea73564f756e274769499793f48a1 GIT binary patch literal 41817 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 X!HxLsbrQlEAU}J$`njxgN@xNAvd-i{ literal 0 HcmV?d00001