You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flink.apache.org by nk...@apache.org on 2020/04/22 12:50:20 UTC
[flink] 04/08: [FLINK-17237][docs] Add Intro to DataStream API
tutorial
This is an automated email from the ASF dual-hosted git repository.
nkruber pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/flink.git
commit 4379b07dd6f4da4cfe7cf2908797b110554de4c8
Author: David Anderson <da...@alpinegizmo.com>
AuthorDate: Mon Apr 20 14:20:49 2020 +0200
[FLINK-17237][docs] Add Intro to DataStream API tutorial
This closes #11834.
---
docs/fig/distributed-runtime.svg | 475 +++++++++++++++++++++++++++++
docs/redirects/tutorials_datastream_api.md | 24 --
docs/tutorials/datastream_api.md | 237 ++++++++++++++
docs/tutorials/datastream_api.zh.md | 237 ++++++++++++++
4 files changed, 949 insertions(+), 24 deletions(-)
diff --git a/docs/fig/distributed-runtime.svg b/docs/fig/distributed-runtime.svg
new file mode 100644
index 0000000..7833846
--- /dev/null
+++ b/docs/fig/distributed-runtime.svg
@@ -0,0 +1,475 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements. See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership. The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License. You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied. See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:dc="http://purl.org/dc/elements/1.1/" viewBox="237.37172 320.87007 993.5262 432.88115" width="993.5262" height="432.88115">
+ <defs>
+ <font-face font-family="Open Sans" font-size="15.554" panose-1="2 11 6 6 3 5 4 2 2 4" units-per-em="1000" underline-position="-75.19531" underline-thickness="49.80469" slope="0" x-height="535.15625" cap-height="713.8672" ascent="1068.8477" descent="-292.96875" font-weight="400">
+ <font-face-src>
+ <font-face-name name="OpenSans"/>
+ </font-face-src>
+ </font-face>
+ <font-face font-family="Open Sans" font-size="17.554" panose-1="2 11 6 6 3 5 4 2 2 4" units-per-em="1000" underline-position="-75.19531" underline-thickness="49.80469" slope="0" x-height="535.15625" cap-height="713.8672" ascent="1068.8477" descent="-292.96875" font-weight="400">
+ <font-face-src>
+ <font-face-name name="OpenSans"/>
+ </font-face-src>
+ </font-face>
+ <font-face font-family="Open Sans" font-size="15.004" panose-1="2 11 6 6 3 5 4 2 2 4" units-per-em="1000" underline-position="-75.19531" underline-thickness="49.80469" slope="0" x-height="535.15625" cap-height="713.8672" ascent="1068.8477" descent="-292.96875" font-weight="400">
+ <font-face-src>
+ <font-face-name name="OpenSans"/>
+ </font-face-src>
+ </font-face>
+ <font-face font-family="Open Sans" font-size="11.253" panose-1="2 11 6 6 3 5 4 2 2 4" units-per-em="1000" underline-position="-75.19531" underline-thickness="49.80469" slope="0" x-height="535.15625" cap-height="713.8672" ascent="1068.8477" descent="-292.96875" font-weight="400">
+ <font-face-src>
+ <font-face-name name="OpenSans"/>
+ </font-face-src>
+ </font-face>
+ <font-face font-family="Open Sans" font-size="13.203" panose-1="2 11 6 6 3 5 4 2 2 4" units-per-em="1000" underline-position="-75.19531" underline-thickness="49.80469" slope="0" x-height="535.15625" cap-height="713.8672" ascent="1068.8477" descent="-292.96875" font-weight="400">
+ <font-face-src>
+ <font-face-name name="OpenSans"/>
+ </font-face-src>
+ </font-face>
+ <font-face font-family="Open Sans" font-size="13.803" panose-1="2 11 6 6 3 5 4 2 2 4" units-per-em="1000" underline-position="-75.19531" underline-thickness="49.80469" slope="0" x-height="535.15625" cap-height="713.8672" ascent="1068.8477" descent="-292.96875" font-weight="400">
+ <font-face-src>
+ <font-face-name name="OpenSans"/>
+ </font-face-src>
+ </font-face>
+ <font-face font-family="Open Sans" font-size="16" panose-1="2 11 6 6 3 5 4 2 2 4" units-per-em="1000" underline-position="-75.19531" underline-thickness="49.80469" slope="0" x-height="535.15625" cap-height="713.8672" ascent="1068.8477" descent="-292.96875" font-weight="400">
+ <font-face-src>
+ <font-face-name name="OpenSans"/>
+ </font-face-src>
+ </font-face>
+ <marker orient="auto" overflow="visible" markerUnits="strokeWidth" id="Arrow_Marker" stroke-linejoin="miter" stroke-miterlimit="10" viewBox="-1 -4 10 8" markerWidth="10" markerHeight="8" color="black">
+ <g>
+ <path d="M 8 0 L 0 -3 L 0 3 Z" fill="none" stroke="currentColor" stroke-width="1"/>
+ </g>
+ </marker>
+ <font-face font-family="Open Sans" font-size="14" panose-1="2 11 6 6 3 5 4 2 2 4" units-per-em="1000" underline-position="-75.19531" underline-thickness="49.80469" slope="0" x-height="535.15625" cap-height="713.8672" ascent="1068.8477" descent="-292.96875" font-weight="400">
+ <font-face-src>
+ <font-face-name name="OpenSans"/>
+ </font-face-src>
+ </font-face>
+ <marker orient="auto" overflow="visible" markerUnits="strokeWidth" id="Arrow_Marker_2" stroke-linejoin="miter" stroke-miterlimit="10" viewBox="-1 -3 7 6" markerWidth="7" markerHeight="6" color="black">
+ <g>
+ <path d="M 4.8 0 L 0 -1.8 L 0 1.8 Z" fill="none" stroke="currentColor" stroke-width="1"/>
+ </g>
+ </marker>
+ <marker orient="auto" overflow="visible" markerUnits="strokeWidth" id="Arrow_Marker_3" stroke-linejoin="miter" stroke-miterlimit="10" viewBox="-6 -3 7 6" markerWidth="7" markerHeight="6" color="black">
+ <g>
+ <path d="M -4.8 0 L 0 1.8 L 0 -1.8 Z" fill="none" stroke="currentColor" stroke-width="1"/>
+ </g>
+ </marker>
+ </defs>
+ <metadata> Produced by OmniGraffle 7.10.2
+ <dc:date>2019-07-13 20:06:51 +0000</dc:date>
+ </metadata>
+ <g id="Canvas_1" fill="none" fill-opacity="1" stroke-opacity="1" stroke="none" stroke-dasharray="none">
+ <title>Canvas 1</title>
+ <g id="Canvas_1: Layer 1">
+ <title>Layer 1</title>
+ <g id="Graphic_109">
+ <title>path3065</title>
+ <rect x="658.5" y="448.92215" width="252.5" height="175.42034" fill="#feb211"/>
+ <rect x="658.5" y="448.92215" width="252.5" height="175.42034" stroke="#935f1c" stroke-linecap="butt" stroke-linejoin="round" stroke-width="1.2378083"/>
+ </g>
+ <g id="Graphic_157">
+ <rect x="789.8176" y="494.2005" width="108.43538" height="107.59905" fill="white"/>
+ <rect x="789.8176" y="494.2005" width="108.43538" height="107.59905" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
+ </g>
+ <g id="Graphic_108">
+ <title>text3067</title>
+ <text transform="translate(801.3429 497.27896)" fill="black">
+ <tspan font-family="Open Sans" font-size="15.554" font-weight="400" fill="black" x="0" y="17">JobManager</tspan>
+ </text>
+ </g>
+ <g id="Graphic_139">
+ <title>path3005</title>
+ <rect x="1022.5" y="587.489" width="204.1258" height="165.64334" fill="#feb211"/>
+ <rect x="1022.5" y="587.489" width="204.1258" height="165.64334" stroke="#935f1c" stroke-linecap="butt" stroke-linejoin="round" stroke-width="1.2378083"/>
+ </g>
+ <g id="Graphic_138">
+ <title>text3007</title>
+ <text transform="translate(1033.0026 719.1994)" fill="black">
+ <tspan font-family="Open Sans" font-size="17.554" font-weight="400" fill="black" x="0" y="19">TaskManager</tspan>
+ </text>
+ </g>
+ <g id="Graphic_137">
+ <title>path3009</title>
+ <rect x="1097.7558" y="619.6186" width="53.9009" height="88.297" fill="#e4eaf4"/>
+ </g>
+ <g id="Graphic_136">
+ <title>path3011</title>
+ <rect x="1097.7558" y="619.6186" width="53.9009" height="88.297" stroke="#898c92" stroke-linecap="butt" stroke-linejoin="round" stroke-width="1.2378083"/>
+ </g>
+ <g id="Graphic_135">
+ <title>text3013</title>
+ <text transform="translate(1109.8525 622.2164)" fill="black">
+ <tspan font-family="Open Sans" font-size="15.004" font-weight="400" fill="black" x="14566126e-20" y="16">Task</tspan>
+ </text>
+ </g>
+ <g id="Graphic_134">
+ <title>text3015</title>
+ <text transform="translate(1111.946 640.2209)" fill="black">
+ <tspan font-family="Open Sans" font-size="15.004" font-weight="400" fill="black" x="0" y="16">Slot</tspan>
+ </text>
+ </g>
+ <g id="Graphic_133">
+ <title>path3017</title>
+ <rect x="1162.1218" y="619.6186" width="53.9384" height="88.297" fill="#e4eaf4"/>
+ </g>
+ <g id="Graphic_132">
+ <title>path3019</title>
+ <rect x="1162.1218" y="619.6186" width="53.9384" height="88.297" stroke="#898c92" stroke-linecap="butt" stroke-linejoin="round" stroke-width="1.2378083"/>
+ </g>
+ <g id="Graphic_131">
+ <title>text3021</title>
+ <text transform="translate(1174.2174 622.2164)" fill="black">
+ <tspan font-family="Open Sans" font-size="15.004" font-weight="400" fill="black" x="14566126e-20" y="16">Task</tspan>
+ </text>
+ </g>
+ <g id="Graphic_130">
+ <title>text3023</title>
+ <text transform="translate(1176.3108 640.2209)" fill="black">
+ <tspan font-family="Open Sans" font-size="15.004" font-weight="400" fill="black" x="0" y="16">Slot</tspan>
+ </text>
+ </g>
+ <g id="Graphic_129">
+ <title>path3025</title>
+ <path d="M 1105.7078 682.2217 C 1105.7078 671.7191 1114.2224 663.2045 1124.725 663.2045 C 1135.1901 663.2045 1143.7047 671.7191 1143.7047 682.2217 C 1143.7047 692.6868 1135.1901 701.2014 1124.725 701.2014 C 1114.2224 701.2014 1105.7078 692.6868 1105.7078 682.2217" fill="#be73f1"/>
+ </g>
+ <g id="Graphic_128">
+ <title>path3027</title>
+ <path d="M 1105.7078 682.2217 C 1105.7078 671.7191 1114.2224 663.2045 1124.725 663.2045 C 1135.1901 663.2045 1143.7047 671.7191 1143.7047 682.2217 C 1143.7047 692.6868 1135.1901 701.2014 1124.725 701.2014 C 1114.2224 701.2014 1105.7078 692.6868 1105.7078 682.2217" stroke="#724591" stroke-linecap="butt" stroke-linejoin="round" stroke-width="1.2378083"/>
+ </g>
+ <g id="Graphic_127">
+ <title>text3029</title>
+ <text transform="translate(1112.8344 673.1163)" fill="black">
+ <tspan font-family="Open Sans" font-size="11.253" font-weight="400" fill="black" x="0" y="12">Task</tspan>
+ </text>
+ </g>
+ <g id="Graphic_126">
+ <title>path3031</title>
+ <rect x="1032.9021" y="619.6186" width="53.75089" height="88.297" fill="#e4eaf4"/>
+ </g>
+ <g id="Graphic_125">
+ <title>path3033</title>
+ <rect x="1032.9021" y="619.6186" width="53.75089" height="88.297" stroke="#898c92" stroke-linecap="butt" stroke-linejoin="round" stroke-width="1.2378083"/>
+ </g>
+ <g id="Graphic_124">
+ <title>text3035</title>
+ <text transform="translate(1044.9154 622.2164)" fill="black">
+ <tspan font-family="Open Sans" font-size="15.004" font-weight="400" fill="black" x="14566126e-20" y="16">Task</tspan>
+ </text>
+ </g>
+ <g id="Graphic_123">
+ <title>text3037</title>
+ <text transform="translate(1047.0088 640.2209)" fill="black">
+ <tspan font-family="Open Sans" font-size="15.004" font-weight="400" fill="black" x="0" y="16">Slot</tspan>
+ </text>
+ </g>
+ <g id="Graphic_122">
+ <title>path3039</title>
+ <path d="M 1040.7041 682.2217 C 1040.7041 671.7191 1049.2562 663.2045 1059.7588 663.2045 C 1070.299 663.2045 1078.8511 671.7191 1078.8511 682.2217 C 1078.8511 692.6868 1070.299 701.2014 1059.7588 701.2014 C 1049.2562 701.2014 1040.7041 692.6868 1040.7041 682.2217" fill="#be73f1"/>
+ </g>
+ <g id="Graphic_121">
+ <title>path3041</title>
+ <path d="M 1040.7041 682.2217 C 1040.7041 671.7191 1049.2562 663.2045 1059.7588 663.2045 C 1070.299 663.2045 1078.8511 671.7191 1078.8511 682.2217 C 1078.8511 692.6868 1070.299 701.2014 1059.7588 701.2014 C 1049.2562 701.2014 1040.7041 692.6868 1040.7041 682.2217" stroke="#724591" stroke-linecap="butt" stroke-linejoin="round" stroke-width="1.2378083"/>
+ </g>
+ <g id="Graphic_120">
+ <title>text3043</title>
+ <text transform="translate(1047.8972 673.1163)" fill="black">
+ <tspan font-family="Open Sans" font-size="11.253" font-weight="400" fill="black" x="0" y="12">Task</tspan>
+ </text>
+ </g>
+ <g id="Graphic_68">
+ <title>path3147</title>
+ <rect x="1022.5" y="321.48898" width="207.77898" height="165.64334" fill="#feb211"/>
+ <rect x="1022.5" y="321.48898" width="207.77898" height="165.64334" stroke="#935f1c" stroke-linecap="butt" stroke-linejoin="round" stroke-width="1.2378083"/>
+ </g>
+ <g id="Graphic_67">
+ <title>text3149</title>
+ <text transform="translate(1036.1409 327.7444)" fill="black">
+ <tspan font-family="Open Sans" font-size="17.554" font-weight="400" fill="black" x="0" y="19">TaskManager</tspan>
+ </text>
+ </g>
+ <g id="Graphic_66">
+ <title>path3151</title>
+ <rect x="1098.0063" y="368.8633" width="53.90093" height="88.297" fill="#e4eaf4"/>
+ </g>
+ <g id="Graphic_65">
+ <title>path3153</title>
+ <rect x="1098.0063" y="368.8633" width="53.90093" height="88.297" stroke="#898c92" stroke-linecap="butt" stroke-linejoin="round" stroke-width="1.2378083"/>
+ </g>
+ <g id="Graphic_64">
+ <title>text3155</title>
+ <text transform="translate(1110.0706 371.4611)" fill="black">
+ <tspan font-family="Open Sans" font-size="15.004" font-weight="400" fill="black" x="14566126e-20" y="16">Task</tspan>
+ </text>
+ </g>
+ <g id="Graphic_63">
+ <title>text3157</title>
+ <text transform="translate(1112.164 389.4656)" fill="black">
+ <tspan font-family="Open Sans" font-size="15.004" font-weight="400" fill="black" x="0" y="16">Slot</tspan>
+ </text>
+ </g>
+ <g id="Graphic_58">
+ <title>path3167</title>
+ <path d="M 1105.9583 431.4664 C 1105.9583 420.96376 1114.4729 412.44914 1124.9755 412.44914 C 1135.4406 412.44914 1143.9553 420.96376 1143.9553 431.4664 C 1143.9553 441.9315 1135.4406 450.4461 1124.9755 450.4461 C 1114.4729 450.4461 1105.9583 441.9315 1105.9583 431.4664" fill="#be73f1"/>
+ </g>
+ <g id="Graphic_57">
+ <title>path3169</title>
+ <path d="M 1105.9583 431.4664 C 1105.9583 420.96376 1114.4729 412.44914 1124.9755 412.44914 C 1135.4406 412.44914 1143.9553 420.96376 1143.9553 431.4664 C 1143.9553 441.9315 1135.4406 450.4461 1124.9755 450.4461 C 1114.4729 450.4461 1105.9583 441.9315 1105.9583 431.4664" stroke="#724591" stroke-linecap="butt" stroke-linejoin="round" stroke-width="1.2378083"/>
+ </g>
+ <g id="Graphic_56">
+ <title>text3171</title>
+ <text transform="translate(1113.0524 422.36093)" fill="black">
+ <tspan font-family="Open Sans" font-size="11.253" font-weight="400" fill="black" x="0" y="12">Task</tspan>
+ </text>
+ </g>
+ <g id="Graphic_55">
+ <title>path3173</title>
+ <rect x="1033.0026" y="368.8633" width="53.90093" height="88.297" fill="#e4eaf4"/>
+ </g>
+ <g id="Graphic_54">
+ <title>path3175</title>
+ <rect x="1033.0026" y="368.8633" width="53.90093" height="88.297" stroke="#898c92" stroke-linecap="butt" stroke-linejoin="round" stroke-width="1.2378083"/>
+ </g>
+ <g id="Graphic_53">
+ <title>text3177</title>
+ <text transform="translate(1045.1334 371.4611)" fill="black">
+ <tspan font-family="Open Sans" font-size="15.004" font-weight="400" fill="black" x="14566126e-20" y="16">Task</tspan>
+ </text>
+ </g>
+ <g id="Graphic_52">
+ <title>text3179</title>
+ <text transform="translate(1047.2268 389.4656)" fill="black">
+ <tspan font-family="Open Sans" font-size="15.004" font-weight="400" fill="black" x="0" y="16">Slot</tspan>
+ </text>
+ </g>
+ <g id="Graphic_51">
+ <title>path3181</title>
+ <path d="M 1040.9546 431.4664 C 1040.9546 420.96376 1049.4692 412.44914 1059.9343 412.44914 C 1070.437 412.44914 1078.9516 420.96376 1078.9516 431.4664 C 1078.9516 441.9315 1070.437 450.4461 1059.9343 450.4461 C 1049.4692 450.4461 1040.9546 441.9315 1040.9546 431.4664" fill="#be73f1"/>
+ </g>
+ <g id="Graphic_50">
+ <title>path3183</title>
+ <path d="M 1040.9546 431.4664 C 1040.9546 420.96376 1049.4692 412.44914 1059.9343 412.44914 C 1070.437 412.44914 1078.9516 420.96376 1078.9516 431.4664 C 1078.9516 441.9315 1070.437 450.4461 1059.9343 450.4461 C 1049.4692 450.4461 1040.9546 441.9315 1040.9546 431.4664" stroke="#724591" stroke-linecap="butt" stroke-linejoin="round" stroke-width="1.2378083"/>
+ </g>
+ <g id="Graphic_49">
+ <title>text3185</title>
+ <text transform="translate(1048.1152 422.36093)" fill="black">
+ <tspan font-family="Open Sans" font-size="11.253" font-weight="400" fill="black" x="0" y="12">Task</tspan>
+ </text>
+ </g>
+ <g id="Graphic_19">
+ <title>path3245</title>
+ <path d="M 796.97775 522.87986 L 796.97775 555.36296 L 892.4765 555.36296 L 892.4765 522.87987 L 796.97775 522.87987 Z" fill="#ccc"/>
+ </g>
+ <g id="Graphic_17">
+ <title>text3249</title>
+ <text transform="translate(813.6522 528.519)" fill="black">
+ <tspan font-family="Open Sans" font-size="13.203" font-weight="400" fill="black" x="58619776e-20" y="14">Scheduler</tspan>
+ </text>
+ </g>
+ <g id="Graphic_16">
+ <title>path3251</title>
+ <rect x="796.97775" y="558.96386" width="95.49879" height="32.37057" fill="#ccc"/>
+ </g>
+ <g id="Graphic_14">
+ <title>text3255</title>
+ <text transform="translate(809.4225 558.96386)" fill="black">
+ <tspan font-family="Open Sans" font-size="13.203" font-weight="400" fill="black" x="7460699e-19" y="14">Checkpoint</tspan>
+ </text>
+ </g>
+ <g id="Graphic_13">
+ <title>text3257</title>
+ <text transform="translate(807.1861 573.35086)" fill="black">
+ <tspan font-family="Open Sans" font-size="13.203" font-weight="400" fill="black" x="0" y="14">Coordinator</tspan>
+ </text>
+ </g>
+ <g id="Group_148">
+ <g id="Graphic_146">
+ <title>path2991</title>
+ <rect x="238" y="431.9156" width="264.44088" height="209.43342" fill="white"/>
+ </g>
+ <g id="Graphic_145">
+ <title>path2993</title>
+ <rect x="238" y="431.9156" width="264.44088" height="209.43342" stroke="black" stroke-linecap="butt" stroke-linejoin="round" stroke-width="1.256563"/>
+ </g>
+ <g id="Graphic_144">
+ <title>text2995</title>
+ <text transform="translate(251.53647 437.11805)" fill="black">
+ <tspan font-family="Open Sans" font-size="17.554" font-weight="400" fill="black" x="61106675e-20" y="19">Flink Client Program</tspan>
+ </text>
+ </g>
+ <g id="Graphic_143">
+ <title>path2997</title>
+ <path d="M 392.42597 553.50215 L 392.42597 634.9349 L 497.45213 634.9349 L 497.45213 553.50215 L 392.42597 553.50215 Z" fill="#e4eaf4"/>
+ </g>
+ <g id="Graphic_142">
+ <title>path2999</title>
+ <rect x="392.42597" y="553.50215" width="105.02616" height="81.43278" stroke="#898c92" stroke-linecap="butt" stroke-linejoin="round" stroke-width="1.256563"/>
+ </g>
+ <g id="Graphic_141">
+ <title>text3001</title>
+ <text transform="translate(419.6768 581.71854)" fill="black">
+ <tspan font-family="Open Sans" font-size="17.554" font-weight="400" fill="black" x="756728e-18" y="19">Client</tspan>
+ </text>
+ </g>
+ <g id="Graphic_23">
+ <title>path3237</title>
+ <path d="M 318.49505 468.80605 L 434.774 468.80605 L 434.774 516.0491 C 376.63453 516.0491 376.63453 534.05355 318.49505 523.83226 Z" fill="#e6526e"/>
+ </g>
+ <g id="Graphic_22">
+ <title>path3239</title>
+ <path d="M 318.49505 468.80605 L 434.774 468.80605 L 434.774 516.0491 C 376.63453 516.0491 376.63453 534.05355 318.49505 523.83226 Z" stroke="#8a3142" stroke-linecap="butt" stroke-linejoin="round" stroke-width="1.256563"/>
+ </g>
+ <g id="Graphic_21">
+ <title>text3241</title>
+ <text transform="translate(350.11894 473.4965)" fill="black">
+ <tspan font-family="Open Sans" font-size="13.203" font-weight="400" fill="black" x="0" y="14">Program</tspan>
+ </text>
+ </g>
+ <g id="Graphic_20">
+ <title>text3243</title>
+ <text transform="translate(361.9951 489.2504)" fill="black">
+ <tspan font-family="Open Sans" font-size="13.203" font-weight="400" fill="black" x="1030287e-19" y="14">code</tspan>
+ </text>
+ </g>
+ <g id="Graphic_12">
+ <title>path3259</title>
+ <rect x="249.72167" y="575.7444" width="107.83936" height="22" fill="#e4eaf4"/>
+ <rect x="249.72167" y="575.7444" width="107.83936" height="22" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
+ </g>
+ <g id="Graphic_9">
+ <title>text3265</title>
+ <text transform="translate(258.7243 575.66224)" fill="black">
+ <tspan font-family="Open Sans" font-size="13.803" font-weight="400" fill="black" x="0" y="15">Graph Builder</tspan>
+ </text>
+ </g>
+ <g id="Graphic_8">
+ <title>path3267</title>
+ <path d="M 297.6939 594.7624 L 296.88964 596.1315 L 296.9097 596.1315 L 296.14562 597.5006 L 296.14562 597.4818 L 295.844 598.0632 L 294.6376 597.5193 L 294.9392 596.9379 L 295.72338 595.5501 L 296.52766 594.16224 L 297.69386 594.7624 Z M 295.3012 599.151 L 294.85883 600.1638 L 294.879 600.1263 L 294.41653 601.4391 L 294.43668 601.3641 L 294.13508 602.62066 L 292.8281 602.3581 L 293.12972 601.064 L 293.6123 599.69494 L 294.07475 598.6822 L 295.3013 599.15105 Z M 294.05455 603.7 [...]
+ <path d="M 297.6939 594.7624 L 296.88964 596.1315 L 296.9097 596.1315 L 296.14562 597.5006 L 296.14562 597.4818 L 295.844 598.0632 L 294.6376 597.5193 L 294.9392 596.9379 L 295.72338 595.5501 L 296.52766 594.16224 L 297.69386 594.7624 Z M 295.3012 599.151 L 294.85883 600.1638 L 294.879 600.1263 L 294.41653 601.4391 L 294.43668 601.3641 L 294.13508 602.62066 L 292.8281 602.3581 L 293.12972 601.064 L 293.6123 599.69494 L 294.07475 598.6822 L 295.3013 599.15105 Z M 294.05455 603.7 [...]
+ </g>
+ <g id="Graphic_7">
+ <title>text3269</title>
+ <text transform="translate(286.43595 611.2774)" fill="black">
+ <tspan font-family="Open Sans" font-size="13.803" font-weight="400" fill="black" x="0" y="15">Job graph</tspan>
+ </text>
+ </g>
+ <g id="Graphic_6">
+ <title>path3271</title>
+ <path d="M 339.18145 512.9168 L 336.1807 515.52703 L 335.43052 514.3645 L 338.45 511.75425 Z M 335.16795 516.4044 L 332.1672 519.0366 L 331.41702 517.87406 L 334.41777 515.2419 Z M 331.19196 519.914 L 328.22872 522.612 L 327.45978 521.4714 L 330.42302 518.7734 L 331.19196 519.914 Z M 327.27224 523.53324 L 324.38402 526.31896 L 323.59632 525.2003 L 326.48454 522.3926 L 327.27224 523.53324 Z M 323.46504 527.2841 L 322.6586 528.0957 L 322.6774 528.0957 L 321.04574 529.82853 L 321. [...]
+ <path d="M 339.18145 512.9168 L 336.1807 515.52703 L 335.43052 514.3645 L 338.45 511.75425 Z M 335.16795 516.4044 L 332.1672 519.0366 L 331.41702 517.87406 L 334.41777 515.2419 Z M 331.19196 519.914 L 328.22872 522.612 L 327.45978 521.4714 L 330.42302 518.7734 L 331.19196 519.914 Z M 327.27224 523.53324 L 324.38402 526.31896 L 323.59632 525.2003 L 326.48454 522.3926 L 327.27224 523.53324 Z M 323.46504 527.2841 L 322.6586 528.0957 L 322.6774 528.0957 L 321.04574 529.82853 L 321. [...]
+ </g>
+ <g id="Graphic_5">
+ <title>text3273</title>
+ <text transform="translate(246.05536 503.37544)" fill="black">
+ <tspan font-family="Open Sans" font-size="13.803" font-weight="400" fill="black" x="24868996e-21" y="15">Program</tspan>
+ </text>
+ </g>
+ <g id="Graphic_4">
+ <title>text3275</title>
+ <text transform="translate(245.45508 519.87956)" fill="black">
+ <tspan font-family="Open Sans" font-size="13.803" font-weight="400" fill="black" x="0" y="15">Dataflow</tspan>
+ </text>
+ </g>
+ </g>
+ <g id="Graphic_154">
+ <path d="M 1129.8621 477.17903 L 1165.279 501.41006 L 1147.5705 501.41006 L 1147.5705 571.25246 L 1165.279 571.25246 L 1129.8621 595.4835 L 1094.5 571.25246 L 1112.1536 571.25246 L 1112.1536 501.41006 L 1094.5 501.41006 Z" fill="#dadada"/>
+ <path d="M 1129.8621 477.17903 L 1165.279 501.41006 L 1147.5705 501.41006 L 1147.5705 571.25246 L 1165.279 571.25246 L 1129.8621 595.4835 L 1094.5 571.25246 L 1112.1536 571.25246 L 1112.1536 501.41006 L 1094.5 501.41006 Z" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
+ <text transform="translate(1141.3895 482.17903) rotate(90)" fill="black">
+ <tspan font-family="Open Sans" font-size="16" font-weight="400" fill="black" x="6.0819225" y="17">DataStreams</tspan>
+ </text>
+ </g>
+ <g id="Line_156">
+ <path d="M 503.06916 536.98055 L 574.0703 537.16667 L 581.4531 537.47135 L 647.9812 537.1968" marker-end="url(#Arrow_Marker)" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-dasharray="4.0,4.0" stroke-width="1"/>
+ </g>
+ <g id="Graphic_158">
+ <rect x="671" y="546.7995" width="108.43538" height="55" fill="white"/>
+ <rect x="671" y="546.7995" width="108.43538" height="55" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
+ <text transform="translate(676 552.2995)" fill="black">
+ <tspan font-family="Open Sans" font-size="16" font-weight="400" fill="black" x="14.823158" y="17">Resource</tspan>
+ <tspan font-family="Open Sans" font-size="16" font-weight="400" fill="black" x="16.04972" y="39">Manager</tspan>
+ </text>
+ </g>
+ <g id="Graphic_159">
+ <rect x="671" y="494.2005" width="108.43538" height="37.99696" fill="white"/>
+ <rect x="671" y="494.2005" width="108.43538" height="37.99696" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
+ <text transform="translate(676 501.69896)" fill="black">
+ <tspan font-family="Open Sans" font-size="16" font-weight="400" fill="black" x="8.897376" y="17">Dispatcher</tspan>
+ </text>
+ </g>
+ <g id="Graphic_160">
+ <title>text3149</title>
+ <text transform="translate(671 454.5984)" fill="black">
+ <tspan font-family="Open Sans" font-size="17.554" font-weight="400" fill="black" x="0" y="19">Flink Master</tspan>
+ </text>
+ </g>
+ <g id="Graphic_161">
+ <rect x="537.57305" y="522.3231" width="80.57422" height="30" fill="white"/>
+ <text transform="translate(542.57305 527.3231)" fill="black">
+ <tspan font-family="Open Sans" font-size="14" font-weight="400" fill="black" x="0" y="15">Submit job</tspan>
+ </text>
+ </g>
+ <g id="Line_162">
+ <line x1="923.6482" y1="482.83516" x2="1009.8518" y2="449.4473" marker-end="url(#Arrow_Marker_2)" marker-start="url(#Arrow_Marker_3)" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
+ </g>
+ <g id="Line_163">
+ <line x1="923.6234" y1="591.2635" x2="1009.8766" y2="625.1944" marker-end="url(#Arrow_Marker_2)" marker-start="url(#Arrow_Marker_3)" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
+ </g>
+ <g id="Graphic_171">
+ <title>path3173</title>
+ <rect x="1163.01" y="368.8633" width="53.90093" height="88.297" fill="#e4eaf4"/>
+ </g>
+ <g id="Graphic_170">
+ <title>path3175</title>
+ <rect x="1163.01" y="368.8633" width="53.90093" height="88.297" stroke="#898c92" stroke-linecap="butt" stroke-linejoin="round" stroke-width="1.2378083"/>
+ </g>
+ <g id="Graphic_169">
+ <title>text3177</title>
+ <text transform="translate(1175.1408 371.4611)" fill="black">
+ <tspan font-family="Open Sans" font-size="15.004" font-weight="400" fill="black" x="14566126e-20" y="16">Task</tspan>
+ </text>
+ </g>
+ <g id="Graphic_168">
+ <title>text3179</title>
+ <text transform="translate(1177.2342 389.4656)" fill="black">
+ <tspan font-family="Open Sans" font-size="15.004" font-weight="400" fill="black" x="0" y="16">Slot</tspan>
+ </text>
+ </g>
+ <g id="Graphic_167">
+ <title>path3181</title>
+ <path d="M 1170.962 431.4664 C 1170.962 420.96376 1179.4766 412.44914 1189.9417 412.44914 C 1200.4443 412.44914 1208.959 420.96376 1208.959 431.4664 C 1208.959 441.9315 1200.4443 450.4461 1189.9417 450.4461 C 1179.4766 450.4461 1170.962 441.9315 1170.962 431.4664" fill="#be73f1"/>
+ </g>
+ <g id="Graphic_164">
+ <title>text3171</title>
+ <text transform="translate(1178.027 422.9476)" fill="black">
+ <tspan font-family="Open Sans" font-size="11.253" font-weight="400" fill="black" x="0" y="12">Task</tspan>
+ </text>
+ </g>
+ <g id="Graphic_166">
+ <title>path3183</title>
+ <path d="M 1170.962 431.4664 C 1170.962 420.96376 1179.4766 412.44914 1189.9417 412.44914 C 1200.4443 412.44914 1208.959 420.96376 1208.959 431.4664 C 1208.959 441.9315 1200.4443 450.4461 1189.9417 450.4461 C 1179.4766 450.4461 1170.962 441.9315 1170.962 431.4664" stroke="#724591" stroke-linecap="butt" stroke-linejoin="round" stroke-width="1.2378083"/>
+ </g>
+ </g>
+ </g>
+</svg>
diff --git a/docs/redirects/tutorials_datastream_api.md b/docs/redirects/tutorials_datastream_api.md
deleted file mode 100644
index 708bea5..0000000
--- a/docs/redirects/tutorials_datastream_api.md
+++ /dev/null
@@ -1,24 +0,0 @@
----
-title: "DataStream API"
-layout: redirect
-redirect: /getting-started/walkthroughs/datastream_api.html
-permalink: /tutorials/datastream_api.html
----
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements. See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership. The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied. See the License for the
-specific language governing permissions and limitations
-under the License.
--->
diff --git a/docs/tutorials/datastream_api.md b/docs/tutorials/datastream_api.md
new file mode 100644
index 0000000..3865eed
--- /dev/null
+++ b/docs/tutorials/datastream_api.md
@@ -0,0 +1,237 @@
+---
+title: Intro to the DataStream API
+nav-id: datastream-api
+nav-pos: 2
+nav-title: Intro to the DataStream API
+nav-parent_id: tutorials
+permalink: /tutorials/datastream_api.html
+---
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements. See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership. The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied. See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+The focus of this tutorial is to broadly cover the DataStream API well enough that you will be
+able to get started writing streaming applications.
+
+* This will be replaced by the TOC
+{:toc}
+
+## What can be Streamed?
+
+Flink's DataStream APIs for Java and Scala will let you stream anything they can serialize. Flink's
+own serializer is used for
+
+- basic types, i.e., String, Long, Integer, Boolean, Array
+- composite types: Tuples, POJOs, and Scala case classes
+
+and Flink falls back to Kryo for other types. It is also possible to use other serializers with
+Flink. Avro, in particular, is well supported.
+
+### Java tuples and POJOs
+
+Flink's native serializer can operate efficiently on tuples and POJOs.
+
+#### Tuples
+
+For Java, Flink defines its own `Tuple0` thru `Tuple25` types.
+
+{% highlight java %}
+Tuple2<String, Integer> person = Tuple2.of("Fred", 35);
+
+// zero based index!
+String name = person.f0;
+Integer age = person.f1;
+{% endhighlight %}
+
+#### POJOs
+
+Flink recognizes a data type as a POJO type (and allows “by-name” field referencing) if the following conditions are fulfilled:
+
+- The class is public and standalone (no non-static inner class)
+- The class has a public no-argument constructor
+- All non-static, non-transient fields in the class (and all superclasses) are either public (and
+ non-final) or have public getter- and setter- methods that follow the Java beans naming
+ conventions for getters and setters.
+
+Example:
+
+{% highlight java %}
+public class Person {
+ public String name;
+ public Integer age;
+ public Person() {};
+ public Person(String name, Integer age) {
+ . . .
+ };
+}
+
+Person person = new Person("Fred Flintstone", 35);
+{% endhighlight %}
+
+Flink's serializer [supports schema evolution for POJO types]({{ site.baseurl }}{% link dev/stream/state/schema_evolution.md %}#pojo-types).
+
+### Scala tuples and case classes
+
+These work just as you'd expect.
+
+{% top %}
+
+## A Complete Example
+
+This example takes a stream of records about people as input, and filters it to only include the adults.
+
+{% highlight java %}
+import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
+import org.apache.flink.streaming.api.datastream.DataStream;
+import org.apache.flink.api.common.functions.FilterFunction;
+
+public class Example {
+
+ public static void main(String[] args) throws Exception {
+ final StreamExecutionEnvironment env =
+ StreamExecutionEnvironment.getExecutionEnvironment();
+
+ DataStream<Person> flintstones = env.fromElements(
+ new Person("Fred", 35),
+ new Person("Wilma", 35),
+ new Person("Pebbles", 2));
+
+ DataStream<Person> adults = flintstones.filter(new FilterFunction<Person>() {
+ @Override
+ public boolean filter(Person person) throws Exception {
+ return person.age >= 18;
+ }
+ });
+
+ adults.print();
+
+ env.execute();
+ }
+
+ public static class Person {
+ public String name;
+ public Integer age;
+ public Person() {};
+
+ public Person(String name, Integer age) {
+ this.name = name;
+ this.age = age;
+ };
+
+ public String toString() {
+ return this.name.toString() + ": age " + this.age.toString();
+ };
+ }
+}
+{% endhighlight %}
+
+### Stream execution environment
+
+Every Flink application needs an execution environment, `env` in this example. Streaming
+applications need to use a `StreamExecutionEnvironment`.
+
+The DataStream API calls made in your application build a job graph that is attached to the
+`StreamExecutionEnvironment`. When `env.execute()` is called this graph is packaged up and sent to
+the Flink Master, which parallelizes the job and distributes slices of it to the Task Managers for
+execution. Each parallel slice of your job will be executed in a *task slot*.
+
+Note that if you don't call execute(), your application won't be run.
+
+<img src="{{ site.baseurl }}/fig/distributed-runtime.svg" alt="Flink runtime: client, job manager, task managers" class="offset" width="80%" />
+
+This distributed runtime depends on your application being serializable. It also requires that all
+dependencies are available to each node in the cluster.
+
+### Basic stream sources
+
+The example above constructs a `DataStream<Person>` using `env.fromElements(...)`. This is a
+convenient way to throw together a simple stream for use in a prototype or test. There is also a
+`fromCollection(Collection)` method on `StreamExecutionEnvironment`. So instead, you could do this:
+
+{% highlight java %}
+List<Person> people = new ArrayList<Person>();
+
+people.add(new Person("Fred", 35));
+people.add(new Person("Wilma", 35));
+people.add(new Person("Pebbles", 2));
+
+DataStream<Person> flintstones = env.fromCollection(people);
+{% endhighlight %}
+
+Another convenient way to get some data into a stream while prototyping is to use a socket
+
+{% highlight java %}
+DataStream<String> lines = env.socketTextStream("localhost", 9999)
+{% endhighlight %}
+
+or a file
+
+{% highlight java %}
+DataStream<String> lines = env.readTextFile("file:///path");
+{% endhighlight %}
+
+In real applications the most commonly used data sources are those that support low-latency, high
+throughput parallel reads in combination with rewind and replay -- the prerequisites for high
+performance and fault tolerance -- such as Apache Kafka, Kinesis, and various filesystems. REST APIs
+and databases are also frequently used for stream enrichment.
+
+### Basic stream sinks
+
+The example above uses `adults.print()` to print its results to the task manager logs (which will
+appear in your IDE's console, when running in an IDE). This will call `toString()` on each element
+of the stream.
+
+The output looks something like this
+
+ 1> Fred: age 35
+ 2> Wilma: age 35
+
+where 1> and 2> indicate which sub-task (i.e., thread) produced the output.
+
+In production, commonly used sinks include the StreamingFileSink, various databases,
+and several pub-sub systems.
+
+### Debugging
+
+In production, your application will run in a remote cluster or set of containers. And if it fails,
+it will fail remotely. The Flink Master and Task Manager logs can be very helpful in debugging such
+failures, but it is much easier to do local debugging inside an IDE, which is something that Flink
+supports. You can set breakpoints, examine local variables, and step through your code. You can also
+step into Flink's code, which can be a great way to learn more about its internals if you are
+curious to see how Flink works.
+
+{% top %}
+
+## Hands-on
+
+At this point you know enough to get started coding and running a simple DataStream application.
+Clone the [flink-training repo](https://github.com/apache/flink-training/tree/{% if site.is_stable %}release-{{ site.version_title }}{% else %}master{% endif %}), and after following the
+instructions in the README, do the first exercise:
+[Filtering a Stream (Ride Cleansing)](https://github.com/apache/flink-training/tree/{% if site.is_stable %}release-{{ site.version_title }}{% else %}master{% endif %}/ride-cleansing).
+
+{% top %}
+
+## Further Reading
+
+- [Flink Serialization Tuning Vol. 1: Choosing your Serializer — if you can](https://flink.apache.org/news/2020/04/15/flink-serialization-tuning-vol-1.html)
+- [Anatomy of a Flink Program]({{ site.baseurl }}{% link dev/api_concepts.md %}#anatomy-of-a-flink-program)
+- [Data Sources]({{ site.baseurl }}{% link dev/datastream_api.md %}#data-sources)
+- [Data Sinks]({{ site.baseurl }}{% link dev/datastream_api.md %}#data-sinks)
+- [DataStream Connectors]({{ site.baseurl }}{% link dev/connectors/index.md %})
+
+{% top %}
diff --git a/docs/tutorials/datastream_api.zh.md b/docs/tutorials/datastream_api.zh.md
new file mode 100644
index 0000000..6706c18
--- /dev/null
+++ b/docs/tutorials/datastream_api.zh.md
@@ -0,0 +1,237 @@
+---
+title: Intro to the DataStream API
+nav-id: datastream-api
+nav-pos: 2
+nav-title: Intro to the DataStream API
+nav-parent_id: tutorials
+permalink: /tutorials/datastream_api.html
+---
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements. See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership. The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied. See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+The focus of this tutorial is to broadly cover the DataStream API well enough that you will be
+able to get started writing streaming applications.
+
+* This will be replaced by the TOC
+{:toc}
+
+## What can be Streamed?
+
+Flink's DataStream APIs for Java and Scala will let you stream anything they can serialize. Flink's
+own serializer is used for
+
+- basic types, i.e., String, Long, Integer, Boolean, Array
+- composite types: Tuples, POJOs, and Scala case classes
+
+and Flink falls back to Kryo for other types. It is also possible to use other serializers with
+Flink. Avro, in particular, is well supported.
+
+### Java tuples and POJOs
+
+Flink's native serializer can operate efficiently on tuples and POJOs.
+
+#### Tuples
+
+For Java, Flink defines its own `Tuple0` thru `Tuple25` types.
+
+{% highlight java %}
+Tuple2<String, Integer> person = Tuple2.of("Fred", 35);
+
+// zero based index!
+String name = person.f0;
+Integer age = person.f1;
+{% endhighlight %}
+
+#### POJOs
+
+Flink recognizes a data type as a POJO type (and allows “by-name” field referencing) if the following conditions are fulfilled:
+
+- The class is public and standalone (no non-static inner class)
+- The class has a public no-argument constructor
+- All non-static, non-transient fields in the class (and all superclasses) are either public (and
+ non-final) or have public getter- and setter- methods that follow the Java beans naming
+ conventions for getters and setters.
+
+Example:
+
+{% highlight java %}
+public class Person {
+ public String name;
+ public Integer age;
+ public Person() {};
+ public Person(String name, Integer age) {
+ . . .
+ };
+}
+
+Person person = new Person("Fred Flintstone", 35);
+{% endhighlight %}
+
+Flink's serializer [supports schema evolution for POJO types]({{ site.baseurl }}{% link dev/stream/state/schema_evolution.zh.md %}#pojo-types).
+
+### Scala tuples and case classes
+
+These work just as you'd expect.
+
+{% top %}
+
+## A Complete Example
+
+This example takes a stream of records about people as input, and filters it to only include the adults.
+
+{% highlight java %}
+import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
+import org.apache.flink.streaming.api.datastream.DataStream;
+import org.apache.flink.api.common.functions.FilterFunction;
+
+public class Example {
+
+ public static void main(String[] args) throws Exception {
+ final StreamExecutionEnvironment env =
+ StreamExecutionEnvironment.getExecutionEnvironment();
+
+ DataStream<Person> flintstones = env.fromElements(
+ new Person("Fred", 35),
+ new Person("Wilma", 35),
+ new Person("Pebbles", 2));
+
+ DataStream<Person> adults = flintstones.filter(new FilterFunction<Person>() {
+ @Override
+ public boolean filter(Person person) throws Exception {
+ return person.age >= 18;
+ }
+ });
+
+ adults.print();
+
+ env.execute();
+ }
+
+ public static class Person {
+ public String name;
+ public Integer age;
+ public Person() {};
+
+ public Person(String name, Integer age) {
+ this.name = name;
+ this.age = age;
+ };
+
+ public String toString() {
+ return this.name.toString() + ": age " + this.age.toString();
+ };
+ }
+}
+{% endhighlight %}
+
+### Stream execution environment
+
+Every Flink application needs an execution environment, `env` in this example. Streaming
+applications need to use a `StreamExecutionEnvironment`.
+
+The DataStream API calls made in your application build a job graph that is attached to the
+`StreamExecutionEnvironment`. When `env.execute()` is called this graph is packaged up and sent to
+the Flink Master, which parallelizes the job and distributes slices of it to the Task Managers for
+execution. Each parallel slice of your job will be executed in a *task slot*.
+
+Note that if you don't call execute(), your application won't be run.
+
+<img src="{{ site.baseurl }}/fig/distributed-runtime.svg" alt="Flink runtime: client, job manager, task managers" class="offset" width="80%" />
+
+This distributed runtime depends on your application being serializable. It also requires that all
+dependencies are available to each node in the cluster.
+
+### Basic stream sources
+
+The example above constructs a `DataStream<Person>` using `env.fromElements(...)`. This is a
+convenient way to throw together a simple stream for use in a prototype or test. There is also a
+`fromCollection(Collection)` method on `StreamExecutionEnvironment`. So instead, you could do this:
+
+{% highlight java %}
+List<Person> people = new ArrayList<Person>();
+
+people.add(new Person("Fred", 35));
+people.add(new Person("Wilma", 35));
+people.add(new Person("Pebbles", 2));
+
+DataStream<Person> flintstones = env.fromCollection(people);
+{% endhighlight %}
+
+Another convenient way to get some data into a stream while prototyping is to use a socket
+
+{% highlight java %}
+DataStream<String> lines = env.socketTextStream("localhost", 9999)
+{% endhighlight %}
+
+or a file
+
+{% highlight java %}
+DataStream<String> lines = env.readTextFile("file:///path");
+{% endhighlight %}
+
+In real applications the most commonly used data sources are those that support low-latency, high
+throughput parallel reads in combination with rewind and replay -- the prerequisites for high
+performance and fault tolerance -- such as Apache Kafka, Kinesis, and various filesystems. REST APIs
+and databases are also frequently used for stream enrichment.
+
+### Basic stream sinks
+
+The example above uses `adults.print()` to print its results to the task manager logs (which will
+appear in your IDE's console, when running in an IDE). This will call `toString()` on each element
+of the stream.
+
+The output looks something like this
+
+ 1> Fred: age 35
+ 2> Wilma: age 35
+
+where 1> and 2> indicate which sub-task (i.e., thread) produced the output.
+
+In production, commonly used sinks include the StreamingFileSink, various databases,
+and several pub-sub systems.
+
+### Debugging
+
+In production, your application will run in a remote cluster or set of containers. And if it fails,
+it will fail remotely. The Flink Master and Task Manager logs can be very helpful in debugging such
+failures, but it is much easier to do local debugging inside an IDE, which is something that Flink
+supports. You can set breakpoints, examine local variables, and step through your code. You can also
+step into Flink's code, which can be a great way to learn more about its internals if you are
+curious to see how Flink works.
+
+{% top %}
+
+## Hands-on
+
+At this point you know enough to get started coding and running a simple DataStream application.
+Clone the [flink-training repo](https://github.com/apache/flink-training/tree/{% if site.is_stable %}release-{{ site.version_title }}{% else %}master{% endif %}), and after following the
+instructions in the README, do the first exercise:
+[Filtering a Stream (Ride Cleansing)](https://github.com/apache/flink-training/tree/{% if site.is_stable %}release-{{ site.version_title }}{% else %}master{% endif %}/ride-cleansing).
+
+{% top %}
+
+## Further Reading
+
+- [Flink Serialization Tuning Vol. 1: Choosing your Serializer — if you can](https://flink.apache.org/news/2020/04/15/flink-serialization-tuning-vol-1.html)
+- [Anatomy of a Flink Program]({{ site.baseurl }}{% link dev/api_concepts.zh.md %}#anatomy-of-a-flink-program)
+- [Data Sources]({{ site.baseurl }}{% link dev/datastream_api.zh.md %}#data-sources)
+- [Data Sinks]({{ site.baseurl }}{% link dev/datastream_api.zh.md %}#data-sinks)
+- [DataStream Connectors]({{ site.baseurl }}{% link dev/connectors/index.zh.md %})
+
+{% top %}