This is an automated email from the ASF dual-hosted git repository.

github-bot pushed a commit to branch deploy
in repository https://gitbox.apache.org/repos/asf/incubator-wayang-website.git


The following commit(s) were added to refs/heads/deploy by this push:
     new b375c19a deploy: 90c4436e783b55ca883d4531b72e53ae20297a15
b375c19a is described below

commit b375c19a2da98e2fbb59d92790c5feb814e8d1b2
Author: 2pk03 <[email protected]>
AuthorDate: Tue Apr 9 07:48:58 2024 +0000

    deploy: 90c4436e783b55ca883d4531b72e53ae20297a15
---
 404.html                                           |   4 +-
 assets/js/232c92ba.e22f982f.js                     |   1 +
 assets/js/4d06a287.fe273f2e.js                     |   1 +
 .../{7c80c937.ea175b45.js => 7c80c937.4d3c5845.js} |   2 +-
 assets/js/814f3328.85198f47.js                     |   1 -
 assets/js/814f3328.b19b4789.js                     |   1 +
 assets/js/8f973d51.4cf7171e.js                     |   1 -
 assets/js/8f973d51.fc762be1.js                     |   1 +
 assets/js/935c02bb.2f02e330.js                     |   1 +
 assets/js/935c02bb.91d22b4c.js                     |   1 -
 assets/js/a7023ddc.4520cc0b.js                     |   1 -
 assets/js/a7023ddc.57bcce4f.js                     |   1 +
 .../{ae568e66.9ec3ff79.js => ae568e66.081be390.js} |   2 +-
 assets/js/ae720ac1.8f96cf7c.js                     |   1 +
 .../{b2b675dd.28296a86.js => b2b675dd.5773db20.js} |   2 +-
 assets/js/b2f554cd.3e468161.js                     |   1 +
 assets/js/b2f554cd.8c8c22f8.js                     |   1 -
 assets/js/f8de77c0.7f583aa8.js                     |   1 +
 assets/js/main.160bc23e.js                         |   2 +
 ...js.LICENSE.txt => main.160bc23e.js.LICENSE.txt} |   0
 assets/js/main.aeaeb384.js                         |   2 -
 ...e~main.47b6da99.js => runtime~main.c5c887b3.js} |   2 +-
 blog/archive/index.html                            |   6 +-
 blog/atom.xml                                      |  99 +++++++++++++++++++-
 blog/index.html                                    |  59 +++++++++++-
 blog/kafka-meets-wayang-1/index.html               |   6 +-
 blog/kafka-meets-wayang-2/index.html               |   6 +-
 blog/kafka-meets-wayang-3/index.html               |   8 +-
 blog/rss.xml                                       |  95 ++++++++++++++++++-
 .../index.html                                     |   6 +-
 blog/tags/index.html                               |   6 +-
 blog/tags/kafka/index.html                         |   6 +-
 blog/tags/presto/index.html                        |   6 +-
 blog/tags/python/index.html                        |  73 +++++++++++++++
 blog/tags/spark/index.html                         |   6 +-
 blog/tags/trino/index.html                         |   6 +-
 blog/tags/wayang/index.html                        |  61 +++++++++++-
 blog/wayang-python-api/index.html                  | 103 +++++++++++++++++++++
 blog/wayang-vs-trino/index.html                    |   6 +-
 blog/website_update/index.html                     |   6 +-
 docs/community/committer/index.html                |   4 +-
 docs/community/contribute/index.html               |   4 +-
 docs/community/mailinglist/index.html              |   4 +-
 docs/community/repositories/index.html             |   4 +-
 docs/community/team/index.html                     |   4 +-
 docs/guide/adding-operators/index.html             |   4 +-
 docs/guide/api-documentation/index.html            |   4 +-
 docs/guide/developing-in-wayang/index.html         |   4 +-
 docs/guide/examples/index.html                     |   4 +-
 docs/guide/getting-started/index.html              |   4 +-
 docs/guide/installation/index.html                 |   4 +-
 docs/guide/ml4all/index.html                       |   4 +-
 docs/guide/optimizer/index.html                    |   4 +-
 docs/introduction/about/index.html                 |   4 +-
 docs/introduction/benchmark/index.html             |   4 +-
 docs/introduction/features/index.html              |   4 +-
 docs/start/download/index.html                     |   4 +-
 img/architecture/pywayang.png                      | Bin 0 -> 61750 bytes
 index.html                                         |   4 +-
 lunr-index-1710452634782.json                      |   1 -
 lunr-index-1712648909442.json                      |   1 +
 lunr-index.json                                    |   2 +-
 search-doc-1710452634782.json                      |   1 -
 search-doc-1712648909442.json                      |   1 +
 search-doc.json                                    |   2 +-
 sitemap.xml                                        |   2 +-
 66 files changed, 576 insertions(+), 100 deletions(-)

diff --git a/404.html b/404.html
index 129d950a..2691cf34 100644
--- a/404.html
+++ b/404.html
@@ -5,8 +5,8 @@
 <meta name="generator" content="Docusaurus v3.1.1">
 <title data-rh="true">Page Not Found | Apache Wayang (incubating)</title><meta 
data-rh="true" name="viewport" 
content="width=device-width,initial-scale=1"><meta data-rh="true" 
name="twitter:card" content="summary_large_image"><meta data-rh="true" 
property="og:url" content="https://wayang.apache.org/404.html";><meta 
data-rh="true" property="og:locale" content="en"><meta data-rh="true" 
name="docusaurus_locale" content="en"><meta data-rh="true" 
name="docusaurus_tag" content="default"><meta d [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" 
title="Apache Wayang (incubating) Atom Feed"><link rel="stylesheet" 
href="/assets/css/styles.ecf70413.css">
-<script src="/assets/js/runtime~main.47b6da99.js" defer="defer"></script>
-<script src="/assets/js/main.aeaeb384.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.c5c887b3.js" defer="defer"></script>
+<script src="/assets/js/main.160bc23e.js" defer="defer"></script>
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function 
t(t){document.documentElement.setAttribute("data-theme",t)}var 
e=function(){try{return new 
URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return
 
localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const
 a=new URLSearchParams(window.location.search).entries();for(var[t,e]of 
a)if(t.startsWith("docusaurus-data-")){var 
n=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/assets/js/232c92ba.e22f982f.js b/assets/js/232c92ba.e22f982f.js
new file mode 100644
index 00000000..bb0deed7
--- /dev/null
+++ b/assets/js/232c92ba.e22f982f.js
@@ -0,0 +1 @@
+"use 
strict";(self.webpackChunkwayang_website=self.webpackChunkwayang_website||[]).push([[6974],{2725:a=>{a.exports=JSON.parse('{"label":"python","permalink":"/blog/tags/python","allTagsPath":"/blog/tags","count":1,"unlisted":false}')}}]);
\ No newline at end of file
diff --git a/assets/js/4d06a287.fe273f2e.js b/assets/js/4d06a287.fe273f2e.js
new file mode 100644
index 00000000..edbe0109
--- /dev/null
+++ b/assets/js/4d06a287.fe273f2e.js
@@ -0,0 +1 @@
+"use 
strict";(self.webpackChunkwayang_website=self.webpackChunkwayang_website||[]).push([[5539],{1642:(n,e,a)=>{a.r(e),a.d(e,{assets:()=>l,contentTitle:()=>s,default:()=>h,frontMatter:()=>o,metadata:()=>r,toc:()=>p});var
 t=a(5893),i=a(1151);const o={slug:"wayang-python-api",title:"Pywayang - Apache 
Wayang's Python 
API",authors:["juripetersen"],tags:["wayang","python"]},s="Pywayang - Apache 
Wayang's Python 
API",r={permalink:"/blog/wayang-python-api",source:"@site/blog/2024-04-09-python-ap
 [...]
\ No newline at end of file
diff --git a/assets/js/7c80c937.ea175b45.js b/assets/js/7c80c937.4d3c5845.js
similarity index 80%
rename from assets/js/7c80c937.ea175b45.js
rename to assets/js/7c80c937.4d3c5845.js
index 9be53aaf..2855d568 100644
--- a/assets/js/7c80c937.ea175b45.js
+++ b/assets/js/7c80c937.4d3c5845.js
@@ -1 +1 @@
-"use 
strict";(self.webpackChunkwayang_website=self.webpackChunkwayang_website||[]).push([[1958],{1505:a=>{a.exports=JSON.parse('{"label":"wayang","permalink":"/blog/tags/wayang","allTagsPath":"/blog/tags","count":5,"unlisted":false}')}}]);
\ No newline at end of file
+"use 
strict";(self.webpackChunkwayang_website=self.webpackChunkwayang_website||[]).push([[1958],{1505:a=>{a.exports=JSON.parse('{"label":"wayang","permalink":"/blog/tags/wayang","allTagsPath":"/blog/tags","count":6,"unlisted":false}')}}]);
\ No newline at end of file
diff --git a/assets/js/814f3328.85198f47.js b/assets/js/814f3328.85198f47.js
deleted file mode 100644
index adb9bd4b..00000000
--- a/assets/js/814f3328.85198f47.js
+++ /dev/null
@@ -1 +0,0 @@
-"use 
strict";(self.webpackChunkwayang_website=self.webpackChunkwayang_website||[]).push([[2535],{5641:e=>{e.exports=JSON.parse('{"title":"All
 our posts","items":[{"title":"Apache Kafka meets Apache Wayang - Part 
3","permalink":"/blog/kafka-meets-wayang-3","unlisted":false},{"title":"Apache 
Wayang vs. 
Presto/Trino","permalink":"/blog/wayang-vs-trino","unlisted":false},{"title":"Apache
 Kafka meets Apache Wayang - Part 
2","permalink":"/blog/kafka-meets-wayang-2","unlisted":false},{"title":" [...]
\ No newline at end of file
diff --git a/assets/js/814f3328.b19b4789.js b/assets/js/814f3328.b19b4789.js
new file mode 100644
index 00000000..89d347b1
--- /dev/null
+++ b/assets/js/814f3328.b19b4789.js
@@ -0,0 +1 @@
+"use 
strict";(self.webpackChunkwayang_website=self.webpackChunkwayang_website||[]).push([[2535],{5641:a=>{a.exports=JSON.parse('{"title":"All
 our posts","items":[{"title":"Pywayang - Apache Wayang\'s Python 
API","permalink":"/blog/wayang-python-api","unlisted":false},{"title":"Apache 
Kafka meets Apache Wayang - Part 
3","permalink":"/blog/kafka-meets-wayang-3","unlisted":false},{"title":"Apache 
Wayang vs. 
Presto/Trino","permalink":"/blog/wayang-vs-trino","unlisted":false},{"title":"Apache
 [...]
\ No newline at end of file
diff --git a/assets/js/8f973d51.4cf7171e.js b/assets/js/8f973d51.4cf7171e.js
deleted file mode 100644
index 6bb15fff..00000000
--- a/assets/js/8f973d51.4cf7171e.js
+++ /dev/null
@@ -1 +0,0 @@
-"use 
strict";(self.webpackChunkwayang_website=self.webpackChunkwayang_website||[]).push([[4431],{4310:(e,a,n)=>{n.r(a),n.d(a,{assets:()=>l,contentTitle:()=>o,default:()=>p,frontMatter:()=>r,metadata:()=>s,toc:()=>c});var
 t=n(5893),i=n(1151);const r={slug:"kafka-meets-wayang-3",title:"Apache Kafka 
meets Apache Wayang - Part 
3",authors:"kamir",tags:["wayang","kafka","spark","cross organization data 
collaboration"]},o=void 
0,s={permalink:"/blog/kafka-meets-wayang-3",source:"@site/blog/2024- [...]
\ No newline at end of file
diff --git a/assets/js/8f973d51.fc762be1.js b/assets/js/8f973d51.fc762be1.js
new file mode 100644
index 00000000..50b5cfa2
--- /dev/null
+++ b/assets/js/8f973d51.fc762be1.js
@@ -0,0 +1 @@
+"use 
strict";(self.webpackChunkwayang_website=self.webpackChunkwayang_website||[]).push([[4431],{4310:(e,a,n)=>{n.r(a),n.d(a,{assets:()=>l,contentTitle:()=>o,default:()=>p,frontMatter:()=>r,metadata:()=>s,toc:()=>c});var
 t=n(5893),i=n(1151);const r={slug:"kafka-meets-wayang-3",title:"Apache Kafka 
meets Apache Wayang - Part 
3",authors:"kamir",tags:["wayang","kafka","spark","cross organization data 
collaboration"]},o=void 
0,s={permalink:"/blog/kafka-meets-wayang-3",source:"@site/blog/2024- [...]
\ No newline at end of file
diff --git a/assets/js/935c02bb.2f02e330.js b/assets/js/935c02bb.2f02e330.js
new file mode 100644
index 00000000..ccaf3cdd
--- /dev/null
+++ b/assets/js/935c02bb.2f02e330.js
@@ -0,0 +1 @@
+"use 
strict";(self.webpackChunkwayang_website=self.webpackChunkwayang_website||[]).push([[2227],{3785:(e,a,n)=>{n.r(a),n.d(a,{assets:()=>l,contentTitle:()=>o,default:()=>p,frontMatter:()=>r,metadata:()=>s,toc:()=>c});var
 t=n(5893),i=n(1151);const r={slug:"kafka-meets-wayang-3",title:"Apache Kafka 
meets Apache Wayang - Part 
3",authors:"kamir",tags:["wayang","kafka","spark","cross organization data 
collaboration"]},o=void 
0,s={permalink:"/blog/kafka-meets-wayang-3",source:"@site/blog/2024- [...]
\ No newline at end of file
diff --git a/assets/js/935c02bb.91d22b4c.js b/assets/js/935c02bb.91d22b4c.js
deleted file mode 100644
index 89d88431..00000000
--- a/assets/js/935c02bb.91d22b4c.js
+++ /dev/null
@@ -1 +0,0 @@
-"use 
strict";(self.webpackChunkwayang_website=self.webpackChunkwayang_website||[]).push([[2227],{3785:(e,a,n)=>{n.r(a),n.d(a,{assets:()=>l,contentTitle:()=>o,default:()=>p,frontMatter:()=>r,metadata:()=>s,toc:()=>c});var
 t=n(5893),i=n(1151);const r={slug:"kafka-meets-wayang-3",title:"Apache Kafka 
meets Apache Wayang - Part 
3",authors:"kamir",tags:["wayang","kafka","spark","cross organization data 
collaboration"]},o=void 
0,s={permalink:"/blog/kafka-meets-wayang-3",source:"@site/blog/2024- [...]
\ No newline at end of file
diff --git a/assets/js/a7023ddc.4520cc0b.js b/assets/js/a7023ddc.4520cc0b.js
deleted file mode 100644
index 5c076db4..00000000
--- a/assets/js/a7023ddc.4520cc0b.js
+++ /dev/null
@@ -1 +0,0 @@
-"use 
strict";(self.webpackChunkwayang_website=self.webpackChunkwayang_website||[]).push([[1713],{3457:a=>{a.exports=JSON.parse('[{"label":"wayang","permalink":"/blog/tags/wayang","count":5},{"label":"kafka","permalink":"/blog/tags/kafka","count":3},{"label":"spark","permalink":"/blog/tags/spark","count":1},{"label":"cross
 organization data 
collaboration","permalink":"/blog/tags/cross-organization-data-collaboration","count":3},{"label":"presto","permalink":"/blog/tags/presto","count":1},
 [...]
\ No newline at end of file
diff --git a/assets/js/a7023ddc.57bcce4f.js b/assets/js/a7023ddc.57bcce4f.js
new file mode 100644
index 00000000..60e16f11
--- /dev/null
+++ b/assets/js/a7023ddc.57bcce4f.js
@@ -0,0 +1 @@
+"use 
strict";(self.webpackChunkwayang_website=self.webpackChunkwayang_website||[]).push([[1713],{3457:a=>{a.exports=JSON.parse('[{"label":"wayang","permalink":"/blog/tags/wayang","count":6},{"label":"python","permalink":"/blog/tags/python","count":1},{"label":"kafka","permalink":"/blog/tags/kafka","count":3},{"label":"spark","permalink":"/blog/tags/spark","count":1},{"label":"cross
 organization data 
collaboration","permalink":"/blog/tags/cross-organization-data-collaboration","count":3},
 [...]
\ No newline at end of file
diff --git a/assets/js/ae568e66.9ec3ff79.js b/assets/js/ae568e66.081be390.js
similarity index 71%
rename from assets/js/ae568e66.9ec3ff79.js
rename to assets/js/ae568e66.081be390.js
index cc4e15e1..2b847c24 100644
--- a/assets/js/ae568e66.9ec3ff79.js
+++ b/assets/js/ae568e66.081be390.js
@@ -1 +1 @@
-"use 
strict";(self.webpackChunkwayang_website=self.webpackChunkwayang_website||[]).push([[6042],{7146:e=>{e.exports=JSON.parse('{"permalink":"/blog/tags/wayang","page":1,"postsPerPage":10,"totalPages":1,"totalCount":5,"blogDescription":"Blog","blogTitle":"Blog"}')}}]);
\ No newline at end of file
+"use 
strict";(self.webpackChunkwayang_website=self.webpackChunkwayang_website||[]).push([[6042],{7146:e=>{e.exports=JSON.parse('{"permalink":"/blog/tags/wayang","page":1,"postsPerPage":10,"totalPages":1,"totalCount":6,"blogDescription":"Blog","blogTitle":"Blog"}')}}]);
\ No newline at end of file
diff --git a/assets/js/ae720ac1.8f96cf7c.js b/assets/js/ae720ac1.8f96cf7c.js
new file mode 100644
index 00000000..71f88024
--- /dev/null
+++ b/assets/js/ae720ac1.8f96cf7c.js
@@ -0,0 +1 @@
+"use 
strict";(self.webpackChunkwayang_website=self.webpackChunkwayang_website||[]).push([[6977],{9283:(n,e,a)=>{a.r(e),a.d(e,{assets:()=>c,contentTitle:()=>i,default:()=>h,frontMatter:()=>o,metadata:()=>r,toc:()=>p});var
 t=a(5893),s=a(1151);const o={slug:"wayang-python-api",title:"Pywayang - Apache 
Wayang's Python 
API",authors:["juripetersen"],tags:["wayang","python"]},i="Pywayang - Apache 
Wayang's Python 
API",r={permalink:"/blog/wayang-python-api",source:"@site/blog/2024-04-09-python-ap
 [...]
\ No newline at end of file
diff --git a/assets/js/b2b675dd.28296a86.js b/assets/js/b2b675dd.5773db20.js
similarity index 75%
rename from assets/js/b2b675dd.28296a86.js
rename to assets/js/b2b675dd.5773db20.js
index ca5b8943..a5669cbc 100644
--- a/assets/js/b2b675dd.28296a86.js
+++ b/assets/js/b2b675dd.5773db20.js
@@ -1 +1 @@
-"use 
strict";(self.webpackChunkwayang_website=self.webpackChunkwayang_website||[]).push([[533],{8017:e=>{e.exports=JSON.parse('{"permalink":"/blog","page":1,"postsPerPage":10,"totalPages":1,"totalCount":5,"blogDescription":"Blog","blogTitle":"Blog"}')}}]);
\ No newline at end of file
+"use 
strict";(self.webpackChunkwayang_website=self.webpackChunkwayang_website||[]).push([[533],{8017:e=>{e.exports=JSON.parse('{"permalink":"/blog","page":1,"postsPerPage":10,"totalPages":1,"totalCount":6,"blogDescription":"Blog","blogTitle":"Blog"}')}}]);
\ No newline at end of file
diff --git a/assets/js/b2f554cd.3e468161.js b/assets/js/b2f554cd.3e468161.js
new file mode 100644
index 00000000..1f579d71
--- /dev/null
+++ b/assets/js/b2f554cd.3e468161.js
@@ -0,0 +1 @@
+"use 
strict";(self.webpackChunkwayang_website=self.webpackChunkwayang_website||[]).push([[1477],{10:a=>{a.exports=JSON.parse('{"blogPosts":[{"id":"wayang-python-api","metadata":{"permalink":"/blog/wayang-python-api","source":"@site/blog/2024-04-09-python-api.md","title":"Pywayang
 - Apache Wayang\'s Python API","description":"In the vast landscape of data 
processing, efficiency and flexibility 
are","date":"2024-04-09T00:00:00.000Z","formattedDate":"April 9, 
2024","tags":[{"label":"wayang" [...]
\ No newline at end of file
diff --git a/assets/js/b2f554cd.8c8c22f8.js b/assets/js/b2f554cd.8c8c22f8.js
deleted file mode 100644
index 4cf67e83..00000000
--- a/assets/js/b2f554cd.8c8c22f8.js
+++ /dev/null
@@ -1 +0,0 @@
-"use 
strict";(self.webpackChunkwayang_website=self.webpackChunkwayang_website||[]).push([[1477],{10:a=>{a.exports=JSON.parse('{"blogPosts":[{"id":"kafka-meets-wayang-3","metadata":{"permalink":"/blog/kafka-meets-wayang-3","source":"@site/blog/2024-03-10-kafka-meets-wayang-3.md","title":"Apache
 Kafka meets Apache Wayang - Part 3","description":"The third part of this 
article series is an activity 
log.","date":"2024-03-10T00:00:00.000Z","formattedDate":"March 10, 
2024","tags":[{"label":"wa [...]
\ No newline at end of file
diff --git a/assets/js/f8de77c0.7f583aa8.js b/assets/js/f8de77c0.7f583aa8.js
new file mode 100644
index 00000000..126bb5fd
--- /dev/null
+++ b/assets/js/f8de77c0.7f583aa8.js
@@ -0,0 +1 @@
+"use 
strict";(self.webpackChunkwayang_website=self.webpackChunkwayang_website||[]).push([[5826],{7661:e=>{e.exports=JSON.parse('{"permalink":"/blog/tags/python","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]);
\ No newline at end of file
diff --git a/assets/js/main.160bc23e.js b/assets/js/main.160bc23e.js
new file mode 100644
index 00000000..daf096fe
--- /dev/null
+++ b/assets/js/main.160bc23e.js
@@ -0,0 +1,2 @@
+/*! For license information please see main.160bc23e.js.LICENSE.txt */
+(self.webpackChunkwayang_website=self.webpackChunkwayang_website||[]).push([[179],{723:(e,t,n)=>{"use
 strict";n.d(t,{Z:()=>f});n(7294);var r=n(8356),a=n.n(r),o=n(6887);const 
i={"01a85c17":[()=>Promise.all([n.e(532),n.e(4013)]).then(n.bind(n,1223)),"@theme/BlogTagsListPage",1223],"05a94acb":[()=>n.e(3617).then(n.bind(n,7856)),"@site/docs/community/committer.md",7856],"092604a4":[()=>n.e(5088).then(n.bind(n,45)),"@site/docs/introduction/benchmark.md",45],"115b1bdb":[()=>n.e(2251).then(n.t.
 [...]
\ No newline at end of file
diff --git a/assets/js/main.aeaeb384.js.LICENSE.txt 
b/assets/js/main.160bc23e.js.LICENSE.txt
similarity index 100%
rename from assets/js/main.aeaeb384.js.LICENSE.txt
rename to assets/js/main.160bc23e.js.LICENSE.txt
diff --git a/assets/js/main.aeaeb384.js b/assets/js/main.aeaeb384.js
deleted file mode 100644
index f5f71543..00000000
--- a/assets/js/main.aeaeb384.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/*! For license information please see main.aeaeb384.js.LICENSE.txt */
-(self.webpackChunkwayang_website=self.webpackChunkwayang_website||[]).push([[179],{723:(e,t,n)=>{"use
 strict";n.d(t,{Z:()=>f});n(7294);var r=n(8356),a=n.n(r),o=n(6887);const 
i={"01a85c17":[()=>Promise.all([n.e(532),n.e(4013)]).then(n.bind(n,1223)),"@theme/BlogTagsListPage",1223],"05a94acb":[()=>n.e(3617).then(n.bind(n,7856)),"@site/docs/community/committer.md",7856],"092604a4":[()=>n.e(5088).then(n.bind(n,45)),"@site/docs/introduction/benchmark.md",45],"115b1bdb":[()=>n.e(2251).then(n.t.
 [...]
\ No newline at end of file
diff --git a/assets/js/runtime~main.47b6da99.js 
b/assets/js/runtime~main.c5c887b3.js
similarity index 67%
rename from assets/js/runtime~main.47b6da99.js
rename to assets/js/runtime~main.c5c887b3.js
index 004f654c..863ad03b 100644
--- a/assets/js/runtime~main.47b6da99.js
+++ b/assets/js/runtime~main.c5c887b3.js
@@ -1 +1 @@
-(()=>{"use strict";var e,a,c,d,f,t={},r={};function b(e){var a=r[e];if(void 
0!==a)return a.exports;var c=r[e]={exports:{}};return 
t[e].call(c.exports,c,c.exports,b),c.exports}b.m=t,e=[],b.O=(a,c,d,f)=>{if(!c){var
 t=1/0;for(i=0;i<e.length;i++){c=e[i][0],d=e[i][1],f=e[i][2];for(var 
r=!0,o=0;o<c.length;o++)(!1&f||t>=f)&&Object.keys(b.O).every((e=>b.O[e](c[o])))?c.splice(o--,1):(r=!1,f<t&&(t=f));if(r){e.splice(i--,1);var
 n=d();void 0!==n&&(a=n)}}return a}f=f||0;for(var i=e.length;i>0&&e[i-1] [...]
\ No newline at end of file
+(()=>{"use strict";var e,a,c,d,f,t={},r={};function b(e){var a=r[e];if(void 
0!==a)return a.exports;var c=r[e]={exports:{}};return 
t[e].call(c.exports,c,c.exports,b),c.exports}b.m=t,e=[],b.O=(a,c,d,f)=>{if(!c){var
 t=1/0;for(i=0;i<e.length;i++){c=e[i][0],d=e[i][1],f=e[i][2];for(var 
r=!0,o=0;o<c.length;o++)(!1&f||t>=f)&&Object.keys(b.O).every((e=>b.O[e](c[o])))?c.splice(o--,1):(r=!1,f<t&&(t=f));if(r){e.splice(i--,1);var
 n=d();void 0!==n&&(a=n)}}return a}f=f||0;for(var i=e.length;i>0&&e[i-1] [...]
\ No newline at end of file
diff --git a/blog/archive/index.html b/blog/archive/index.html
index fb9d36a2..af441faf 100644
--- a/blog/archive/index.html
+++ b/blog/archive/index.html
@@ -5,11 +5,11 @@
 <meta name="generator" content="Docusaurus v3.1.1">
 <title data-rh="true">Archive | Apache Wayang (incubating)</title><meta 
data-rh="true" name="viewport" 
content="width=device-width,initial-scale=1"><meta data-rh="true" 
name="twitter:card" content="summary_large_image"><meta data-rh="true" 
property="og:url" content="https://wayang.apache.org/blog/archive";><meta 
data-rh="true" property="og:locale" content="en"><meta data-rh="true" 
name="docusaurus_locale" content="en"><meta data-rh="true" 
name="docusaurus_tag" content="default"><meta data [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" 
title="Apache Wayang (incubating) Atom Feed"><link rel="stylesheet" 
href="/assets/css/styles.ecf70413.css">
-<script src="/assets/js/runtime~main.47b6da99.js" defer="defer"></script>
-<script src="/assets/js/main.aeaeb384.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.c5c887b3.js" defer="defer"></script>
+<script src="/assets/js/main.160bc23e.js" defer="defer"></script>
 </head>
 <body class="navigation-with-keyboard">
-<script>!function(){function 
t(t){document.documentElement.setAttribute("data-theme",t)}var 
e=function(){try{return new 
URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return
 
localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const
 a=new URLSearchParams(window.location.search).entries();for(var[t,e]of 
a)if(t.startsWith("docusaurus-data-")){var 
n=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
+<script>!function(){function 
t(t){document.documentElement.setAttribute("data-theme",t)}var 
e=function(){try{return new 
URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return
 
localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const
 a=new URLSearchParams(window.location.search).entries();for(var[t,e]of 
a)if(t.startsWith("docusaurus-data-")){var 
n=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
       <p> Apache Wayang is an effort undergoing incubation at The Apache 
Software Foundation (ASF), sponsored by the Apache Incubator. 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 th [...]
       <p>
         Copyright © 2024 The Apache Software Foundation, Licensed under the 
Apache License, Version 2.0. <br>
diff --git a/blog/atom.xml b/blog/atom.xml
index 988785fa..6a49528c 100644
--- a/blog/atom.xml
+++ b/blog/atom.xml
@@ -2,11 +2,108 @@
 <feed xmlns="http://www.w3.org/2005/Atom";>
     <id>https://wayang.apache.org/blog</id>
     <title>Apache Wayang (incubating) Blog</title>
-    <updated>2024-03-10T00:00:00.000Z</updated>
+    <updated>2024-04-09T00:00:00.000Z</updated>
     <generator>https://github.com/jpmonette/feed</generator>
     <link rel="alternate" href="https://wayang.apache.org/blog"/>
     <subtitle>Apache Wayang (incubating) Blog</subtitle>
     <icon>https://wayang.apache.org/img/wayang-logo.jpg</icon>
+    <entry>
+        <title type="html"><![CDATA[Pywayang - Apache Wayang's Python 
API]]></title>
+        <id>https://wayang.apache.org/blog/wayang-python-api</id>
+        <link href="https://wayang.apache.org/blog/wayang-python-api"/>
+        <updated>2024-04-09T00:00:00.000Z</updated>
+        <summary type="html"><![CDATA[In the vast landscape of data 
processing, efficiency and flexibility are]]></summary>
+        <content type="html"><![CDATA[<p>In the vast landscape of data 
processing, efficiency and flexibility are
+important. However, navigating through a multitude of tools and
+languages often is a major inconvenience.
+Apache Wayang's upcoming Python API will allow you to seamlessly
+orchestrate data processing tasks without ever leaving the comfort
+of Python, irrespective of the underlying framework written in Java.</p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" 
id="expanding-apache-wayangs-apis">Expanding Apache Wayang's APIs<a 
href="https://wayang.apache.org/blog/wayang-python-api#expanding-apache-wayangs-apis";
 class="hash-link" aria-label="Direct link to Expanding Apache Wayang's APIs" 
title="Direct link to Expanding Apache Wayang's APIs">​</a></h2>
+<p>Apache Wayang's architecture decouples the process of planning from the
+resulting execution, allowing users to specify platform agnostic plans
+through the provided APIs.</p>
+<br>
+<img width="75%" alt="wayang stack" 
src="https://wayang.apache.org/img/architecture/wayang-stack.png";>
+<br>
+<br>
+<p>Python's popularity and convenience for data
+processing workloads makes it an obvious candidate for a desired API.
+Previous APIs, such as the Scala API <code>wayang-api-scala-java</code> 
benefited
+from the interoperability of Java and Scala that allows to reuse objects
+from other languages to provide new interfaces. Accessing JVM objects in
+Python is possible through several libraries, but in doing so,
+future APIs in other programming languages would need similar libraries and
+implementations in order to exist. As a contrast to that, providing an
+API within Apache Wayang that receives input plans from any source and
+executes them within allows to create plans and submit them in any
+programming language. The following figure shows the architecture of 
<code>pywayang</code>:</p>
+<br>
+<img width="75%" alt="pywayang stack" 
src="https://wayang.apache.org/img/architecture/pywayang.png";>
+<br>
+<br>
+<p>The Python API allows users to specify WayangPlans with UDFs in Python.
+<code>pywayang</code> then serializes the UDFs and constructs the WayangPlan in
+JSON format, preparing it to be sent to Apache Wayang's JSON API.
+When receiving a valid JSON plan, the JSON API uses the optimizer to
+construct an execution plan. However, since UDFs are defined in Python
+and thus need to be executed in Python as well, an operators function needs to 
be
+wrapped into a <code>WrappedPythonFunction</code>:</p>
+<div class="language-scala codeBlockContainer_Ckt0 theme-code-block" 
style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div 
class="codeBlockContent_biex"><pre tabindex="0" class="prism-code 
language-scala codeBlock_bY9V thin-scrollbar" 
style="color:#393A34;background-color:#f6f8fa"><code 
class="codeBlockLines_e6Vv"><span class="token-line" 
style="color:#393A34"><span class="token keyword" 
style="color:#00009f">val</span><span class="token plain"> mapOperator 
</span><span cla [...]
+<p>This wrapped functional descriptor allows to handle execution of
+UDFs in Python through a socket connection with the <code>pywayang</code> 
worker.
+Input data is sourced from the platform chosen by the optimizer and Apache
+Wayang handles routing the output data to the next operator.</p>
+<br>
+<p>A new API in any programming languages would have
+to specify two things:</p>
+<ul>
+<li>A way to create plans that conform to a JSON format specified in the
+Wayang JSON API.</li>
+<li>A <code>worker</code> that handles encoding and decoding of user defined
+functions (UDFs), as they need to
+be executed on iterables in their respective language.
+After that, the API can be added as a module in Wayang, so that
+operators will be wrapped and UDFs can be executed in the desired
+programming language.</li>
+</ul>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" 
id="defining-wayangplans-in-python">Defining WayangPlans in Python<a 
href="https://wayang.apache.org/blog/wayang-python-api#defining-wayangplans-in-python";
 class="hash-link" aria-label="Direct link to Defining WayangPlans in Python" 
title="Direct link to Defining WayangPlans in Python">​</a></h2>
+<p>As the "Hello World!" of data processing systems, wordcount will pose as
+our primary example to display how users can interact with Apache Wayang
+through the python package <code>pywayang</code>.</p>
+<div class="language-python codeBlockContainer_Ckt0 theme-code-block" 
style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div 
class="codeBlockContent_biex"><pre tabindex="0" class="prism-code 
language-python codeBlock_bY9V thin-scrollbar" 
style="color:#393A34;background-color:#f6f8fa"><code 
class="codeBlockLines_e6Vv"><span class="token-line" 
style="color:#393A34"><span class="token keyword" 
style="color:#00009f">from</span><span class="token plain"> pywy</span><span 
class="t [...]
+<p>The example displays a mode of operation that resembles the Scala
+<code>PlanBuilder</code> and the <code>JavaPlanBuilder</code>. Plans are 
specified in a
+functional way, chaining operations until a terminal operation results
+in execution of the plan.</p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" 
id="wayang-api-json">Wayang-API-JSON<a 
href="https://wayang.apache.org/blog/wayang-python-api#wayang-api-json"; 
class="hash-link" aria-label="Direct link to Wayang-API-JSON" title="Direct 
link to Wayang-API-JSON">​</a></h2>
+<p>The <code>wayang-api-json</code> module provides an executable that starts 
a REST
+server. This server accepts a <code>WayangPlan</code> in JSON format.
+Starting the REST API as a background process can be done by executing
+the following:</p>
+<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" 
style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div 
class="codeBlockContent_biex"><pre tabindex="0" class="prism-code 
language-shell codeBlock_bY9V thin-scrollbar" 
style="color:#393A34;background-color:#f6f8fa"><code 
class="codeBlockLines_e6Vv"><span class="token-line" 
style="color:#393A34"><span class="token plain">mvn clean package </span><span 
class="token parameter variable" style="color:#36acaa">-pl [...]
+<h2 class="anchor anchorWithStickyNavbar_LWe7" 
id="wrapping-pipelines-in-mappartition-operators">Wrapping pipelines in 
MapPartition operators<a 
href="https://wayang.apache.org/blog/wayang-python-api#wrapping-pipelines-in-mappartition-operators";
 class="hash-link" aria-label="Direct link to Wrapping pipelines in 
MapPartition operators" title="Direct link to Wrapping pipelines in 
MapPartition operators">​</a></h2>
+<p>With this architecture, the execution of an operator comes with an
+additional overhead, because the UDFs will have to be executed in
+python. Python operators receive iterators through a socket and also
+return their result to Wayang through that connection. To minimize the
+overhead, unary operators that return unary results will be grouped in
+pipelines. One pipeline of operators will be submitted to the Wayang
+JSON API as a single <code>MapPartition</code> operator. This means that the 
UDFs
+specified in this pipeline can be chained and only on call from Wayang
+to the Python worker will have to be made for a given pipeline.</p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="coming-soon">Coming soon<a 
href="https://wayang.apache.org/blog/wayang-python-api#coming-soon"; 
class="hash-link" aria-label="Direct link to Coming soon" title="Direct link to 
Coming soon">​</a></h2>
+<p>As the Python API is currently in development and we are applying
+finishing touches, this article serves as an outlook for what users can
+expect to see soon.</p>
+<p>Author: <a href="https://github.com/juripetersen"; target="_blank" 
rel="noopener noreferrer">juripetersen</a></p>]]></content>
+        <author>
+            <name>Juri Petersen</name>
+            <uri>https://github.com/juripetersen</uri>
+        </author>
+        <category label="wayang" term="wayang"/>
+        <category label="python" term="python"/>
+    </entry>
     <entry>
         <title type="html"><![CDATA[Apache Kafka meets Apache Wayang - Part 
3]]></title>
         <id>https://wayang.apache.org/blog/kafka-meets-wayang-3</id>
diff --git a/blog/index.html b/blog/index.html
index bc8ad9b1..ec179ac6 100644
--- a/blog/index.html
+++ b/blog/index.html
@@ -5,11 +5,64 @@
 <meta name="generator" content="Docusaurus v3.1.1">
 <title data-rh="true">Blog | Apache Wayang (incubating)</title><meta 
data-rh="true" name="viewport" 
content="width=device-width,initial-scale=1"><meta data-rh="true" 
name="twitter:card" content="summary_large_image"><meta data-rh="true" 
property="og:url" content="https://wayang.apache.org/blog";><meta data-rh="true" 
property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" 
content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta 
data-rh="true" p [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" 
title="Apache Wayang (incubating) Atom Feed"><link rel="stylesheet" 
href="/assets/css/styles.ecf70413.css">
-<script src="/assets/js/runtime~main.47b6da99.js" defer="defer"></script>
-<script src="/assets/js/main.aeaeb384.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.c5c887b3.js" defer="defer"></script>
+<script src="/assets/js/main.160bc23e.js" defer="defer"></script>
 </head>
 <body class="navigation-with-keyboard">
-<script>!function(){function 
t(t){document.documentElement.setAttribute("data-theme",t)}var 
e=function(){try{return new 
URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return
 
localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const
 a=new URLSearchParams(window.location.search).entries();for(var[t,e]of 
a)if(t.startsWith("docusaurus-data-")){var 
n=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
+<script>!function(){function 
t(t){document.documentElement.setAttribute("data-theme",t)}var 
e=function(){try{return new 
URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return
 
localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const
 a=new URLSearchParams(window.location.search).entries();for(var[t,e]of 
a)if(t.startsWith("docusaurus-data-")){var 
n=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
+important. However, navigating through a multitude of tools and
+languages often is a major inconvenience.
+Apache Wayang&#x27;s upcoming Python API will allow you to seamlessly
+orchestrate data processing tasks without ever leaving the comfort
+of Python, irrespective of the underlying framework written in Java.</p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" 
id="expanding-apache-wayangs-apis">Expanding Apache Wayang&#x27;s APIs<a 
href="#expanding-apache-wayangs-apis" class="hash-link" aria-label="Direct link 
to Expanding Apache Wayang&#x27;s APIs" title="Direct link to Expanding Apache 
Wayang&#x27;s APIs">​</a></h2>
+<p>Apache Wayang&#x27;s architecture decouples the process of planning from the
+resulting execution, allowing users to specify platform agnostic plans
+through the provided APIs.</p>
+<br>
+<img width="75%" alt="wayang stack" src="/img/architecture/wayang-stack.png">
+<br>
+<br>
+<p>Python&#x27;s popularity and convenience for data
+processing workloads makes it an obvious candidate for a desired API.
+Previous APIs, such as the Scala API <code>wayang-api-scala-java</code> 
benefited
+from the interoperability of Java and Scala that allows to reuse objects
+from other languages to provide new interfaces. Accessing JVM objects in
+Python is possible through several libraries, but in doing so,
+future APIs in other programming languages would need similar libraries and
+implementations in order to exist. As a contrast to that, providing an
+API within Apache Wayang that receives input plans from any source and
+executes them within allows to create plans and submit them in any
+programming language. The following figure shows the architecture of 
<code>pywayang</code>:</p>
+<br>
+<img width="75%" alt="pywayang stack" src="/img/architecture/pywayang.png">
+<br>
+<br>
+<p>The Python API allows users to specify WayangPlans with UDFs in Python.
+<code>pywayang</code> then serializes the UDFs and constructs the WayangPlan in
+JSON format, preparing it to be sent to Apache Wayang&#x27;s JSON API.
+When receiving a valid JSON plan, the JSON API uses the optimizer to
+construct an execution plan. However, since UDFs are defined in Python
+and thus need to be executed in Python as well, an operators function needs to 
be
+wrapped into a <code>WrappedPythonFunction</code>:</p>
+<div class="language-scala codeBlockContainer_Ckt0 theme-code-block" 
style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div 
class="codeBlockContent_biex"><pre tabindex="0" class="prism-code 
language-scala codeBlock_bY9V thin-scrollbar" 
style="color:#393A34;background-color:#f6f8fa"><code 
class="codeBlockLines_e6Vv"><span class="token-line" 
style="color:#393A34"><span class="token keyword" 
style="color:#00009f">val</span><span class="token plain"> mapOperator 
</span><span cla [...]
+<p>This wrapped functional descriptor allows to handle execution of
+UDFs in Python through a socket connection with the <code>pywayang</code> 
worker.
+Input data is sourced from the platform chosen by the optimizer and Apache
+Wayang handles routing the output data to the next operator.</p>
+<br>
+<p>A new API in any programming languages would have
+to specify two things:</p>
+<ul>
+<li>A way to create plans that conform to a JSON format specified in the
+Wayang JSON API.</li>
+<li>A <code>worker</code> that handles encoding and decoding of user defined
+functions (UDFs), as they need to
+be executed on iterables in their respective language.
+After that, the API can be added as a module in Wayang, so that
+operators will be wrapped and UDFs can be executed in the desired
+programming language.</li>
+</ul></div><footer class="row docusaurus-mt-lg"><div class="col 
col--9"><b>Tags:</b><ul class="tags_jXut padding--none margin-left--sm"><li 
class="tag_QGVx"><a class="tag_zVej tagRegular_sFm0" 
href="/blog/tags/wayang">wayang</a></li><li class="tag_QGVx"><a class="tag_zVej 
tagRegular_sFm0" href="/blog/tags/python">python</a></li></ul></div><div 
class="col text--right col--3"><a aria-label="Read more about Pywayang - Apache 
Wayang&#x27;s Python API" href="/blog/wayang-python-api"><b>Read M [...]
 Motivated by the learnings from last time, I stated implementing a Kafka 
Source component and a Kafka Sink component for the Apache Spark platform in 
Apache Wayang.
 In our previous article we shared the results of the work on the frist Apache 
Kafka integration using the Java Platform.</p>
 <p>Let&#x27;s see how it goes this time with Apache Spark.</p>
diff --git a/blog/kafka-meets-wayang-1/index.html 
b/blog/kafka-meets-wayang-1/index.html
index 5dd5b6f4..5b2e861a 100644
--- a/blog/kafka-meets-wayang-1/index.html
+++ b/blog/kafka-meets-wayang-1/index.html
@@ -5,11 +5,11 @@
 <meta name="generator" content="Docusaurus v3.1.1">
 <title data-rh="true">Apache Kafka meets Apache Wayang - Part 1 | Apache 
Wayang (incubating)</title><meta data-rh="true" name="viewport" 
content="width=device-width,initial-scale=1"><meta data-rh="true" 
name="twitter:card" content="summary_large_image"><meta data-rh="true" 
property="og:url" 
content="https://wayang.apache.org/blog/kafka-meets-wayang-1";><meta 
data-rh="true" property="og:locale" content="en"><meta data-rh="true" 
name="docusaurus_locale" content="en"><meta data-rh="true" nam [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" 
title="Apache Wayang (incubating) Atom Feed"><link rel="stylesheet" 
href="/assets/css/styles.ecf70413.css">
-<script src="/assets/js/runtime~main.47b6da99.js" defer="defer"></script>
-<script src="/assets/js/main.aeaeb384.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.c5c887b3.js" defer="defer"></script>
+<script src="/assets/js/main.160bc23e.js" defer="defer"></script>
 </head>
 <body class="navigation-with-keyboard">
-<script>!function(){function 
t(t){document.documentElement.setAttribute("data-theme",t)}var 
e=function(){try{return new 
URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return
 
localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const
 a=new URLSearchParams(window.location.search).entries();for(var[t,e]of 
a)if(t.startsWith("docusaurus-data-")){var 
n=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
+<script>!function(){function 
t(t){document.documentElement.setAttribute("data-theme",t)}var 
e=function(){try{return new 
URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return
 
localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const
 a=new URLSearchParams(window.location.search).entries();for(var[t,e]of 
a)if(t.startsWith("docusaurus-data-")){var 
n=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
 <p>This article is the first of a four part series about federated data 
analysis using Apache Wayang.
 The first article starts with an introduction of a typical data colaboration 
scenario which will emerge in our digital future.</p>
 <p>In part two and three we will share a summary of our Apache Kafka client 
implementation for Apache Wayang.
diff --git a/blog/kafka-meets-wayang-2/index.html 
b/blog/kafka-meets-wayang-2/index.html
index 64b9a6bb..fd978b5d 100644
--- a/blog/kafka-meets-wayang-2/index.html
+++ b/blog/kafka-meets-wayang-2/index.html
@@ -5,11 +5,11 @@
 <meta name="generator" content="Docusaurus v3.1.1">
 <title data-rh="true">Apache Kafka meets Apache Wayang - Part 2 | Apache 
Wayang (incubating)</title><meta data-rh="true" name="viewport" 
content="width=device-width,initial-scale=1"><meta data-rh="true" 
name="twitter:card" content="summary_large_image"><meta data-rh="true" 
property="og:url" 
content="https://wayang.apache.org/blog/kafka-meets-wayang-2";><meta 
data-rh="true" property="og:locale" content="en"><meta data-rh="true" 
name="docusaurus_locale" content="en"><meta data-rh="true" nam [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" 
title="Apache Wayang (incubating) Atom Feed"><link rel="stylesheet" 
href="/assets/css/styles.ecf70413.css">
-<script src="/assets/js/runtime~main.47b6da99.js" defer="defer"></script>
-<script src="/assets/js/main.aeaeb384.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.c5c887b3.js" defer="defer"></script>
+<script src="/assets/js/main.160bc23e.js" defer="defer"></script>
 </head>
 <body class="navigation-with-keyboard">
-<script>!function(){function 
t(t){document.documentElement.setAttribute("data-theme",t)}var 
e=function(){try{return new 
URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return
 
localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const
 a=new URLSearchParams(window.location.search).entries();for(var[t,e]of 
a)if(t.startsWith("docusaurus-data-")){var 
n=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
+<script>!function(){function 
t(t){document.documentElement.setAttribute("data-theme",t)}var 
e=function(){try{return new 
URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return
 
localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const
 a=new URLSearchParams(window.location.search).entries();for(var[t,e]of 
a)if(t.startsWith("docusaurus-data-")){var 
n=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
 We look into the “Read- and Write-Path” for our data items, called 
<em>DataQuanta</em>.</p>
 <h2 class="anchor anchorWithStickyNavbar_LWe7" 
id="apache-wayangs-read--write-path-for-kafka-topics">Apache Wayang’s Read 
&amp; Write Path for Kafka topics<a 
href="#apache-wayangs-read--write-path-for-kafka-topics" class="hash-link" 
aria-label="Direct link to Apache Wayang’s Read &amp; Write Path for Kafka 
topics" title="Direct link to Apache Wayang’s Read &amp; Write Path for Kafka 
topics">​</a></h2>
 <p>To describe the read and write paths for data in the context of the created 
Apache Wayang code snippet, the primary classes and interfaces we need to 
understand are as follows:</p>
diff --git a/blog/kafka-meets-wayang-3/index.html 
b/blog/kafka-meets-wayang-3/index.html
index d964b558..cb1fb44f 100644
--- a/blog/kafka-meets-wayang-3/index.html
+++ b/blog/kafka-meets-wayang-3/index.html
@@ -5,11 +5,11 @@
 <meta name="generator" content="Docusaurus v3.1.1">
 <title data-rh="true">Apache Kafka meets Apache Wayang - Part 3 | Apache 
Wayang (incubating)</title><meta data-rh="true" name="viewport" 
content="width=device-width,initial-scale=1"><meta data-rh="true" 
name="twitter:card" content="summary_large_image"><meta data-rh="true" 
property="og:url" 
content="https://wayang.apache.org/blog/kafka-meets-wayang-3";><meta 
data-rh="true" property="og:locale" content="en"><meta data-rh="true" 
name="docusaurus_locale" content="en"><meta data-rh="true" nam [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" 
title="Apache Wayang (incubating) Atom Feed"><link rel="stylesheet" 
href="/assets/css/styles.ecf70413.css">
-<script src="/assets/js/runtime~main.47b6da99.js" defer="defer"></script>
-<script src="/assets/js/main.aeaeb384.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.c5c887b3.js" defer="defer"></script>
+<script src="/assets/js/main.160bc23e.js" defer="defer"></script>
 </head>
 <body class="navigation-with-keyboard">
-<script>!function(){function 
t(t){document.documentElement.setAttribute("data-theme",t)}var 
e=function(){try{return new 
URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return
 
localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const
 a=new URLSearchParams(window.location.search).entries();for(var[t,e]of 
a)if(t.startsWith("docusaurus-data-")){var 
n=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
+<script>!function(){function 
t(t){document.documentElement.setAttribute("data-theme",t)}var 
e=function(){try{return new 
URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return
 
localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const
 a=new URLSearchParams(window.location.search).entries();for(var[t,e]of 
a)if(t.startsWith("docusaurus-data-")){var 
n=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
 Motivated by the learnings from last time, I stated implementing a Kafka 
Source component and a Kafka Sink component for the Apache Spark platform in 
Apache Wayang.
 In our previous article we shared the results of the work on the frist Apache 
Kafka integration using the Java Platform.</p>
 <p>Let&#x27;s see how it goes this time with Apache Spark.</p>
@@ -74,7 +74,7 @@ More testing, more serialization schemes, and Kafka Schema 
Registry support shou
 <h2 class="anchor anchorWithStickyNavbar_LWe7" id="outlook">Outlook<a 
href="#outlook" class="hash-link" aria-label="Direct link to Outlook" 
title="Direct link to Outlook">​</a></h2>
 <p>The next part of the article series will cover the real world example as 
described in image 1.
 We will show how analysts and developers can use the Apache Kafka integration 
for Apache Wayang to solve cross organizational collaboration issues.
-Therefore, we will bring all puzzles together, and show the full 
implementation of the multi organizational data collaboration use 
case.</p></div><footer class="row docusaurus-mt-lg 
blogPostFooterDetailsFull_mRVl"><div class="col"><b>Tags:</b><ul 
class="tags_jXut padding--none margin-left--sm"><li class="tag_QGVx"><a 
class="tag_zVej tagRegular_sFm0" href="/blog/tags/wayang">wayang</a></li><li 
class="tag_QGVx"><a class="tag_zVej tagRegular_sFm0" 
href="/blog/tags/kafka">kafka</a></li><li c [...]
+Therefore, we will bring all puzzles together, and show the full 
implementation of the multi organizational data collaboration use 
case.</p></div><footer class="row docusaurus-mt-lg 
blogPostFooterDetailsFull_mRVl"><div class="col"><b>Tags:</b><ul 
class="tags_jXut padding--none margin-left--sm"><li class="tag_QGVx"><a 
class="tag_zVej tagRegular_sFm0" href="/blog/tags/wayang">wayang</a></li><li 
class="tag_QGVx"><a class="tag_zVej tagRegular_sFm0" 
href="/blog/tags/kafka">kafka</a></li><li c [...]
       <p> Apache Wayang is an effort undergoing incubation at The Apache 
Software Foundation (ASF), sponsored by the Apache Incubator. 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 th [...]
       <p>
         Copyright © 2024 The Apache Software Foundation, Licensed under the 
Apache License, Version 2.0. <br>
diff --git a/blog/rss.xml b/blog/rss.xml
index e13de640..0239c301 100644
--- a/blog/rss.xml
+++ b/blog/rss.xml
@@ -4,10 +4,103 @@
         <title>Apache Wayang (incubating) Blog</title>
         <link>https://wayang.apache.org/blog</link>
         <description>Apache Wayang (incubating) Blog</description>
-        <lastBuildDate>Sun, 10 Mar 2024 00:00:00 GMT</lastBuildDate>
+        <lastBuildDate>Tue, 09 Apr 2024 00:00:00 GMT</lastBuildDate>
         <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
         <generator>https://github.com/jpmonette/feed</generator>
         <language>en</language>
+        <item>
+            <title><![CDATA[Pywayang - Apache Wayang's Python API]]></title>
+            <link>https://wayang.apache.org/blog/wayang-python-api</link>
+            <guid>https://wayang.apache.org/blog/wayang-python-api</guid>
+            <pubDate>Tue, 09 Apr 2024 00:00:00 GMT</pubDate>
+            <description><![CDATA[In the vast landscape of data processing, 
efficiency and flexibility are]]></description>
+            <content:encoded><![CDATA[<p>In the vast landscape of data 
processing, efficiency and flexibility are
+important. However, navigating through a multitude of tools and
+languages often is a major inconvenience.
+Apache Wayang's upcoming Python API will allow you to seamlessly
+orchestrate data processing tasks without ever leaving the comfort
+of Python, irrespective of the underlying framework written in Java.</p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" 
id="expanding-apache-wayangs-apis">Expanding Apache Wayang's APIs<a 
href="https://wayang.apache.org/blog/wayang-python-api#expanding-apache-wayangs-apis";
 class="hash-link" aria-label="Direct link to Expanding Apache Wayang's APIs" 
title="Direct link to Expanding Apache Wayang's APIs">​</a></h2>
+<p>Apache Wayang's architecture decouples the process of planning from the
+resulting execution, allowing users to specify platform agnostic plans
+through the provided APIs.</p>
+<br>
+<img width="75%" alt="wayang stack" 
src="https://wayang.apache.org/img/architecture/wayang-stack.png";>
+<br>
+<br>
+<p>Python's popularity and convenience for data
+processing workloads makes it an obvious candidate for a desired API.
+Previous APIs, such as the Scala API <code>wayang-api-scala-java</code> 
benefited
+from the interoperability of Java and Scala that allows to reuse objects
+from other languages to provide new interfaces. Accessing JVM objects in
+Python is possible through several libraries, but in doing so,
+future APIs in other programming languages would need similar libraries and
+implementations in order to exist. As a contrast to that, providing an
+API within Apache Wayang that receives input plans from any source and
+executes them within allows to create plans and submit them in any
+programming language. The following figure shows the architecture of 
<code>pywayang</code>:</p>
+<br>
+<img width="75%" alt="pywayang stack" 
src="https://wayang.apache.org/img/architecture/pywayang.png";>
+<br>
+<br>
+<p>The Python API allows users to specify WayangPlans with UDFs in Python.
+<code>pywayang</code> then serializes the UDFs and constructs the WayangPlan in
+JSON format, preparing it to be sent to Apache Wayang's JSON API.
+When receiving a valid JSON plan, the JSON API uses the optimizer to
+construct an execution plan. However, since UDFs are defined in Python
+and thus need to be executed in Python as well, an operators function needs to 
be
+wrapped into a <code>WrappedPythonFunction</code>:</p>
+<div class="language-scala codeBlockContainer_Ckt0 theme-code-block" 
style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div 
class="codeBlockContent_biex"><pre tabindex="0" class="prism-code 
language-scala codeBlock_bY9V thin-scrollbar" 
style="color:#393A34;background-color:#f6f8fa"><code 
class="codeBlockLines_e6Vv"><span class="token-line" 
style="color:#393A34"><span class="token keyword" 
style="color:#00009f">val</span><span class="token plain"> mapOperator 
</span><span cla [...]
+<p>This wrapped functional descriptor allows to handle execution of
+UDFs in Python through a socket connection with the <code>pywayang</code> 
worker.
+Input data is sourced from the platform chosen by the optimizer and Apache
+Wayang handles routing the output data to the next operator.</p>
+<br>
+<p>A new API in any programming languages would have
+to specify two things:</p>
+<ul>
+<li>A way to create plans that conform to a JSON format specified in the
+Wayang JSON API.</li>
+<li>A <code>worker</code> that handles encoding and decoding of user defined
+functions (UDFs), as they need to
+be executed on iterables in their respective language.
+After that, the API can be added as a module in Wayang, so that
+operators will be wrapped and UDFs can be executed in the desired
+programming language.</li>
+</ul>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" 
id="defining-wayangplans-in-python">Defining WayangPlans in Python<a 
href="https://wayang.apache.org/blog/wayang-python-api#defining-wayangplans-in-python";
 class="hash-link" aria-label="Direct link to Defining WayangPlans in Python" 
title="Direct link to Defining WayangPlans in Python">​</a></h2>
+<p>As the "Hello World!" of data processing systems, wordcount will pose as
+our primary example to display how users can interact with Apache Wayang
+through the python package <code>pywayang</code>.</p>
+<div class="language-python codeBlockContainer_Ckt0 theme-code-block" 
style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div 
class="codeBlockContent_biex"><pre tabindex="0" class="prism-code 
language-python codeBlock_bY9V thin-scrollbar" 
style="color:#393A34;background-color:#f6f8fa"><code 
class="codeBlockLines_e6Vv"><span class="token-line" 
style="color:#393A34"><span class="token keyword" 
style="color:#00009f">from</span><span class="token plain"> pywy</span><span 
class="t [...]
+<p>The example displays a mode of operation that resembles the Scala
+<code>PlanBuilder</code> and the <code>JavaPlanBuilder</code>. Plans are 
specified in a
+functional way, chaining operations until a terminal operation results
+in execution of the plan.</p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" 
id="wayang-api-json">Wayang-API-JSON<a 
href="https://wayang.apache.org/blog/wayang-python-api#wayang-api-json"; 
class="hash-link" aria-label="Direct link to Wayang-API-JSON" title="Direct 
link to Wayang-API-JSON">​</a></h2>
+<p>The <code>wayang-api-json</code> module provides an executable that starts 
a REST
+server. This server accepts a <code>WayangPlan</code> in JSON format.
+Starting the REST API as a background process can be done by executing
+the following:</p>
+<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" 
style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div 
class="codeBlockContent_biex"><pre tabindex="0" class="prism-code 
language-shell codeBlock_bY9V thin-scrollbar" 
style="color:#393A34;background-color:#f6f8fa"><code 
class="codeBlockLines_e6Vv"><span class="token-line" 
style="color:#393A34"><span class="token plain">mvn clean package </span><span 
class="token parameter variable" style="color:#36acaa">-pl [...]
+<h2 class="anchor anchorWithStickyNavbar_LWe7" 
id="wrapping-pipelines-in-mappartition-operators">Wrapping pipelines in 
MapPartition operators<a 
href="https://wayang.apache.org/blog/wayang-python-api#wrapping-pipelines-in-mappartition-operators";
 class="hash-link" aria-label="Direct link to Wrapping pipelines in 
MapPartition operators" title="Direct link to Wrapping pipelines in 
MapPartition operators">​</a></h2>
+<p>With this architecture, the execution of an operator comes with an
+additional overhead, because the UDFs will have to be executed in
+python. Python operators receive iterators through a socket and also
+return their result to Wayang through that connection. To minimize the
+overhead, unary operators that return unary results will be grouped in
+pipelines. One pipeline of operators will be submitted to the Wayang
+JSON API as a single <code>MapPartition</code> operator. This means that the 
UDFs
+specified in this pipeline can be chained and only on call from Wayang
+to the Python worker will have to be made for a given pipeline.</p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="coming-soon">Coming soon<a 
href="https://wayang.apache.org/blog/wayang-python-api#coming-soon"; 
class="hash-link" aria-label="Direct link to Coming soon" title="Direct link to 
Coming soon">​</a></h2>
+<p>As the Python API is currently in development and we are applying
+finishing touches, this article serves as an outlook for what users can
+expect to see soon.</p>
+<p>Author: <a href="https://github.com/juripetersen"; target="_blank" 
rel="noopener noreferrer">juripetersen</a></p>]]></content:encoded>
+            <category>wayang</category>
+            <category>python</category>
+        </item>
         <item>
             <title><![CDATA[Apache Kafka meets Apache Wayang - Part 
3]]></title>
             <link>https://wayang.apache.org/blog/kafka-meets-wayang-3</link>
diff --git a/blog/tags/cross-organization-data-collaboration/index.html 
b/blog/tags/cross-organization-data-collaboration/index.html
index 55322af6..f6278dc0 100644
--- a/blog/tags/cross-organization-data-collaboration/index.html
+++ b/blog/tags/cross-organization-data-collaboration/index.html
@@ -5,11 +5,11 @@
 <meta name="generator" content="Docusaurus v3.1.1">
 <title data-rh="true">3 posts tagged with &quot;cross organization data 
collaboration&quot; | Apache Wayang (incubating)</title><meta data-rh="true" 
name="viewport" content="width=device-width,initial-scale=1"><meta 
data-rh="true" name="twitter:card" content="summary_large_image"><meta 
data-rh="true" property="og:url" 
content="https://wayang.apache.org/blog/tags/cross-organization-data-collaboration";><meta
 data-rh="true" property="og:locale" content="en"><meta data-rh="true" 
name="docusa [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" 
title="Apache Wayang (incubating) Atom Feed"><link rel="stylesheet" 
href="/assets/css/styles.ecf70413.css">
-<script src="/assets/js/runtime~main.47b6da99.js" defer="defer"></script>
-<script src="/assets/js/main.aeaeb384.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.c5c887b3.js" defer="defer"></script>
+<script src="/assets/js/main.160bc23e.js" defer="defer"></script>
 </head>
 <body class="navigation-with-keyboard">
-<script>!function(){function 
t(t){document.documentElement.setAttribute("data-theme",t)}var 
e=function(){try{return new 
URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return
 
localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const
 a=new URLSearchParams(window.location.search).entries();for(var[t,e]of 
a)if(t.startsWith("docusaurus-data-")){var 
n=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
+<script>!function(){function 
t(t){document.documentElement.setAttribute("data-theme",t)}var 
e=function(){try{return new 
URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return
 
localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const
 a=new URLSearchParams(window.location.search).entries();for(var[t,e]of 
a)if(t.startsWith("docusaurus-data-")){var 
n=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
 Motivated by the learnings from last time, I stated implementing a Kafka 
Source component and a Kafka Sink component for the Apache Spark platform in 
Apache Wayang.
 In our previous article we shared the results of the work on the frist Apache 
Kafka integration using the Java Platform.</p>
 <p>Let&#x27;s see how it goes this time with Apache Spark.</p>
diff --git a/blog/tags/index.html b/blog/tags/index.html
index 3add2fd3..8125ff92 100644
--- a/blog/tags/index.html
+++ b/blog/tags/index.html
@@ -5,11 +5,11 @@
 <meta name="generator" content="Docusaurus v3.1.1">
 <title data-rh="true">Tags | Apache Wayang (incubating)</title><meta 
data-rh="true" name="viewport" 
content="width=device-width,initial-scale=1"><meta data-rh="true" 
name="twitter:card" content="summary_large_image"><meta data-rh="true" 
property="og:url" content="https://wayang.apache.org/blog/tags";><meta 
data-rh="true" property="og:locale" content="en"><meta data-rh="true" 
name="docusaurus_locale" content="en"><meta data-rh="true" 
name="docsearch:language" content="en"><meta data-rh="tr [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" 
title="Apache Wayang (incubating) Atom Feed"><link rel="stylesheet" 
href="/assets/css/styles.ecf70413.css">
-<script src="/assets/js/runtime~main.47b6da99.js" defer="defer"></script>
-<script src="/assets/js/main.aeaeb384.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.c5c887b3.js" defer="defer"></script>
+<script src="/assets/js/main.160bc23e.js" defer="defer"></script>
 </head>
 <body class="navigation-with-keyboard">
-<script>!function(){function 
t(t){document.documentElement.setAttribute("data-theme",t)}var 
e=function(){try{return new 
URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return
 
localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const
 a=new URLSearchParams(window.location.search).entries();for(var[t,e]of 
a)if(t.startsWith("docusaurus-data-")){var 
n=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
+<script>!function(){function 
t(t){document.documentElement.setAttribute("data-theme",t)}var 
e=function(){try{return new 
URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return
 
localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const
 a=new URLSearchParams(window.location.search).entries();for(var[t,e]of 
a)if(t.startsWith("docusaurus-data-")){var 
n=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
       <p> Apache Wayang is an effort undergoing incubation at The Apache 
Software Foundation (ASF), sponsored by the Apache Incubator. 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 th [...]
       <p>
         Copyright © 2024 The Apache Software Foundation, Licensed under the 
Apache License, Version 2.0. <br>
diff --git a/blog/tags/kafka/index.html b/blog/tags/kafka/index.html
index ca0c89fe..637a75dd 100644
--- a/blog/tags/kafka/index.html
+++ b/blog/tags/kafka/index.html
@@ -5,11 +5,11 @@
 <meta name="generator" content="Docusaurus v3.1.1">
 <title data-rh="true">3 posts tagged with &quot;kafka&quot; | Apache Wayang 
(incubating)</title><meta data-rh="true" name="viewport" 
content="width=device-width,initial-scale=1"><meta data-rh="true" 
name="twitter:card" content="summary_large_image"><meta data-rh="true" 
property="og:url" content="https://wayang.apache.org/blog/tags/kafka";><meta 
data-rh="true" property="og:locale" content="en"><meta data-rh="true" 
name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:l 
[...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" 
title="Apache Wayang (incubating) Atom Feed"><link rel="stylesheet" 
href="/assets/css/styles.ecf70413.css">
-<script src="/assets/js/runtime~main.47b6da99.js" defer="defer"></script>
-<script src="/assets/js/main.aeaeb384.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.c5c887b3.js" defer="defer"></script>
+<script src="/assets/js/main.160bc23e.js" defer="defer"></script>
 </head>
 <body class="navigation-with-keyboard">
-<script>!function(){function 
t(t){document.documentElement.setAttribute("data-theme",t)}var 
e=function(){try{return new 
URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return
 
localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const
 a=new URLSearchParams(window.location.search).entries();for(var[t,e]of 
a)if(t.startsWith("docusaurus-data-")){var 
n=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
+<script>!function(){function 
t(t){document.documentElement.setAttribute("data-theme",t)}var 
e=function(){try{return new 
URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return
 
localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const
 a=new URLSearchParams(window.location.search).entries();for(var[t,e]of 
a)if(t.startsWith("docusaurus-data-")){var 
n=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
 Motivated by the learnings from last time, I stated implementing a Kafka 
Source component and a Kafka Sink component for the Apache Spark platform in 
Apache Wayang.
 In our previous article we shared the results of the work on the frist Apache 
Kafka integration using the Java Platform.</p>
 <p>Let&#x27;s see how it goes this time with Apache Spark.</p>
diff --git a/blog/tags/presto/index.html b/blog/tags/presto/index.html
index 8efff135..c606ce1a 100644
--- a/blog/tags/presto/index.html
+++ b/blog/tags/presto/index.html
@@ -5,11 +5,11 @@
 <meta name="generator" content="Docusaurus v3.1.1">
 <title data-rh="true">One post tagged with &quot;presto&quot; | Apache Wayang 
(incubating)</title><meta data-rh="true" name="viewport" 
content="width=device-width,initial-scale=1"><meta data-rh="true" 
name="twitter:card" content="summary_large_image"><meta data-rh="true" 
property="og:url" content="https://wayang.apache.org/blog/tags/presto";><meta 
data-rh="true" property="og:locale" content="en"><meta data-rh="true" 
name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearc [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" 
title="Apache Wayang (incubating) Atom Feed"><link rel="stylesheet" 
href="/assets/css/styles.ecf70413.css">
-<script src="/assets/js/runtime~main.47b6da99.js" defer="defer"></script>
-<script src="/assets/js/main.aeaeb384.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.c5c887b3.js" defer="defer"></script>
+<script src="/assets/js/main.160bc23e.js" defer="defer"></script>
 </head>
 <body class="navigation-with-keyboard">
-<script>!function(){function 
t(t){document.documentElement.setAttribute("data-theme",t)}var 
e=function(){try{return new 
URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return
 
localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const
 a=new URLSearchParams(window.location.search).entries();for(var[t,e]of 
a)if(t.startsWith("docusaurus-data-")){var 
n=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
+<script>!function(){function 
t(t){document.documentElement.setAttribute("data-theme",t)}var 
e=function(){try{return new 
URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return
 
localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const
 a=new URLSearchParams(window.location.search).entries();for(var[t,e]of 
a)if(t.startsWith("docusaurus-data-")){var 
n=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
       <p> Apache Wayang is an effort undergoing incubation at The Apache 
Software Foundation (ASF), sponsored by the Apache Incubator. 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 th [...]
       <p>
         Copyright © 2024 The Apache Software Foundation, Licensed under the 
Apache License, Version 2.0. <br>
diff --git a/blog/tags/python/index.html b/blog/tags/python/index.html
new file mode 100644
index 00000000..1bd2d9ef
--- /dev/null
+++ b/blog/tags/python/index.html
@@ -0,0 +1,73 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="blog-wrapper blog-tags-post-list-page 
plugin-blog plugin-id-default" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.1.1">
+<title data-rh="true">One post tagged with &quot;python&quot; | Apache Wayang 
(incubating)</title><meta data-rh="true" name="viewport" 
content="width=device-width,initial-scale=1"><meta data-rh="true" 
name="twitter:card" content="summary_large_image"><meta data-rh="true" 
property="og:url" content="https://wayang.apache.org/blog/tags/python";><meta 
data-rh="true" property="og:locale" content="en"><meta data-rh="true" 
name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearc [...]
+<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" 
title="Apache Wayang (incubating) Atom Feed"><link rel="stylesheet" 
href="/assets/css/styles.ecf70413.css">
+<script src="/assets/js/runtime~main.c5c887b3.js" defer="defer"></script>
+<script src="/assets/js/main.160bc23e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<script>!function(){function 
t(t){document.documentElement.setAttribute("data-theme",t)}var 
e=function(){try{return new 
URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return
 
localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const
 a=new URLSearchParams(window.location.search).entries();for(var[t,e]of 
a)if(t.startsWith("docusaurus-data-")){var 
n=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
+important. However, navigating through a multitude of tools and
+languages often is a major inconvenience.
+Apache Wayang&#x27;s upcoming Python API will allow you to seamlessly
+orchestrate data processing tasks without ever leaving the comfort
+of Python, irrespective of the underlying framework written in Java.</p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" 
id="expanding-apache-wayangs-apis">Expanding Apache Wayang&#x27;s APIs<a 
href="#expanding-apache-wayangs-apis" class="hash-link" aria-label="Direct link 
to Expanding Apache Wayang&#x27;s APIs" title="Direct link to Expanding Apache 
Wayang&#x27;s APIs">​</a></h2>
+<p>Apache Wayang&#x27;s architecture decouples the process of planning from the
+resulting execution, allowing users to specify platform agnostic plans
+through the provided APIs.</p>
+<br>
+<img width="75%" alt="wayang stack" src="/img/architecture/wayang-stack.png">
+<br>
+<br>
+<p>Python&#x27;s popularity and convenience for data
+processing workloads makes it an obvious candidate for a desired API.
+Previous APIs, such as the Scala API <code>wayang-api-scala-java</code> 
benefited
+from the interoperability of Java and Scala that allows to reuse objects
+from other languages to provide new interfaces. Accessing JVM objects in
+Python is possible through several libraries, but in doing so,
+future APIs in other programming languages would need similar libraries and
+implementations in order to exist. As a contrast to that, providing an
+API within Apache Wayang that receives input plans from any source and
+executes them within allows to create plans and submit them in any
+programming language. The following figure shows the architecture of 
<code>pywayang</code>:</p>
+<br>
+<img width="75%" alt="pywayang stack" src="/img/architecture/pywayang.png">
+<br>
+<br>
+<p>The Python API allows users to specify WayangPlans with UDFs in Python.
+<code>pywayang</code> then serializes the UDFs and constructs the WayangPlan in
+JSON format, preparing it to be sent to Apache Wayang&#x27;s JSON API.
+When receiving a valid JSON plan, the JSON API uses the optimizer to
+construct an execution plan. However, since UDFs are defined in Python
+and thus need to be executed in Python as well, an operators function needs to 
be
+wrapped into a <code>WrappedPythonFunction</code>:</p>
+<div class="language-scala codeBlockContainer_Ckt0 theme-code-block" 
style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div 
class="codeBlockContent_biex"><pre tabindex="0" class="prism-code 
language-scala codeBlock_bY9V thin-scrollbar" 
style="color:#393A34;background-color:#f6f8fa"><code 
class="codeBlockLines_e6Vv"><span class="token-line" 
style="color:#393A34"><span class="token keyword" 
style="color:#00009f">val</span><span class="token plain"> mapOperator 
</span><span cla [...]
+<p>This wrapped functional descriptor allows to handle execution of
+UDFs in Python through a socket connection with the <code>pywayang</code> 
worker.
+Input data is sourced from the platform chosen by the optimizer and Apache
+Wayang handles routing the output data to the next operator.</p>
+<br>
+<p>A new API in any programming languages would have
+to specify two things:</p>
+<ul>
+<li>A way to create plans that conform to a JSON format specified in the
+Wayang JSON API.</li>
+<li>A <code>worker</code> that handles encoding and decoding of user defined
+functions (UDFs), as they need to
+be executed on iterables in their respective language.
+After that, the API can be added as a module in Wayang, so that
+operators will be wrapped and UDFs can be executed in the desired
+programming language.</li>
+</ul></div><footer class="row docusaurus-mt-lg"><div class="col 
col--9"><b>Tags:</b><ul class="tags_jXut padding--none margin-left--sm"><li 
class="tag_QGVx"><a class="tag_zVej tagRegular_sFm0" 
href="/blog/tags/wayang">wayang</a></li><li class="tag_QGVx"><a class="tag_zVej 
tagRegular_sFm0" href="/blog/tags/python">python</a></li></ul></div><div 
class="col text--right col--3"><a aria-label="Read more about Pywayang - Apache 
Wayang&#x27;s Python API" href="/blog/wayang-python-api"><b>Read M [...]
+      <p> Apache Wayang is an effort undergoing incubation at The Apache 
Software Foundation (ASF), sponsored by the Apache Incubator. 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 th [...]
+      <p>
+        Copyright © 2024 The Apache Software Foundation, Licensed under the 
Apache License, Version 2.0. <br>
+        Apache, the names of Apache projects, and the feather logo are either 
registered trademarks or trademarks of the Apache Software Foundation in the 
United States and/or other countries.
+      </p>
+      </div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/blog/tags/spark/index.html b/blog/tags/spark/index.html
index d5f25bbd..053f9676 100644
--- a/blog/tags/spark/index.html
+++ b/blog/tags/spark/index.html
@@ -5,11 +5,11 @@
 <meta name="generator" content="Docusaurus v3.1.1">
 <title data-rh="true">One post tagged with &quot;spark&quot; | Apache Wayang 
(incubating)</title><meta data-rh="true" name="viewport" 
content="width=device-width,initial-scale=1"><meta data-rh="true" 
name="twitter:card" content="summary_large_image"><meta data-rh="true" 
property="og:url" content="https://wayang.apache.org/blog/tags/spark";><meta 
data-rh="true" property="og:locale" content="en"><meta data-rh="true" 
name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch: 
[...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" 
title="Apache Wayang (incubating) Atom Feed"><link rel="stylesheet" 
href="/assets/css/styles.ecf70413.css">
-<script src="/assets/js/runtime~main.47b6da99.js" defer="defer"></script>
-<script src="/assets/js/main.aeaeb384.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.c5c887b3.js" defer="defer"></script>
+<script src="/assets/js/main.160bc23e.js" defer="defer"></script>
 </head>
 <body class="navigation-with-keyboard">
-<script>!function(){function 
t(t){document.documentElement.setAttribute("data-theme",t)}var 
e=function(){try{return new 
URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return
 
localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const
 a=new URLSearchParams(window.location.search).entries();for(var[t,e]of 
a)if(t.startsWith("docusaurus-data-")){var 
n=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
+<script>!function(){function 
t(t){document.documentElement.setAttribute("data-theme",t)}var 
e=function(){try{return new 
URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return
 
localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const
 a=new URLSearchParams(window.location.search).entries();for(var[t,e]of 
a)if(t.startsWith("docusaurus-data-")){var 
n=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
 Motivated by the learnings from last time, I stated implementing a Kafka 
Source component and a Kafka Sink component for the Apache Spark platform in 
Apache Wayang.
 In our previous article we shared the results of the work on the frist Apache 
Kafka integration using the Java Platform.</p>
 <p>Let&#x27;s see how it goes this time with Apache Spark.</p>
diff --git a/blog/tags/trino/index.html b/blog/tags/trino/index.html
index abe7e813..729bfa9f 100644
--- a/blog/tags/trino/index.html
+++ b/blog/tags/trino/index.html
@@ -5,11 +5,11 @@
 <meta name="generator" content="Docusaurus v3.1.1">
 <title data-rh="true">One post tagged with &quot;trino&quot; | Apache Wayang 
(incubating)</title><meta data-rh="true" name="viewport" 
content="width=device-width,initial-scale=1"><meta data-rh="true" 
name="twitter:card" content="summary_large_image"><meta data-rh="true" 
property="og:url" content="https://wayang.apache.org/blog/tags/trino";><meta 
data-rh="true" property="og:locale" content="en"><meta data-rh="true" 
name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch: 
[...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" 
title="Apache Wayang (incubating) Atom Feed"><link rel="stylesheet" 
href="/assets/css/styles.ecf70413.css">
-<script src="/assets/js/runtime~main.47b6da99.js" defer="defer"></script>
-<script src="/assets/js/main.aeaeb384.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.c5c887b3.js" defer="defer"></script>
+<script src="/assets/js/main.160bc23e.js" defer="defer"></script>
 </head>
 <body class="navigation-with-keyboard">
-<script>!function(){function 
t(t){document.documentElement.setAttribute("data-theme",t)}var 
e=function(){try{return new 
URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return
 
localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const
 a=new URLSearchParams(window.location.search).entries();for(var[t,e]of 
a)if(t.startsWith("docusaurus-data-")){var 
n=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
+<script>!function(){function 
t(t){document.documentElement.setAttribute("data-theme",t)}var 
e=function(){try{return new 
URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return
 
localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const
 a=new URLSearchParams(window.location.search).entries();for(var[t,e]of 
a)if(t.startsWith("docusaurus-data-")){var 
n=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
       <p> Apache Wayang is an effort undergoing incubation at The Apache 
Software Foundation (ASF), sponsored by the Apache Incubator. 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 th [...]
       <p>
         Copyright © 2024 The Apache Software Foundation, Licensed under the 
Apache License, Version 2.0. <br>
diff --git a/blog/tags/wayang/index.html b/blog/tags/wayang/index.html
index 3b5ef7f2..03824a6c 100644
--- a/blog/tags/wayang/index.html
+++ b/blog/tags/wayang/index.html
@@ -3,13 +3,66 @@
 <head>
 <meta charset="UTF-8">
 <meta name="generator" content="Docusaurus v3.1.1">
-<title data-rh="true">5 posts tagged with &quot;wayang&quot; | Apache Wayang 
(incubating)</title><meta data-rh="true" name="viewport" 
content="width=device-width,initial-scale=1"><meta data-rh="true" 
name="twitter:card" content="summary_large_image"><meta data-rh="true" 
property="og:url" content="https://wayang.apache.org/blog/tags/wayang";><meta 
data-rh="true" property="og:locale" content="en"><meta data-rh="true" 
name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch [...]
+<title data-rh="true">6 posts tagged with &quot;wayang&quot; | Apache Wayang 
(incubating)</title><meta data-rh="true" name="viewport" 
content="width=device-width,initial-scale=1"><meta data-rh="true" 
name="twitter:card" content="summary_large_image"><meta data-rh="true" 
property="og:url" content="https://wayang.apache.org/blog/tags/wayang";><meta 
data-rh="true" property="og:locale" content="en"><meta data-rh="true" 
name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" 
title="Apache Wayang (incubating) Atom Feed"><link rel="stylesheet" 
href="/assets/css/styles.ecf70413.css">
-<script src="/assets/js/runtime~main.47b6da99.js" defer="defer"></script>
-<script src="/assets/js/main.aeaeb384.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.c5c887b3.js" defer="defer"></script>
+<script src="/assets/js/main.160bc23e.js" defer="defer"></script>
 </head>
 <body class="navigation-with-keyboard">
-<script>!function(){function 
t(t){document.documentElement.setAttribute("data-theme",t)}var 
e=function(){try{return new 
URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return
 
localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const
 a=new URLSearchParams(window.location.search).entries();for(var[t,e]of 
a)if(t.startsWith("docusaurus-data-")){var 
n=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
+<script>!function(){function 
t(t){document.documentElement.setAttribute("data-theme",t)}var 
e=function(){try{return new 
URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return
 
localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const
 a=new URLSearchParams(window.location.search).entries();for(var[t,e]of 
a)if(t.startsWith("docusaurus-data-")){var 
n=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
+important. However, navigating through a multitude of tools and
+languages often is a major inconvenience.
+Apache Wayang&#x27;s upcoming Python API will allow you to seamlessly
+orchestrate data processing tasks without ever leaving the comfort
+of Python, irrespective of the underlying framework written in Java.</p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" 
id="expanding-apache-wayangs-apis">Expanding Apache Wayang&#x27;s APIs<a 
href="#expanding-apache-wayangs-apis" class="hash-link" aria-label="Direct link 
to Expanding Apache Wayang&#x27;s APIs" title="Direct link to Expanding Apache 
Wayang&#x27;s APIs">​</a></h2>
+<p>Apache Wayang&#x27;s architecture decouples the process of planning from the
+resulting execution, allowing users to specify platform agnostic plans
+through the provided APIs.</p>
+<br>
+<img width="75%" alt="wayang stack" src="/img/architecture/wayang-stack.png">
+<br>
+<br>
+<p>Python&#x27;s popularity and convenience for data
+processing workloads makes it an obvious candidate for a desired API.
+Previous APIs, such as the Scala API <code>wayang-api-scala-java</code> 
benefited
+from the interoperability of Java and Scala that allows to reuse objects
+from other languages to provide new interfaces. Accessing JVM objects in
+Python is possible through several libraries, but in doing so,
+future APIs in other programming languages would need similar libraries and
+implementations in order to exist. As a contrast to that, providing an
+API within Apache Wayang that receives input plans from any source and
+executes them within allows to create plans and submit them in any
+programming language. The following figure shows the architecture of 
<code>pywayang</code>:</p>
+<br>
+<img width="75%" alt="pywayang stack" src="/img/architecture/pywayang.png">
+<br>
+<br>
+<p>The Python API allows users to specify WayangPlans with UDFs in Python.
+<code>pywayang</code> then serializes the UDFs and constructs the WayangPlan in
+JSON format, preparing it to be sent to Apache Wayang&#x27;s JSON API.
+When receiving a valid JSON plan, the JSON API uses the optimizer to
+construct an execution plan. However, since UDFs are defined in Python
+and thus need to be executed in Python as well, an operators function needs to 
be
+wrapped into a <code>WrappedPythonFunction</code>:</p>
+<div class="language-scala codeBlockContainer_Ckt0 theme-code-block" 
style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div 
class="codeBlockContent_biex"><pre tabindex="0" class="prism-code 
language-scala codeBlock_bY9V thin-scrollbar" 
style="color:#393A34;background-color:#f6f8fa"><code 
class="codeBlockLines_e6Vv"><span class="token-line" 
style="color:#393A34"><span class="token keyword" 
style="color:#00009f">val</span><span class="token plain"> mapOperator 
</span><span cla [...]
+<p>This wrapped functional descriptor allows to handle execution of
+UDFs in Python through a socket connection with the <code>pywayang</code> 
worker.
+Input data is sourced from the platform chosen by the optimizer and Apache
+Wayang handles routing the output data to the next operator.</p>
+<br>
+<p>A new API in any programming languages would have
+to specify two things:</p>
+<ul>
+<li>A way to create plans that conform to a JSON format specified in the
+Wayang JSON API.</li>
+<li>A <code>worker</code> that handles encoding and decoding of user defined
+functions (UDFs), as they need to
+be executed on iterables in their respective language.
+After that, the API can be added as a module in Wayang, so that
+operators will be wrapped and UDFs can be executed in the desired
+programming language.</li>
+</ul></div><footer class="row docusaurus-mt-lg"><div class="col 
col--9"><b>Tags:</b><ul class="tags_jXut padding--none margin-left--sm"><li 
class="tag_QGVx"><a class="tag_zVej tagRegular_sFm0" 
href="/blog/tags/wayang">wayang</a></li><li class="tag_QGVx"><a class="tag_zVej 
tagRegular_sFm0" href="/blog/tags/python">python</a></li></ul></div><div 
class="col text--right col--3"><a aria-label="Read more about Pywayang - Apache 
Wayang&#x27;s Python API" href="/blog/wayang-python-api"><b>Read M [...]
 Motivated by the learnings from last time, I stated implementing a Kafka 
Source component and a Kafka Sink component for the Apache Spark platform in 
Apache Wayang.
 In our previous article we shared the results of the work on the frist Apache 
Kafka integration using the Java Platform.</p>
 <p>Let&#x27;s see how it goes this time with Apache Spark.</p>
diff --git a/blog/wayang-python-api/index.html 
b/blog/wayang-python-api/index.html
new file mode 100644
index 00000000..ac16f8bc
--- /dev/null
+++ b/blog/wayang-python-api/index.html
@@ -0,0 +1,103 @@
+<!doctype html>
+<html lang="en" dir="ltr" class="blog-wrapper blog-post-page plugin-blog 
plugin-id-default" data-has-hydrated="false">
+<head>
+<meta charset="UTF-8">
+<meta name="generator" content="Docusaurus v3.1.1">
+<title data-rh="true">Pywayang - Apache Wayang&#x27;s Python API | Apache 
Wayang (incubating)</title><meta data-rh="true" name="viewport" 
content="width=device-width,initial-scale=1"><meta data-rh="true" 
name="twitter:card" content="summary_large_image"><meta data-rh="true" 
property="og:url" 
content="https://wayang.apache.org/blog/wayang-python-api";><meta data-rh="true" 
property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" 
content="en"><meta data-rh="true" name= [...]
+<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" 
title="Apache Wayang (incubating) Atom Feed"><link rel="stylesheet" 
href="/assets/css/styles.ecf70413.css">
+<script src="/assets/js/runtime~main.c5c887b3.js" defer="defer"></script>
+<script src="/assets/js/main.160bc23e.js" defer="defer"></script>
+</head>
+<body class="navigation-with-keyboard">
+<script>!function(){function 
t(t){document.documentElement.setAttribute("data-theme",t)}var 
e=function(){try{return new 
URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return
 
localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const
 a=new URLSearchParams(window.location.search).entries();for(var[t,e]of 
a)if(t.startsWith("docusaurus-data-")){var 
n=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
+important. However, navigating through a multitude of tools and
+languages often is a major inconvenience.
+Apache Wayang&#x27;s upcoming Python API will allow you to seamlessly
+orchestrate data processing tasks without ever leaving the comfort
+of Python, irrespective of the underlying framework written in Java.</p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" 
id="expanding-apache-wayangs-apis">Expanding Apache Wayang&#x27;s APIs<a 
href="#expanding-apache-wayangs-apis" class="hash-link" aria-label="Direct link 
to Expanding Apache Wayang&#x27;s APIs" title="Direct link to Expanding Apache 
Wayang&#x27;s APIs">​</a></h2>
+<p>Apache Wayang&#x27;s architecture decouples the process of planning from the
+resulting execution, allowing users to specify platform agnostic plans
+through the provided APIs.</p>
+<br>
+<img width="75%" alt="wayang stack" src="/img/architecture/wayang-stack.png">
+<br>
+<br>
+<p>Python&#x27;s popularity and convenience for data
+processing workloads makes it an obvious candidate for a desired API.
+Previous APIs, such as the Scala API <code>wayang-api-scala-java</code> 
benefited
+from the interoperability of Java and Scala that allows to reuse objects
+from other languages to provide new interfaces. Accessing JVM objects in
+Python is possible through several libraries, but in doing so,
+future APIs in other programming languages would need similar libraries and
+implementations in order to exist. As a contrast to that, providing an
+API within Apache Wayang that receives input plans from any source and
+executes them within allows to create plans and submit them in any
+programming language. The following figure shows the architecture of 
<code>pywayang</code>:</p>
+<br>
+<img width="75%" alt="pywayang stack" src="/img/architecture/pywayang.png">
+<br>
+<br>
+<p>The Python API allows users to specify WayangPlans with UDFs in Python.
+<code>pywayang</code> then serializes the UDFs and constructs the WayangPlan in
+JSON format, preparing it to be sent to Apache Wayang&#x27;s JSON API.
+When receiving a valid JSON plan, the JSON API uses the optimizer to
+construct an execution plan. However, since UDFs are defined in Python
+and thus need to be executed in Python as well, an operators function needs to 
be
+wrapped into a <code>WrappedPythonFunction</code>:</p>
+<div class="language-scala codeBlockContainer_Ckt0 theme-code-block" 
style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div 
class="codeBlockContent_biex"><pre tabindex="0" class="prism-code 
language-scala codeBlock_bY9V thin-scrollbar" 
style="color:#393A34;background-color:#f6f8fa"><code 
class="codeBlockLines_e6Vv"><span class="token-line" 
style="color:#393A34"><span class="token keyword" 
style="color:#00009f">val</span><span class="token plain"> mapOperator 
</span><span cla [...]
+<p>This wrapped functional descriptor allows to handle execution of
+UDFs in Python through a socket connection with the <code>pywayang</code> 
worker.
+Input data is sourced from the platform chosen by the optimizer and Apache
+Wayang handles routing the output data to the next operator.</p>
+<br>
+<p>A new API in any programming languages would have
+to specify two things:</p>
+<ul>
+<li>A way to create plans that conform to a JSON format specified in the
+Wayang JSON API.</li>
+<li>A <code>worker</code> that handles encoding and decoding of user defined
+functions (UDFs), as they need to
+be executed on iterables in their respective language.
+After that, the API can be added as a module in Wayang, so that
+operators will be wrapped and UDFs can be executed in the desired
+programming language.</li>
+</ul>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" 
id="defining-wayangplans-in-python">Defining WayangPlans in Python<a 
href="#defining-wayangplans-in-python" class="hash-link" aria-label="Direct 
link to Defining WayangPlans in Python" title="Direct link to Defining 
WayangPlans in Python">​</a></h2>
+<p>As the &quot;Hello World!&quot; of data processing systems, wordcount will 
pose as
+our primary example to display how users can interact with Apache Wayang
+through the python package <code>pywayang</code>.</p>
+<div class="language-python codeBlockContainer_Ckt0 theme-code-block" 
style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div 
class="codeBlockContent_biex"><pre tabindex="0" class="prism-code 
language-python codeBlock_bY9V thin-scrollbar" 
style="color:#393A34;background-color:#f6f8fa"><code 
class="codeBlockLines_e6Vv"><span class="token-line" 
style="color:#393A34"><span class="token keyword" 
style="color:#00009f">from</span><span class="token plain"> pywy</span><span 
class="t [...]
+<p>The example displays a mode of operation that resembles the Scala
+<code>PlanBuilder</code> and the <code>JavaPlanBuilder</code>. Plans are 
specified in a
+functional way, chaining operations until a terminal operation results
+in execution of the plan.</p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" 
id="wayang-api-json">Wayang-API-JSON<a href="#wayang-api-json" 
class="hash-link" aria-label="Direct link to Wayang-API-JSON" title="Direct 
link to Wayang-API-JSON">​</a></h2>
+<p>The <code>wayang-api-json</code> module provides an executable that starts 
a REST
+server. This server accepts a <code>WayangPlan</code> in JSON format.
+Starting the REST API as a background process can be done by executing
+the following:</p>
+<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" 
style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div 
class="codeBlockContent_biex"><pre tabindex="0" class="prism-code 
language-shell codeBlock_bY9V thin-scrollbar" 
style="color:#393A34;background-color:#f6f8fa"><code 
class="codeBlockLines_e6Vv"><span class="token-line" 
style="color:#393A34"><span class="token plain">mvn clean package </span><span 
class="token parameter variable" style="color:#36acaa">-pl [...]
+<h2 class="anchor anchorWithStickyNavbar_LWe7" 
id="wrapping-pipelines-in-mappartition-operators">Wrapping pipelines in 
MapPartition operators<a href="#wrapping-pipelines-in-mappartition-operators" 
class="hash-link" aria-label="Direct link to Wrapping pipelines in MapPartition 
operators" title="Direct link to Wrapping pipelines in MapPartition 
operators">​</a></h2>
+<p>With this architecture, the execution of an operator comes with an
+additional overhead, because the UDFs will have to be executed in
+python. Python operators receive iterators through a socket and also
+return their result to Wayang through that connection. To minimize the
+overhead, unary operators that return unary results will be grouped in
+pipelines. One pipeline of operators will be submitted to the Wayang
+JSON API as a single <code>MapPartition</code> operator. This means that the 
UDFs
+specified in this pipeline can be chained and only on call from Wayang
+to the Python worker will have to be made for a given pipeline.</p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="coming-soon">Coming soon<a 
href="#coming-soon" class="hash-link" aria-label="Direct link to Coming soon" 
title="Direct link to Coming soon">​</a></h2>
+<p>As the Python API is currently in development and we are applying
+finishing touches, this article serves as an outlook for what users can
+expect to see soon.</p>
+<p>Author: <a href="https://github.com/juripetersen"; target="_blank" 
rel="noopener noreferrer">juripetersen</a></p></div><footer class="row 
docusaurus-mt-lg blogPostFooterDetailsFull_mRVl"><div 
class="col"><b>Tags:</b><ul class="tags_jXut padding--none margin-left--sm"><li 
class="tag_QGVx"><a class="tag_zVej tagRegular_sFm0" 
href="/blog/tags/wayang">wayang</a></li><li class="tag_QGVx"><a class="tag_zVej 
tagRegular_sFm0" 
href="/blog/tags/python">python</a></li></ul></div></footer></articl [...]
+      <p> Apache Wayang is an effort undergoing incubation at The Apache 
Software Foundation (ASF), sponsored by the Apache Incubator. 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 th [...]
+      <p>
+        Copyright © 2024 The Apache Software Foundation, Licensed under the 
Apache License, Version 2.0. <br>
+        Apache, the names of Apache projects, and the feather logo are either 
registered trademarks or trademarks of the Apache Software Foundation in the 
United States and/or other countries.
+      </p>
+      </div></div></div></div></footer></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/blog/wayang-vs-trino/index.html b/blog/wayang-vs-trino/index.html
index 4eca5da8..f63f780e 100644
--- a/blog/wayang-vs-trino/index.html
+++ b/blog/wayang-vs-trino/index.html
@@ -5,11 +5,11 @@
 <meta name="generator" content="Docusaurus v3.1.1">
 <title data-rh="true">Apache Wayang vs. Presto/Trino | Apache Wayang 
(incubating)</title><meta data-rh="true" name="viewport" 
content="width=device-width,initial-scale=1"><meta data-rh="true" 
name="twitter:card" content="summary_large_image"><meta data-rh="true" 
property="og:url" 
content="https://wayang.apache.org/blog/wayang-vs-trino";><meta data-rh="true" 
property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" 
content="en"><meta data-rh="true" name="docusaurus_ta [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" 
title="Apache Wayang (incubating) Atom Feed"><link rel="stylesheet" 
href="/assets/css/styles.ecf70413.css">
-<script src="/assets/js/runtime~main.47b6da99.js" defer="defer"></script>
-<script src="/assets/js/main.aeaeb384.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.c5c887b3.js" defer="defer"></script>
+<script src="/assets/js/main.160bc23e.js" defer="defer"></script>
 </head>
 <body class="navigation-with-keyboard">
-<script>!function(){function 
t(t){document.documentElement.setAttribute("data-theme",t)}var 
e=function(){try{return new 
URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return
 
localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const
 a=new URLSearchParams(window.location.search).entries();for(var[t,e]of 
a)if(t.startsWith("docusaurus-data-")){var 
n=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
+<script>!function(){function 
t(t){document.documentElement.setAttribute("data-theme",t)}var 
e=function(){try{return new 
URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return
 
localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const
 a=new URLSearchParams(window.location.search).entries();for(var[t,e]of 
a)if(t.startsWith("docusaurus-data-")){var 
n=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
 <h2 class="anchor anchorWithStickyNavbar_LWe7" id="key-distinctions">Key 
Distinctions<a href="#key-distinctions" class="hash-link" aria-label="Direct 
link to Key Distinctions" title="Direct link to Key Distinctions">​</a></h2>
 <p>Trino/Presto is a <strong>query engine</strong> for <strong>distributed SQL 
query processing</strong>. It is composed of a coordinator and multiple 
workers. The coordinator consists of a query optimizer and a scheduler, while 
the workers are responsible for performing the necessary query processing. Data 
is fetched from external systems via a Connector API, i.e., Trino/Presto 
supports <a href="https://trino.io/ecosystem/data-source"; target="_blank" 
rel="noopener noreferrer">multiple d [...]
 <p>In contrast, Wayang is a <strong>middleware</strong> for 
<strong>integrating diverse data platforms</strong>, including but not limited 
to query engines. This means that Wayang leverages the processing capabilities 
of the underlying data platforms to complete a given job, with no actual query 
processing taking place within Wayang itself.</p>
diff --git a/blog/website_update/index.html b/blog/website_update/index.html
index d0b6dd1b..71546a28 100644
--- a/blog/website_update/index.html
+++ b/blog/website_update/index.html
@@ -5,11 +5,11 @@
 <meta name="generator" content="Docusaurus v3.1.1">
 <title data-rh="true">Website updated | Apache Wayang 
(incubating)</title><meta data-rh="true" name="viewport" 
content="width=device-width,initial-scale=1"><meta data-rh="true" 
name="twitter:card" content="summary_large_image"><meta data-rh="true" 
property="og:url" content="https://wayang.apache.org/blog/website_update";><meta 
data-rh="true" property="og:locale" content="en"><meta data-rh="true" 
name="docusaurus_locale" content="en"><meta data-rh="true" 
name="docusaurus_tag" content="defa [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" 
title="Apache Wayang (incubating) Atom Feed"><link rel="stylesheet" 
href="/assets/css/styles.ecf70413.css">
-<script src="/assets/js/runtime~main.47b6da99.js" defer="defer"></script>
-<script src="/assets/js/main.aeaeb384.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.c5c887b3.js" defer="defer"></script>
+<script src="/assets/js/main.160bc23e.js" defer="defer"></script>
 </head>
 <body class="navigation-with-keyboard">
-<script>!function(){function 
t(t){document.documentElement.setAttribute("data-theme",t)}var 
e=function(){try{return new 
URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return
 
localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const
 a=new URLSearchParams(window.location.search).entries();for(var[t,e]of 
a)if(t.startsWith("docusaurus-data-")){var 
n=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
+<script>!function(){function 
t(t){document.documentElement.setAttribute("data-theme",t)}var 
e=function(){try{return new 
URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return
 
localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const
 a=new URLSearchParams(window.location.search).entries();for(var[t,e]of 
a)if(t.startsWith("docusaurus-data-")){var 
n=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
 <p>Author: <a href="https://github.com/2pk03"; target="_blank" rel="noopener 
noreferrer">2pk03</a></p>
 <p>We switched to a new CMS. That&#x27;s all.</p>
 <h2 class="anchor anchorWithStickyNavbar_LWe7" id="cheatsheet">Cheatsheet<a 
href="#cheatsheet" class="hash-link" aria-label="Direct link to Cheatsheet" 
title="Direct link to Cheatsheet">​</a></h2>
diff --git a/docs/community/committer/index.html 
b/docs/community/committer/index.html
index 8dab93a0..407c3967 100644
--- a/docs/community/committer/index.html
+++ b/docs/community/committer/index.html
@@ -5,8 +5,8 @@
 <meta name="generator" content="Docusaurus v3.1.1">
 <title data-rh="true">Becoming a committer | Apache Wayang 
(incubating)</title><meta data-rh="true" name="viewport" 
content="width=device-width,initial-scale=1"><meta data-rh="true" 
name="twitter:card" content="summary_large_image"><meta data-rh="true" 
property="og:url" 
content="https://wayang.apache.org/docs/community/committer";><meta 
data-rh="true" property="og:locale" content="en"><meta data-rh="true" 
name="docusaurus_locale" content="en"><meta data-rh="true" 
name="docsearch:language" [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" 
title="Apache Wayang (incubating) Atom Feed"><link rel="stylesheet" 
href="/assets/css/styles.ecf70413.css">
-<script src="/assets/js/runtime~main.47b6da99.js" defer="defer"></script>
-<script src="/assets/js/main.aeaeb384.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.c5c887b3.js" defer="defer"></script>
+<script src="/assets/js/main.160bc23e.js" defer="defer"></script>
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function 
t(t){document.documentElement.setAttribute("data-theme",t)}var 
e=function(){try{return new 
URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return
 
localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const
 a=new URLSearchParams(window.location.search).entries();for(var[t,e]of 
a)if(t.startsWith("docusaurus-data-")){var 
n=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/docs/community/contribute/index.html 
b/docs/community/contribute/index.html
index e7801be4..0f26b615 100644
--- a/docs/community/contribute/index.html
+++ b/docs/community/contribute/index.html
@@ -5,8 +5,8 @@
 <meta name="generator" content="Docusaurus v3.1.1">
 <title data-rh="true">How to contribute | Apache Wayang 
(incubating)</title><meta data-rh="true" name="viewport" 
content="width=device-width,initial-scale=1"><meta data-rh="true" 
name="twitter:card" content="summary_large_image"><meta data-rh="true" 
property="og:url" 
content="https://wayang.apache.org/docs/community/contribute";><meta 
data-rh="true" property="og:locale" content="en"><meta data-rh="true" 
name="docusaurus_locale" content="en"><meta data-rh="true" 
name="docsearch:language" c [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" 
title="Apache Wayang (incubating) Atom Feed"><link rel="stylesheet" 
href="/assets/css/styles.ecf70413.css">
-<script src="/assets/js/runtime~main.47b6da99.js" defer="defer"></script>
-<script src="/assets/js/main.aeaeb384.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.c5c887b3.js" defer="defer"></script>
+<script src="/assets/js/main.160bc23e.js" defer="defer"></script>
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function 
t(t){document.documentElement.setAttribute("data-theme",t)}var 
e=function(){try{return new 
URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return
 
localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const
 a=new URLSearchParams(window.location.search).entries();for(var[t,e]of 
a)if(t.startsWith("docusaurus-data-")){var 
n=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/docs/community/mailinglist/index.html 
b/docs/community/mailinglist/index.html
index d601e40f..8ae2735d 100644
--- a/docs/community/mailinglist/index.html
+++ b/docs/community/mailinglist/index.html
@@ -5,8 +5,8 @@
 <meta name="generator" content="Docusaurus v3.1.1">
 <title data-rh="true">Mailinglists | Apache Wayang (incubating)</title><meta 
data-rh="true" name="viewport" 
content="width=device-width,initial-scale=1"><meta data-rh="true" 
name="twitter:card" content="summary_large_image"><meta data-rh="true" 
property="og:url" 
content="https://wayang.apache.org/docs/community/mailinglist";><meta 
data-rh="true" property="og:locale" content="en"><meta data-rh="true" 
name="docusaurus_locale" content="en"><meta data-rh="true" 
name="docsearch:language" conte [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" 
title="Apache Wayang (incubating) Atom Feed"><link rel="stylesheet" 
href="/assets/css/styles.ecf70413.css">
-<script src="/assets/js/runtime~main.47b6da99.js" defer="defer"></script>
-<script src="/assets/js/main.aeaeb384.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.c5c887b3.js" defer="defer"></script>
+<script src="/assets/js/main.160bc23e.js" defer="defer"></script>
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function 
t(t){document.documentElement.setAttribute("data-theme",t)}var 
e=function(){try{return new 
URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return
 
localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const
 a=new URLSearchParams(window.location.search).entries();for(var[t,e]of 
a)if(t.startsWith("docusaurus-data-")){var 
n=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/docs/community/repositories/index.html 
b/docs/community/repositories/index.html
index e343cfaa..eeb55197 100644
--- a/docs/community/repositories/index.html
+++ b/docs/community/repositories/index.html
@@ -5,8 +5,8 @@
 <meta name="generator" content="Docusaurus v3.1.1">
 <title data-rh="true">Repositories | Apache Wayang (incubating)</title><meta 
data-rh="true" name="viewport" 
content="width=device-width,initial-scale=1"><meta data-rh="true" 
name="twitter:card" content="summary_large_image"><meta data-rh="true" 
property="og:url" 
content="https://wayang.apache.org/docs/community/repositories";><meta 
data-rh="true" property="og:locale" content="en"><meta data-rh="true" 
name="docusaurus_locale" content="en"><meta data-rh="true" 
name="docsearch:language" cont [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" 
title="Apache Wayang (incubating) Atom Feed"><link rel="stylesheet" 
href="/assets/css/styles.ecf70413.css">
-<script src="/assets/js/runtime~main.47b6da99.js" defer="defer"></script>
-<script src="/assets/js/main.aeaeb384.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.c5c887b3.js" defer="defer"></script>
+<script src="/assets/js/main.160bc23e.js" defer="defer"></script>
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function 
t(t){document.documentElement.setAttribute("data-theme",t)}var 
e=function(){try{return new 
URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return
 
localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const
 a=new URLSearchParams(window.location.search).entries();for(var[t,e]of 
a)if(t.startsWith("docusaurus-data-")){var 
n=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/docs/community/team/index.html b/docs/community/team/index.html
index a76e213d..7a91f19b 100644
--- a/docs/community/team/index.html
+++ b/docs/community/team/index.html
@@ -5,8 +5,8 @@
 <meta name="generator" content="Docusaurus v3.1.1">
 <title data-rh="true">Team | Apache Wayang (incubating)</title><meta 
data-rh="true" name="viewport" 
content="width=device-width,initial-scale=1"><meta data-rh="true" 
name="twitter:card" content="summary_large_image"><meta data-rh="true" 
property="og:url" content="https://wayang.apache.org/docs/community/team";><meta 
data-rh="true" property="og:locale" content="en"><meta data-rh="true" 
name="docusaurus_locale" content="en"><meta data-rh="true" 
name="docsearch:language" content="en"><meta d [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" 
title="Apache Wayang (incubating) Atom Feed"><link rel="stylesheet" 
href="/assets/css/styles.ecf70413.css">
-<script src="/assets/js/runtime~main.47b6da99.js" defer="defer"></script>
-<script src="/assets/js/main.aeaeb384.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.c5c887b3.js" defer="defer"></script>
+<script src="/assets/js/main.160bc23e.js" defer="defer"></script>
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function 
t(t){document.documentElement.setAttribute("data-theme",t)}var 
e=function(){try{return new 
URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return
 
localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const
 a=new URLSearchParams(window.location.search).entries();for(var[t,e]of 
a)if(t.startsWith("docusaurus-data-")){var 
n=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/docs/guide/adding-operators/index.html 
b/docs/guide/adding-operators/index.html
index e46dccd9..52f55789 100644
--- a/docs/guide/adding-operators/index.html
+++ b/docs/guide/adding-operators/index.html
@@ -5,8 +5,8 @@
 <meta name="generator" content="Docusaurus v3.1.1">
 <title data-rh="true">Adding an operator in Wayang | Apache Wayang 
(incubating)</title><meta data-rh="true" name="viewport" 
content="width=device-width,initial-scale=1"><meta data-rh="true" 
name="twitter:card" content="summary_large_image"><meta data-rh="true" 
property="og:url" 
content="https://wayang.apache.org/docs/guide/adding-operators";><meta 
data-rh="true" property="og:locale" content="en"><meta data-rh="true" 
name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearc [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" 
title="Apache Wayang (incubating) Atom Feed"><link rel="stylesheet" 
href="/assets/css/styles.ecf70413.css">
-<script src="/assets/js/runtime~main.47b6da99.js" defer="defer"></script>
-<script src="/assets/js/main.aeaeb384.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.c5c887b3.js" defer="defer"></script>
+<script src="/assets/js/main.160bc23e.js" defer="defer"></script>
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function 
t(t){document.documentElement.setAttribute("data-theme",t)}var 
e=function(){try{return new 
URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return
 
localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const
 a=new URLSearchParams(window.location.search).entries();for(var[t,e]of 
a)if(t.startsWith("docusaurus-data-")){var 
n=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/docs/guide/api-documentation/index.html 
b/docs/guide/api-documentation/index.html
index f75392cc..95fa83ba 100644
--- a/docs/guide/api-documentation/index.html
+++ b/docs/guide/api-documentation/index.html
@@ -5,8 +5,8 @@
 <meta name="generator" content="Docusaurus v3.1.1">
 <title data-rh="true">API documentation | Apache Wayang 
(incubating)</title><meta data-rh="true" name="viewport" 
content="width=device-width,initial-scale=1"><meta data-rh="true" 
name="twitter:card" content="summary_large_image"><meta data-rh="true" 
property="og:url" 
content="https://wayang.apache.org/docs/guide/api-documentation";><meta 
data-rh="true" property="og:locale" content="en"><meta data-rh="true" 
name="docusaurus_locale" content="en"><meta data-rh="true" 
name="docsearch:language [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" 
title="Apache Wayang (incubating) Atom Feed"><link rel="stylesheet" 
href="/assets/css/styles.ecf70413.css">
-<script src="/assets/js/runtime~main.47b6da99.js" defer="defer"></script>
-<script src="/assets/js/main.aeaeb384.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.c5c887b3.js" defer="defer"></script>
+<script src="/assets/js/main.160bc23e.js" defer="defer"></script>
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function 
t(t){document.documentElement.setAttribute("data-theme",t)}var 
e=function(){try{return new 
URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return
 
localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const
 a=new URLSearchParams(window.location.search).entries();for(var[t,e]of 
a)if(t.startsWith("docusaurus-data-")){var 
n=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/docs/guide/developing-in-wayang/index.html 
b/docs/guide/developing-in-wayang/index.html
index ae3aa8b5..9c98ecb9 100644
--- a/docs/guide/developing-in-wayang/index.html
+++ b/docs/guide/developing-in-wayang/index.html
@@ -5,8 +5,8 @@
 <meta name="generator" content="Docusaurus v3.1.1">
 <title data-rh="true">Developing in Wayang | Apache Wayang 
(incubating)</title><meta data-rh="true" name="viewport" 
content="width=device-width,initial-scale=1"><meta data-rh="true" 
name="twitter:card" content="summary_large_image"><meta data-rh="true" 
property="og:url" 
content="https://wayang.apache.org/docs/guide/developing-in-wayang";><meta 
data-rh="true" property="og:locale" content="en"><meta data-rh="true" 
name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:la 
[...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" 
title="Apache Wayang (incubating) Atom Feed"><link rel="stylesheet" 
href="/assets/css/styles.ecf70413.css">
-<script src="/assets/js/runtime~main.47b6da99.js" defer="defer"></script>
-<script src="/assets/js/main.aeaeb384.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.c5c887b3.js" defer="defer"></script>
+<script src="/assets/js/main.160bc23e.js" defer="defer"></script>
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function 
t(t){document.documentElement.setAttribute("data-theme",t)}var 
e=function(){try{return new 
URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return
 
localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const
 a=new URLSearchParams(window.location.search).entries();for(var[t,e]of 
a)if(t.startsWith("docusaurus-data-")){var 
n=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/docs/guide/examples/index.html b/docs/guide/examples/index.html
index 6eb91735..6d9ffa21 100644
--- a/docs/guide/examples/index.html
+++ b/docs/guide/examples/index.html
@@ -5,8 +5,8 @@
 <meta name="generator" content="Docusaurus v3.1.1">
 <title data-rh="true">Usage Examples | Apache Wayang (incubating)</title><meta 
data-rh="true" name="viewport" 
content="width=device-width,initial-scale=1"><meta data-rh="true" 
name="twitter:card" content="summary_large_image"><meta data-rh="true" 
property="og:url" content="https://wayang.apache.org/docs/guide/examples";><meta 
data-rh="true" property="og:locale" content="en"><meta data-rh="true" 
name="docusaurus_locale" content="en"><meta data-rh="true" 
name="docsearch:language" content="e [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" 
title="Apache Wayang (incubating) Atom Feed"><link rel="stylesheet" 
href="/assets/css/styles.ecf70413.css">
-<script src="/assets/js/runtime~main.47b6da99.js" defer="defer"></script>
-<script src="/assets/js/main.aeaeb384.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.c5c887b3.js" defer="defer"></script>
+<script src="/assets/js/main.160bc23e.js" defer="defer"></script>
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function 
t(t){document.documentElement.setAttribute("data-theme",t)}var 
e=function(){try{return new 
URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return
 
localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const
 a=new URLSearchParams(window.location.search).entries();for(var[t,e]of 
a)if(t.startsWith("docusaurus-data-")){var 
n=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/docs/guide/getting-started/index.html 
b/docs/guide/getting-started/index.html
index 84180bae..ece3104b 100644
--- a/docs/guide/getting-started/index.html
+++ b/docs/guide/getting-started/index.html
@@ -5,8 +5,8 @@
 <meta name="generator" content="Docusaurus v3.1.1">
 <title data-rh="true">Getting started | Apache Wayang 
(incubating)</title><meta data-rh="true" name="viewport" 
content="width=device-width,initial-scale=1"><meta data-rh="true" 
name="twitter:card" content="summary_large_image"><meta data-rh="true" 
property="og:url" 
content="https://wayang.apache.org/docs/guide/getting-started";><meta 
data-rh="true" property="og:locale" content="en"><meta data-rh="true" 
name="docusaurus_locale" content="en"><meta data-rh="true" 
name="docsearch:language" co [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" 
title="Apache Wayang (incubating) Atom Feed"><link rel="stylesheet" 
href="/assets/css/styles.ecf70413.css">
-<script src="/assets/js/runtime~main.47b6da99.js" defer="defer"></script>
-<script src="/assets/js/main.aeaeb384.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.c5c887b3.js" defer="defer"></script>
+<script src="/assets/js/main.160bc23e.js" defer="defer"></script>
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function 
t(t){document.documentElement.setAttribute("data-theme",t)}var 
e=function(){try{return new 
URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return
 
localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const
 a=new URLSearchParams(window.location.search).entries();for(var[t,e]of 
a)if(t.startsWith("docusaurus-data-")){var 
n=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/docs/guide/installation/index.html 
b/docs/guide/installation/index.html
index a411436f..bf50d755 100644
--- a/docs/guide/installation/index.html
+++ b/docs/guide/installation/index.html
@@ -5,8 +5,8 @@
 <meta name="generator" content="Docusaurus v3.1.1">
 <title data-rh="true">How to build Wayang | Apache Wayang 
(incubating)</title><meta data-rh="true" name="viewport" 
content="width=device-width,initial-scale=1"><meta data-rh="true" 
name="twitter:card" content="summary_large_image"><meta data-rh="true" 
property="og:url" 
content="https://wayang.apache.org/docs/guide/installation";><meta 
data-rh="true" property="og:locale" content="en"><meta data-rh="true" 
name="docusaurus_locale" content="en"><meta data-rh="true" 
name="docsearch:language" c [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" 
title="Apache Wayang (incubating) Atom Feed"><link rel="stylesheet" 
href="/assets/css/styles.ecf70413.css">
-<script src="/assets/js/runtime~main.47b6da99.js" defer="defer"></script>
-<script src="/assets/js/main.aeaeb384.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.c5c887b3.js" defer="defer"></script>
+<script src="/assets/js/main.160bc23e.js" defer="defer"></script>
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function 
t(t){document.documentElement.setAttribute("data-theme",t)}var 
e=function(){try{return new 
URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return
 
localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const
 a=new URLSearchParams(window.location.search).entries();for(var[t,e]of 
a)if(t.startsWith("docusaurus-data-")){var 
n=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/docs/guide/ml4all/index.html b/docs/guide/ml4all/index.html
index fcdd86d5..f327ea01 100644
--- a/docs/guide/ml4all/index.html
+++ b/docs/guide/ml4all/index.html
@@ -5,8 +5,8 @@
 <meta name="generator" content="Docusaurus v3.1.1">
 <title data-rh="true">Scalable Machine Learning | Apache Wayang 
(incubating)</title><meta data-rh="true" name="viewport" 
content="width=device-width,initial-scale=1"><meta data-rh="true" 
name="twitter:card" content="summary_large_image"><meta data-rh="true" 
property="og:url" content="https://wayang.apache.org/docs/guide/ml4all";><meta 
data-rh="true" property="og:locale" content="en"><meta data-rh="true" 
name="docusaurus_locale" content="en"><meta data-rh="true" 
name="docsearch:language" c [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" 
title="Apache Wayang (incubating) Atom Feed"><link rel="stylesheet" 
href="/assets/css/styles.ecf70413.css">
-<script src="/assets/js/runtime~main.47b6da99.js" defer="defer"></script>
-<script src="/assets/js/main.aeaeb384.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.c5c887b3.js" defer="defer"></script>
+<script src="/assets/js/main.160bc23e.js" defer="defer"></script>
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function 
t(t){document.documentElement.setAttribute("data-theme",t)}var 
e=function(){try{return new 
URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return
 
localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const
 a=new URLSearchParams(window.location.search).entries();for(var[t,e]of 
a)if(t.startsWith("docusaurus-data-")){var 
n=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/docs/guide/optimizer/index.html b/docs/guide/optimizer/index.html
index 2a36dbc7..24ab69b1 100644
--- a/docs/guide/optimizer/index.html
+++ b/docs/guide/optimizer/index.html
@@ -5,8 +5,8 @@
 <meta name="generator" content="Docusaurus v3.1.1">
 <title data-rh="true">Data processing optimizer | Apache Wayang 
(incubating)</title><meta data-rh="true" name="viewport" 
content="width=device-width,initial-scale=1"><meta data-rh="true" 
name="twitter:card" content="summary_large_image"><meta data-rh="true" 
property="og:url" 
content="https://wayang.apache.org/docs/guide/optimizer";><meta data-rh="true" 
property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" 
content="en"><meta data-rh="true" name="docsearch:language [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" 
title="Apache Wayang (incubating) Atom Feed"><link rel="stylesheet" 
href="/assets/css/styles.ecf70413.css">
-<script src="/assets/js/runtime~main.47b6da99.js" defer="defer"></script>
-<script src="/assets/js/main.aeaeb384.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.c5c887b3.js" defer="defer"></script>
+<script src="/assets/js/main.160bc23e.js" defer="defer"></script>
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function 
t(t){document.documentElement.setAttribute("data-theme",t)}var 
e=function(){try{return new 
URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return
 
localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const
 a=new URLSearchParams(window.location.search).entries();for(var[t,e]of 
a)if(t.startsWith("docusaurus-data-")){var 
n=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/docs/introduction/about/index.html 
b/docs/introduction/about/index.html
index 57bdc97e..1d30208c 100644
--- a/docs/introduction/about/index.html
+++ b/docs/introduction/about/index.html
@@ -5,8 +5,8 @@
 <meta name="generator" content="Docusaurus v3.1.1">
 <title data-rh="true">What is Wayang? | Apache Wayang 
(incubating)</title><meta data-rh="true" name="viewport" 
content="width=device-width,initial-scale=1"><meta data-rh="true" 
name="twitter:card" content="summary_large_image"><meta data-rh="true" 
property="og:url" 
content="https://wayang.apache.org/docs/introduction/about";><meta 
data-rh="true" property="og:locale" content="en"><meta data-rh="true" 
name="docusaurus_locale" content="en"><meta data-rh="true" 
name="docsearch:language" conte [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" 
title="Apache Wayang (incubating) Atom Feed"><link rel="stylesheet" 
href="/assets/css/styles.ecf70413.css">
-<script src="/assets/js/runtime~main.47b6da99.js" defer="defer"></script>
-<script src="/assets/js/main.aeaeb384.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.c5c887b3.js" defer="defer"></script>
+<script src="/assets/js/main.160bc23e.js" defer="defer"></script>
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function 
t(t){document.documentElement.setAttribute("data-theme",t)}var 
e=function(){try{return new 
URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return
 
localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const
 a=new URLSearchParams(window.location.search).entries();for(var[t,e]of 
a)if(t.startsWith("docusaurus-data-")){var 
n=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/docs/introduction/benchmark/index.html 
b/docs/introduction/benchmark/index.html
index 01b4fabe..5e95d547 100644
--- a/docs/introduction/benchmark/index.html
+++ b/docs/introduction/benchmark/index.html
@@ -5,8 +5,8 @@
 <meta name="generator" content="Docusaurus v3.1.1">
 <title data-rh="true">Benchmarking Wayang | Apache Wayang 
(incubating)</title><meta data-rh="true" name="viewport" 
content="width=device-width,initial-scale=1"><meta data-rh="true" 
name="twitter:card" content="summary_large_image"><meta data-rh="true" 
property="og:url" 
content="https://wayang.apache.org/docs/introduction/benchmark";><meta 
data-rh="true" property="og:locale" content="en"><meta data-rh="true" 
name="docusaurus_locale" content="en"><meta data-rh="true" 
name="docsearch:languag [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" 
title="Apache Wayang (incubating) Atom Feed"><link rel="stylesheet" 
href="/assets/css/styles.ecf70413.css">
-<script src="/assets/js/runtime~main.47b6da99.js" defer="defer"></script>
-<script src="/assets/js/main.aeaeb384.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.c5c887b3.js" defer="defer"></script>
+<script src="/assets/js/main.160bc23e.js" defer="defer"></script>
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function 
t(t){document.documentElement.setAttribute("data-theme",t)}var 
e=function(){try{return new 
URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return
 
localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const
 a=new URLSearchParams(window.location.search).entries();for(var[t,e]of 
a)if(t.startsWith("docusaurus-data-")){var 
n=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/docs/introduction/features/index.html 
b/docs/introduction/features/index.html
index 74225125..ec9bc598 100644
--- a/docs/introduction/features/index.html
+++ b/docs/introduction/features/index.html
@@ -5,8 +5,8 @@
 <meta name="generator" content="Docusaurus v3.1.1">
 <title data-rh="true">Features | Apache Wayang (incubating)</title><meta 
data-rh="true" name="viewport" 
content="width=device-width,initial-scale=1"><meta data-rh="true" 
name="twitter:card" content="summary_large_image"><meta data-rh="true" 
property="og:url" 
content="https://wayang.apache.org/docs/introduction/features";><meta 
data-rh="true" property="og:locale" content="en"><meta data-rh="true" 
name="docusaurus_locale" content="en"><meta data-rh="true" 
name="docsearch:language" content=" [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" 
title="Apache Wayang (incubating) Atom Feed"><link rel="stylesheet" 
href="/assets/css/styles.ecf70413.css">
-<script src="/assets/js/runtime~main.47b6da99.js" defer="defer"></script>
-<script src="/assets/js/main.aeaeb384.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.c5c887b3.js" defer="defer"></script>
+<script src="/assets/js/main.160bc23e.js" defer="defer"></script>
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function 
t(t){document.documentElement.setAttribute("data-theme",t)}var 
e=function(){try{return new 
URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return
 
localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const
 a=new URLSearchParams(window.location.search).entries();for(var[t,e]of 
a)if(t.startsWith("docusaurus-data-")){var 
n=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/docs/start/download/index.html b/docs/start/download/index.html
index c695748e..5ff32657 100644
--- a/docs/start/download/index.html
+++ b/docs/start/download/index.html
@@ -5,8 +5,8 @@
 <meta name="generator" content="Docusaurus v3.1.1">
 <title data-rh="true">Download Apache Wayang | Apache Wayang 
(incubating)</title><meta data-rh="true" name="viewport" 
content="width=device-width,initial-scale=1"><meta data-rh="true" 
name="twitter:card" content="summary_large_image"><meta data-rh="true" 
property="og:url" content="https://wayang.apache.org/docs/start/download";><meta 
data-rh="true" property="og:locale" content="en"><meta data-rh="true" 
name="docusaurus_locale" content="en"><meta data-rh="true" 
name="docsearch:language" co [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" 
title="Apache Wayang (incubating) Atom Feed"><link rel="stylesheet" 
href="/assets/css/styles.ecf70413.css">
-<script src="/assets/js/runtime~main.47b6da99.js" defer="defer"></script>
-<script src="/assets/js/main.aeaeb384.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.c5c887b3.js" defer="defer"></script>
+<script src="/assets/js/main.160bc23e.js" defer="defer"></script>
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function 
t(t){document.documentElement.setAttribute("data-theme",t)}var 
e=function(){try{return new 
URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return
 
localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const
 a=new URLSearchParams(window.location.search).entries();for(var[t,e]of 
a)if(t.startsWith("docusaurus-data-")){var 
n=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/img/architecture/pywayang.png b/img/architecture/pywayang.png
new file mode 100644
index 00000000..ac88d929
Binary files /dev/null and b/img/architecture/pywayang.png differ
diff --git a/index.html b/index.html
index 8b30cd3f..1e73df63 100644
--- a/index.html
+++ b/index.html
@@ -5,8 +5,8 @@
 <meta name="generator" content="Docusaurus v3.1.1">
 <title data-rh="true">Apache Wayang (incubating) | Apache Wayang 
(incubating)</title><meta data-rh="true" name="viewport" 
content="width=device-width,initial-scale=1"><meta data-rh="true" 
name="twitter:card" content="summary_large_image"><meta data-rh="true" 
property="og:url" content="https://wayang.apache.org/";><meta data-rh="true" 
property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" 
content="en"><meta data-rh="true" name="docusaurus_tag" content="default"><me 
[...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" 
title="Apache Wayang (incubating) Atom Feed"><link rel="stylesheet" 
href="/assets/css/styles.ecf70413.css">
-<script src="/assets/js/runtime~main.47b6da99.js" defer="defer"></script>
-<script src="/assets/js/main.aeaeb384.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.c5c887b3.js" defer="defer"></script>
+<script src="/assets/js/main.160bc23e.js" defer="defer"></script>
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function 
t(t){document.documentElement.setAttribute("data-theme",t)}var 
e=function(){try{return new 
URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return
 
localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const
 a=new URLSearchParams(window.location.search).entries();for(var[t,e]of 
a)if(t.startsWith("docusaurus-data-")){var 
n=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/lunr-index-1710452634782.json b/lunr-index-1710452634782.json
deleted file mode 100644
index 472a7489..00000000
--- a/lunr-index-1710452634782.json
+++ /dev/null
@@ -1 +0,0 @@
-{"version":"2.3.9","fields":["title","content","keywords"],"fieldVectors":[["title/0",[0,152.806,1,237.228,2,430.204,3,41.539,4,262.202,5,305.934]],["content/0",[]],["keywords/0",[]],["title/1",[0,89.894,1,217.575,6,342.973,7,269.165,8,167.886,9,280.589,10,307.571,11,293.284]],["content/1",[0,1.701,3,1.166,7,6.832,9,7.122,10,5.819,12,5.308,13,4.185,14,6.922,15,4.55,16,2.587,17,8.191,18,8.191,19,7.709,20,6.922,21,3.263,22,5.308,23,3.647,24,5.819,25,7.465,26,6.128,27,4.185,28,7.806,29,5.09
 [...]
\ No newline at end of file
diff --git a/lunr-index-1712648909442.json b/lunr-index-1712648909442.json
new file mode 100644
index 00000000..5098c2ca
--- /dev/null
+++ b/lunr-index-1712648909442.json
@@ -0,0 +1 @@
+{"version":"2.3.9","fields":["title","content","keywords"],"fieldVectors":[["title/0",[0,145.589,1,245.699,2,440.195,3,40.819,4,270.87,5,314.947]],["content/0",[]],["keywords/0",[]],["title/1",[0,85.829,1,225.43,6,351.864,7,277.447,8,166.642,9,288.965,10,316.17,11,301.765]],["content/1",[0,1.608,3,1.136,7,6.976,9,7.266,10,5.922,12,5.413,13,4.164,14,7.024,15,4.501,16,2.696,17,8.291,18,7.565,19,7.875,20,6.591,21,3.284,22,5.413,23,3.554,24,5.653,25,7.565,26,6.231,27,4.067,28,7.95,29,5.001,3
 [...]
\ No newline at end of file
diff --git a/lunr-index.json b/lunr-index.json
index 472a7489..5098c2ca 100644
--- a/lunr-index.json
+++ b/lunr-index.json
@@ -1 +1 @@
-{"version":"2.3.9","fields":["title","content","keywords"],"fieldVectors":[["title/0",[0,152.806,1,237.228,2,430.204,3,41.539,4,262.202,5,305.934]],["content/0",[]],["keywords/0",[]],["title/1",[0,89.894,1,217.575,6,342.973,7,269.165,8,167.886,9,280.589,10,307.571,11,293.284]],["content/1",[0,1.701,3,1.166,7,6.832,9,7.122,10,5.819,12,5.308,13,4.185,14,6.922,15,4.55,16,2.587,17,8.191,18,8.191,19,7.709,20,6.922,21,3.263,22,5.308,23,3.647,24,5.819,25,7.465,26,6.128,27,4.185,28,7.806,29,5.09
 [...]
\ No newline at end of file
+{"version":"2.3.9","fields":["title","content","keywords"],"fieldVectors":[["title/0",[0,145.589,1,245.699,2,440.195,3,40.819,4,270.87,5,314.947]],["content/0",[]],["keywords/0",[]],["title/1",[0,85.829,1,225.43,6,351.864,7,277.447,8,166.642,9,288.965,10,316.17,11,301.765]],["content/1",[0,1.608,3,1.136,7,6.976,9,7.266,10,5.922,12,5.413,13,4.164,14,7.024,15,4.501,16,2.696,17,8.291,18,7.565,19,7.875,20,6.591,21,3.284,22,5.413,23,3.554,24,5.653,25,7.565,26,6.231,27,4.067,28,7.95,29,5.001,3
 [...]
\ No newline at end of file
diff --git a/search-doc-1710452634782.json b/search-doc-1710452634782.json
deleted file mode 100644
index 6c20e199..00000000
--- a/search-doc-1710452634782.json
+++ /dev/null
@@ -1 +0,0 @@
-{"searchDocs":[{"title":"Apache Kafka meets Apache Wayang - Part 
2","type":0,"sectionRef":"#","url":"/blog/kafka-meets-wayang-2","content":"","keywords":"","version":null},{"title":"Apache
 Wayang’s Read & Write Path for Kafka topics​","type":1,"pageTitle":"Apache 
Kafka meets Apache Wayang - Part 
2","url":"/blog/kafka-meets-wayang-2#apache-wayangs-read--write-path-for-kafka-topics","content":"
 To describe the read and write paths for data in the context of the created 
Apache Wayang code s [...]
\ No newline at end of file
diff --git a/search-doc-1712648909442.json b/search-doc-1712648909442.json
new file mode 100644
index 00000000..cefb04ae
--- /dev/null
+++ b/search-doc-1712648909442.json
@@ -0,0 +1 @@
+{"searchDocs":[{"title":"Apache Kafka meets Apache Wayang - Part 
2","type":0,"sectionRef":"#","url":"/blog/kafka-meets-wayang-2","content":"","keywords":"","version":null},{"title":"Apache
 Wayang’s Read & Write Path for Kafka topics​","type":1,"pageTitle":"Apache 
Kafka meets Apache Wayang - Part 
2","url":"/blog/kafka-meets-wayang-2#apache-wayangs-read--write-path-for-kafka-topics","content":"
 To describe the read and write paths for data in the context of the created 
Apache Wayang code s [...]
\ No newline at end of file
diff --git a/search-doc.json b/search-doc.json
index 6c20e199..cefb04ae 100644
--- a/search-doc.json
+++ b/search-doc.json
@@ -1 +1 @@
-{"searchDocs":[{"title":"Apache Kafka meets Apache Wayang - Part 
2","type":0,"sectionRef":"#","url":"/blog/kafka-meets-wayang-2","content":"","keywords":"","version":null},{"title":"Apache
 Wayang’s Read & Write Path for Kafka topics​","type":1,"pageTitle":"Apache 
Kafka meets Apache Wayang - Part 
2","url":"/blog/kafka-meets-wayang-2#apache-wayangs-read--write-path-for-kafka-topics","content":"
 To describe the read and write paths for data in the context of the created 
Apache Wayang code s [...]
\ No newline at end of file
+{"searchDocs":[{"title":"Apache Kafka meets Apache Wayang - Part 
2","type":0,"sectionRef":"#","url":"/blog/kafka-meets-wayang-2","content":"","keywords":"","version":null},{"title":"Apache
 Wayang’s Read & Write Path for Kafka topics​","type":1,"pageTitle":"Apache 
Kafka meets Apache Wayang - Part 
2","url":"/blog/kafka-meets-wayang-2#apache-wayangs-read--write-path-for-kafka-topics","content":"
 To describe the read and write paths for data in the context of the created 
Apache Wayang code s [...]
\ No newline at end of file
diff --git a/sitemap.xml b/sitemap.xml
index acd9a8f7..8d4b7b9b 100644
--- a/sitemap.xml
+++ b/sitemap.xml
@@ -1 +1 @@
-<?xml version="1.0" encoding="UTF-8"?><urlset 
xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"; 
xmlns:news="http://www.google.com/schemas/sitemap-news/0.9"; 
xmlns:xhtml="http://www.w3.org/1999/xhtml"; 
xmlns:image="http://www.google.com/schemas/sitemap-image/1.1"; 
xmlns:video="http://www.google.com/schemas/sitemap-video/1.1";><url><loc>https://wayang.apache.org/blog</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://wayang.apache.org/blog/archive</loc><chang
 [...]
\ No newline at end of file
+<?xml version="1.0" encoding="UTF-8"?><urlset 
xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"; 
xmlns:news="http://www.google.com/schemas/sitemap-news/0.9"; 
xmlns:xhtml="http://www.w3.org/1999/xhtml"; 
xmlns:image="http://www.google.com/schemas/sitemap-image/1.1"; 
xmlns:video="http://www.google.com/schemas/sitemap-video/1.1";><url><loc>https://wayang.apache.org/blog</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://wayang.apache.org/blog/archive</loc><chang
 [...]
\ No newline at end of file


Reply via email to