From e3a2e1905f5e092a262e5118fc730eb44b648eae Mon Sep 17 00:00:00 2001 From: Oliver Date: Tue, 16 Mar 2021 01:25:32 -0400 Subject: [PATCH] Slides --- .../slide/2021-03-18-ParallelQueries.erb | 474 ++++++++- .../2021sp/slide/2021-03-18/bottlenecks.svg | 260 +++++ .../slide/2021-03-18/communication_base.svg | 14 +- .../slide/2021-03-18/communication_numa.svg | 692 +++++++++++++ .../2021-03-18/communication_sharedmem.svg | 422 ++++++++ .../communication_sharednothing.svg | 557 +++++++++++ .../slide/2021-03-18/partition_challenge.svg | 542 ++++++++++ .../cse-562/2021sp/slide/2021-03-18/query.svg | 493 ++++++++++ .../slide/2021-03-18/query_aggregate.svg | 626 ++++++++++++ .../2021-03-18/query_aggregate_merge.svg | 713 ++++++++++++++ .../2021sp/slide/2021-03-18/query_full.svg | 923 ++++++++++++++++++ .../slide/2021-03-18/query_partition.svg | 782 +++++++++++++++ .../slide/2021-03-18/query_pipeline.svg | 637 ++++++++++++ .../2021sp/slide/2021-03-18/reshuffle.svg | 716 ++++++++++++++ .../slide/2021-03-18/semijoin_actual.svg | 364 +++++++ .../slide/2021-03-18/semijoin_bloom.svg | 286 ++++++ .../slide/2021-03-18/semijoin_example.svg | 288 ++++++ .../slide/2021-03-18/semijoin_naive.svg | 264 +++++ .../2021sp/slide/2021-03-18/single_worker.svg | 295 ++++++ 19 files changed, 9331 insertions(+), 17 deletions(-) create mode 100644 src/teaching/cse-562/2021sp/slide/2021-03-18/bottlenecks.svg create mode 100644 src/teaching/cse-562/2021sp/slide/2021-03-18/communication_numa.svg create mode 100644 src/teaching/cse-562/2021sp/slide/2021-03-18/communication_sharedmem.svg create mode 100644 src/teaching/cse-562/2021sp/slide/2021-03-18/communication_sharednothing.svg create mode 100644 src/teaching/cse-562/2021sp/slide/2021-03-18/partition_challenge.svg create mode 100644 src/teaching/cse-562/2021sp/slide/2021-03-18/query.svg create mode 100644 src/teaching/cse-562/2021sp/slide/2021-03-18/query_aggregate.svg create mode 100644 src/teaching/cse-562/2021sp/slide/2021-03-18/query_aggregate_merge.svg create mode 100644 src/teaching/cse-562/2021sp/slide/2021-03-18/query_full.svg create mode 100644 src/teaching/cse-562/2021sp/slide/2021-03-18/query_partition.svg create mode 100644 src/teaching/cse-562/2021sp/slide/2021-03-18/query_pipeline.svg create mode 100644 src/teaching/cse-562/2021sp/slide/2021-03-18/reshuffle.svg create mode 100644 src/teaching/cse-562/2021sp/slide/2021-03-18/semijoin_actual.svg create mode 100644 src/teaching/cse-562/2021sp/slide/2021-03-18/semijoin_bloom.svg create mode 100644 src/teaching/cse-562/2021sp/slide/2021-03-18/semijoin_example.svg create mode 100644 src/teaching/cse-562/2021sp/slide/2021-03-18/semijoin_naive.svg create mode 100644 src/teaching/cse-562/2021sp/slide/2021-03-18/single_worker.svg diff --git a/src/teaching/cse-562/2021sp/slide/2021-03-18-ParallelQueries.erb b/src/teaching/cse-562/2021sp/slide/2021-03-18-ParallelQueries.erb index b5d16a53..60b43c7f 100644 --- a/src/teaching/cse-562/2021sp/slide/2021-03-18-ParallelQueries.erb +++ b/src/teaching/cse-562/2021sp/slide/2021-03-18-ParallelQueries.erb @@ -27,15 +27,54 @@ textbook: Ch. 20.1, 20.3, 20.4
- +
- - - +
+

Communication Models

+ +
-

Splitting Work

+

Shared Memory

+ +
+ +
+

Non-Uniform Memory Access

+ +
+ +
+

Shared Nothing / Message Passing

+ +
+ +
+
+
Shared Memory
+
HDFS, S3, RAM+Modern OSes
+
NUMA
+
AMD CPUs
+
Shared Nothing
+
MPP, Actor Model
+ +

Today we want to clearly see the communications.

+
+ +
+ + +
+ +
+

The Basic Model

+ + +
+ +
+

Putting Workers Together

@@ -43,7 +82,39 @@ textbook: Ch. 20.1, 20.3, 20.4
- + +
+
+ +
+
+

No Parallelism

+ + freesvg.org +
+ +
+

"Pipeline" Parallelism

+ + freesvg.org +
+ +
+

"Pipeline" Parallelism

+ + freesvg.org +
+ +
+

Together

+ + freesvg.org +
+
+ +
+
+
@@ -51,17 +122,400 @@ textbook: Ch. 20.1, 20.3, 20.4 - + - + - + -
ReplicationReplication Partitioning (Sharding)
+ +
+

How to Partition Data?

+ +
    +
  • Arbitrarily
  • +
  • Range
  • +
  • Hash
  • +
+ +

look familiar?

+
+ +
+

Can we run each worker on one partition?

+
+ +
+

Filter

+ +

Yes

+ +

$N$ partitions in, $N$ partitions out

+
+ +
+

Project

+ +

Yes

+ +

$N$ partitions in, $N$ partitions out

+
+ +
+

Union

+ +

Yes

+ +

Trick question, just combines partitions!

+
+ +
+

(Single-row) Aggregate

+ +

No

+ +

$N$ partitions in, $1$ partition out

+
+
+ +
+
+ +
+ +
+

Partial Aggregation

+ +
+
Algebraic Aggregates (Count, Sum, Avg, Min, Max)
+
Bounded-size intermediate state
+ +
Holistic Aggregates (Median, Mode, Count-Distinct)
+
Unbounded-size intermediate state
+
+
+ +
+
+ $$\Sigma_{SUM} (R_1 \uplus R_2 \uplus \ldots \uplus R_N)$$ +
+

Aggregate needs to process $N$ partitions.

+ +
+ $$\Sigma_{SUM} (\Sigma_{SUM}(R_1) \uplus \Sigma_{SUM}(R_2) \uplus \ldots \uplus \Sigma_{SUM}(R_N))$$ +
+

Final aggregate only needs to process $N$ tuples.

+
+ +
+
+ $$\Sigma_{AVG} (R_1 \uplus R_2 \uplus \ldots \uplus R_N)$$ +
+

↓↓↓↓↓

+
+ $$\Sigma_{\frac{SUM(A)}{SUM(B)}} (\Sigma_{A \leftarrow SUM,\; B \leftarrow COUNT}(R_1) \ldots \Sigma_{A \leftarrow SUM,\; B \leftarrow COUNT}(R_N))$$ +
+
+ +
+

Basic Aggregate Pattern

+
+
Init
+
Define a starting value for the accumulator
+
Fold(Accum, New)
+
Merge a new value into the accumulator
+
Finalize(Accum)
+
Extract the aggregate from the accumulator.
+
Merge(Accum, Accum)
+
Merge two accumulators together.
+
+
+ +
+ +
+
+ +
+
+

Joins

+ +

No

+ +

Every partition from one table needs to pair
with every partition from the other.

+
+ +
+ $$(R_1 \uplus \ldots \uplus R_N) \bowtie (S_1 \uplus \ldots \uplus S_K)$$ +

↓↓↓↓↓↓

+ $$(R_1 \bowtie S_1) \uplus \ldots \uplus (R_1 \bowtie S_K)$$ + $$\ldots\uplus \ldots \uplus \ldots$$ + $$(R_N \bowtie S_1) \uplus \ldots \uplus (R_N \bowtie S_K)$$ +
+ +
+ + + + + <% (1..4).each do |j| %><%end%> + + + <% (1..4).each do |i| %> + + + <% (1..4).each do |j| %><%end%> + + <% end %> +
$S_<%= j %>$
$R_<%=i%>$$R_<%=i%>\bowtie S_<%=j%>$
+ +

$N$ workers gets us $\sqrt{N}$ scaling

+
+ +
+

How to Partition Data?

+ +
    +
  • Arbitrarily
  • +
  • Range
  • +
  • Hash
  • +
+
+ +
+ $$R \bowtie_{A} S$$ + + $$R_i = \sigma_{\texttt{hash}(A) = i}(R)$$ + $$S_i = \sigma_{\texttt{hash}(A) = i}(S)$$ +
+ +
+ + + + <% (1..4).each do |j| %><%end%> + + + <% (1..4).each do |i| %> + + + <% (1..4).each do |j| %> + <% if i == j %> + + <% else %> + + <% end %> + <% end %> + + <% end %> +
$S_<%= j %>$
$R_<%=i%>$$R_<%=i%>\bowtie S_<%=j%>$$R_<%=i%>\bowtie S_<%=j%>$
+

Back to $N$ scaling for $N$ workers

+
+ +
+

What if the partitions aren't aligned so nicely?

+
+ +
+ +
+
+ +
+
+

Can we do better?

+

Focus on $R_1 \bowtie_B S_1$

+ +

Problem: All tuples in $R_1$ and $S_1$ need to be
sent to the same worker.

+
+ +
+

Data Transfer

+ +
    +
  • Limited IO/Network bandwidth
  • +
  • Compute needed to receive data
  • +
+
+ +
+

Idea 1: Put the worker on the node that has the data!

+

Problem: What if the data is on 2 different nodes?

+

Idea 1.b: Put the worker on one of the nodes with data.

+
+ +
+

Can we reduce network use more?

+
+ +
+ +
+ +
+ +
+ +
+ +
+
+ +
+
+

Problem: Worker 2 is still sending a lot of data.

+

Idea: Compress $\pi_B(S_1)$

+
+ +
+

Lossy Compression

+

(not all errors are equal)

+ +
+
False Positives
+
($b \in \pi_B(S_1)$ when it isn't)
+
not ideal, but ok
+ +
False Negatives
+
($b \not\in \pi_B(S_1)$ when it is)
+
bad, wrong answer!
+
+
+ +
+

Bloom Filters

+ + $$filter \leftarrow \texttt{Bloom}(\textbf{Alice}, \textbf{Bob}, \textbf{Carol}, \textbf{Dave})$$ + + + + + + + + + + + + + + + + +
User: Is Alice part of the set?$filter$: Yes
User: Is Eve part of the set?$filter$: No
User: Is Fred part of the set?$filter$: Yes
+
+ +
+

Bloom Filter

+ +

Test always returns Yes if the element is in the set.

+

Test usually returns No if the element is not in the set.

+
+ +
+

Bloom Filters

+ +

A bloom filter is an array of bits.

+ +

$M$: Number of bits in the array.

+

$K$: Number of hash functions.

+
+ +
+

For one record/key

+
    +
  1. $\forall i \in [M] : filter[i] = 0$
  2. +
  3. $\forall j \in [K] : filter[\texttt{hash}_j(key)] = 1$
  4. +
+

Each bit vector has $\sim K$ bits set.

+
+ +
+ + + + + + + + + + + + + + + + + +
$Key_1$00101010
$Key_2$01010110
$Key_3$10000110
$Key_4$01001100
+ +
+

Filters are combined by Bitwise-OR

+ $$Key_1 \;|\; Key_2 = 01111110$$ +
+ +
+

Test for inclusion by checking for bits

+ $$Key_i \;\&\; filter = Key_i$$ +
+
+ +
+ + + + + + + + + + + + + + + + + +
$Key_1$00101010
$Key_2$01010110
$Key_3$10000110
$Key_4$01001100
+ +
+ $$Key_1 \;|\; Key_2 = 01111110$$ +
+ + + + + + + + + + + + + + + + + +
$Key_1 \;\&\; 01111110$00101010
$Key_3 \;\&\; 01111110$00101010
$Key_4 \;\&\; 01111110$01001100
+

(False positive)

+
+ +
+ +
+
+ +
+ Next time: Online Aggregation/AQP
\ No newline at end of file diff --git a/src/teaching/cse-562/2021sp/slide/2021-03-18/bottlenecks.svg b/src/teaching/cse-562/2021sp/slide/2021-03-18/bottlenecks.svg new file mode 100644 index 00000000..63fc6e49 --- /dev/null +++ b/src/teaching/cse-562/2021sp/slide/2021-03-18/bottlenecks.svg @@ -0,0 +1,260 @@ + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + Input + + + + + + + queue + + + + + Output + + Worker + + Data doesn'tarrive fast enough + + + + + Worker processes data slower than it arrives + + + diff --git a/src/teaching/cse-562/2021sp/slide/2021-03-18/communication_base.svg b/src/teaching/cse-562/2021sp/slide/2021-03-18/communication_base.svg index 57a33ac7..7694c618 100644 --- a/src/teaching/cse-562/2021sp/slide/2021-03-18/communication_base.svg +++ b/src/teaching/cse-562/2021sp/slide/2021-03-18/communication_base.svg @@ -13,7 +13,7 @@ viewBox="0 0 261.96362 119.64035" version="1.1" id="svg78" - inkscape:version="1.0.2 (e86c870879, 2021-01-15)" + inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)" sodipodi:docname="communication_base.svg"> @@ -251,10 +251,10 @@ inkscape:current-layer="layer1" inkscape:document-rotation="0" showgrid="false" - inkscape:window-width="2048" - inkscape:window-height="1152" - inkscape:window-x="0" - inkscape:window-y="0" + inkscape:window-width="1920" + inkscape:window-height="1053" + inkscape:window-x="960" + inkscape:window-y="398" inkscape:window-maximized="1" /> @@ -264,7 +264,7 @@ image/svg+xml - + @@ -427,7 +427,7 @@ id="image163" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + CPU + + + Memory + + + Disk + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/teaching/cse-562/2021sp/slide/2021-03-18/communication_sharedmem.svg b/src/teaching/cse-562/2021sp/slide/2021-03-18/communication_sharedmem.svg new file mode 100644 index 00000000..d2dff669 --- /dev/null +++ b/src/teaching/cse-562/2021sp/slide/2021-03-18/communication_sharedmem.svg @@ -0,0 +1,422 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + CPU + + + Memory + + + Disk + + + + + + + + + + + + + + + + + + + IllusorySpace w/ Reads/Writes + + diff --git a/src/teaching/cse-562/2021sp/slide/2021-03-18/communication_sharednothing.svg b/src/teaching/cse-562/2021sp/slide/2021-03-18/communication_sharednothing.svg new file mode 100644 index 00000000..331f75c6 --- /dev/null +++ b/src/teaching/cse-562/2021sp/slide/2021-03-18/communication_sharednothing.svg @@ -0,0 +1,557 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + CPU + + + Memory + + + Disk + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/teaching/cse-562/2021sp/slide/2021-03-18/partition_challenge.svg b/src/teaching/cse-562/2021sp/slide/2021-03-18/partition_challenge.svg new file mode 100644 index 00000000..497b1098 --- /dev/null +++ b/src/teaching/cse-562/2021sp/slide/2021-03-18/partition_challenge.svg @@ -0,0 +1,542 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + R2 + + + + + + + + + + + + + + R1 + R1 = R2 + + + + diff --git a/src/teaching/cse-562/2021sp/slide/2021-03-18/query.svg b/src/teaching/cse-562/2021sp/slide/2021-03-18/query.svg new file mode 100644 index 00000000..996149fe --- /dev/null +++ b/src/teaching/cse-562/2021sp/slide/2021-03-18/query.svg @@ -0,0 +1,493 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + π + σ + + + + + + + + + + diff --git a/src/teaching/cse-562/2021sp/slide/2021-03-18/query_aggregate.svg b/src/teaching/cse-562/2021sp/slide/2021-03-18/query_aggregate.svg new file mode 100644 index 00000000..b553df25 --- /dev/null +++ b/src/teaching/cse-562/2021sp/slide/2021-03-18/query_aggregate.svg @@ -0,0 +1,626 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Bottleneck! + + + Σ + + x100,000 + + diff --git a/src/teaching/cse-562/2021sp/slide/2021-03-18/query_aggregate_merge.svg b/src/teaching/cse-562/2021sp/slide/2021-03-18/query_aggregate_merge.svg new file mode 100644 index 00000000..b06bd6fb --- /dev/null +++ b/src/teaching/cse-562/2021sp/slide/2021-03-18/query_aggregate_merge.svg @@ -0,0 +1,713 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Fold + Fold + Fold + Fold + + + + + + + + + + + + + + + + + + + + + + + Merge + Merge + Merge+Finalize + + diff --git a/src/teaching/cse-562/2021sp/slide/2021-03-18/query_full.svg b/src/teaching/cse-562/2021sp/slide/2021-03-18/query_full.svg new file mode 100644 index 00000000..4b6af04d --- /dev/null +++ b/src/teaching/cse-562/2021sp/slide/2021-03-18/query_full.svg @@ -0,0 +1,923 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + σ + + + + + + + + + + + + + + + + + + + + + + + + π + + + + + diff --git a/src/teaching/cse-562/2021sp/slide/2021-03-18/query_partition.svg b/src/teaching/cse-562/2021sp/slide/2021-03-18/query_partition.svg new file mode 100644 index 00000000..b34b87cb --- /dev/null +++ b/src/teaching/cse-562/2021sp/slide/2021-03-18/query_partition.svg @@ -0,0 +1,782 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + π + σ + + + + + + + + + + + + + π + σ + + + + + + + + + + + + π + σ + + + + + + + + + + + diff --git a/src/teaching/cse-562/2021sp/slide/2021-03-18/query_pipeline.svg b/src/teaching/cse-562/2021sp/slide/2021-03-18/query_pipeline.svg new file mode 100644 index 00000000..9f35516e --- /dev/null +++ b/src/teaching/cse-562/2021sp/slide/2021-03-18/query_pipeline.svg @@ -0,0 +1,637 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + σ + + + + + + + + + + + + + + + + + + + + + + + + π + + + + + diff --git a/src/teaching/cse-562/2021sp/slide/2021-03-18/reshuffle.svg b/src/teaching/cse-562/2021sp/slide/2021-03-18/reshuffle.svg new file mode 100644 index 00000000..8ace4dd3 --- /dev/null +++ b/src/teaching/cse-562/2021sp/slide/2021-03-18/reshuffle.svg @@ -0,0 +1,716 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + "Reshuffle" + + + (each tuple goes to exactly one place) + + diff --git a/src/teaching/cse-562/2021sp/slide/2021-03-18/semijoin_actual.svg b/src/teaching/cse-562/2021sp/slide/2021-03-18/semijoin_actual.svg new file mode 100644 index 00000000..cd623af5 --- /dev/null +++ b/src/teaching/cse-562/2021sp/slide/2021-03-18/semijoin_actual.svg @@ -0,0 +1,364 @@ + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + R1 + + + + S1 + + Worker 1 + Worker 2 + + + + + + S1 + + πB( ) + + + + + + + + R1 + + + + S1 + + ⋈πB( ) + + + diff --git a/src/teaching/cse-562/2021sp/slide/2021-03-18/semijoin_bloom.svg b/src/teaching/cse-562/2021sp/slide/2021-03-18/semijoin_bloom.svg new file mode 100644 index 00000000..bdf4825a --- /dev/null +++ b/src/teaching/cse-562/2021sp/slide/2021-03-18/semijoin_bloom.svg @@ -0,0 +1,286 @@ + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + Worker 1 + Worker 2 + + <A,1><B,2><C,2><D,3><E,4> + <2,X><3,Y><6,Y> + + Send me rows whereB∈bloom({2,3,6}) + + + + <B,2><C,2><D,3><E,4> + + + This is called abloom-join + + diff --git a/src/teaching/cse-562/2021sp/slide/2021-03-18/semijoin_example.svg b/src/teaching/cse-562/2021sp/slide/2021-03-18/semijoin_example.svg new file mode 100644 index 00000000..ef53eedf --- /dev/null +++ b/src/teaching/cse-562/2021sp/slide/2021-03-18/semijoin_example.svg @@ -0,0 +1,288 @@ + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + Worker 1 + Worker 2 + + <A,1><B,2><C,2><D,3><E,4> + <2,X><3,Y><6,Y> + + Sendme rowswhereB∈{2,3,6} + + + + <B,2><C,2><D,3> + + + This is called asemi-join + + diff --git a/src/teaching/cse-562/2021sp/slide/2021-03-18/semijoin_naive.svg b/src/teaching/cse-562/2021sp/slide/2021-03-18/semijoin_naive.svg new file mode 100644 index 00000000..13b5ad44 --- /dev/null +++ b/src/teaching/cse-562/2021sp/slide/2021-03-18/semijoin_naive.svg @@ -0,0 +1,264 @@ + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + R1 + + + + S1 + + + Sendme R1 + + + + + + + R1 + + + Worker 1 + Worker 2 + + diff --git a/src/teaching/cse-562/2021sp/slide/2021-03-18/single_worker.svg b/src/teaching/cse-562/2021sp/slide/2021-03-18/single_worker.svg new file mode 100644 index 00000000..e9a52d7b --- /dev/null +++ b/src/teaching/cse-562/2021sp/slide/2021-03-18/single_worker.svg @@ -0,0 +1,295 @@ + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + Input + + + + + + + queue + + + + + Output + + Worker + + RawData + AnotherWorker + + + + + AnotherWorker + Console + + + + +