Big Data II: Stream Processing and Coordination CS 240: Computing - - PowerPoint PPT Presentation

big data ii stream processing and coordination
SMART_READER_LITE
LIVE PREVIEW

Big Data II: Stream Processing and Coordination CS 240: Computing - - PowerPoint PPT Presentation

Big Data II: Stream Processing and Coordination CS 240: Computing Systems and Concurrency Lecture 22 Marco Canini Credits: Michael Freedman and Kyle Jamieson developed much of the original material. Selected content adapted from A. Haeberlen.


slide-1
SLIDE 1

Big Data II: Stream Processing and Coordination

CS 240: Computing Systems and Concurrency Lecture 22 Marco Canini

Credits: Michael Freedman and Kyle Jamieson developed much of the original material. Selected content adapted from A. Haeberlen.

slide-2
SLIDE 2
  • Single node

– Read data from socket – Process – Write output

2

Simple stream processing

slide-3
SLIDE 3
  • Convert Celsius temperature to Fahrenheit

– Stateless operation: emit (input * 9 / 5) + 32

3

Examples: Stateless conversion

CtoF

slide-4
SLIDE 4
  • Function can filter inputs

– if (input > threshold) { emit input }

4

Examples: Stateless filtering

Filter

slide-5
SLIDE 5
  • Compute EWMA of Fahrenheit temperature

– new_temp = ⍺ * ( CtoF(input) ) + (1- ⍺) * last_temp – last_temp = new_temp – emit new_temp

5

Examples: Stateful conversion

EWMA

slide-6
SLIDE 6
  • E.g., Average value per window

– Window can be # elements (10) or time (1s) – Windows can be disjoint (every 5s) – Windows can be “tumbling” (5s window every 1s)

6

Examples: Aggregation (stateful)

Avg

slide-7
SLIDE 7

7

Stream processing as chain

Avg CtoF

Filter

slide-8
SLIDE 8

8

Stream processing as directed graph

Avg CtoF

Filter

KtoF

sensor type 2 sensor type 1 alerts storage

slide-9
SLIDE 9

Enter “BIG DATA”

9

slide-10
SLIDE 10
  • Large amounts of data to process in real time
  • Examples

– Social network trends (#trending) – Intrusion detection systems (networks, datacenters) – Sensors: Detect earthquakes by correlating vibrations of millions of smartphones – Fraud detection

  • Visa: 2000 txn / sec on average, peak ~47,000 / sec

10

The challenge of stream processing

slide-11
SLIDE 11

Tuple-by-Tuple

input ← read if (input > threshold) { emit input }

Micro-batch

inputs ← read

  • ut = []

for input in inputs { if (input > threshold) {

  • ut.append(input)

} } emit out

11

Scale “up”

slide-12
SLIDE 12

Tuple-by-Tuple

Lower Latency Lower Throughput

Micro-batch

Higher Latency Higher Throughput

12

Scale “up”

Why? Each read/write is an system call into kernel. More cycles performing kernel/application transitions (context switches), less actually spent processing data.

slide-13
SLIDE 13

13

Scale “out”

slide-14
SLIDE 14

14

Stateless operations: trivially parallelized

C F C F C F

slide-15
SLIDE 15
  • Aggregations:

– Need to join results across parallel computations

15

State complicates parallelization

Avg CtoF

Filter

slide-16
SLIDE 16
  • Aggregations:

– Need to join results across parallel computations

16

State complicates parallelization

Avg

CtoF CtoF CtoF Sum Cnt Sum Cnt Sum Cnt

Filter Filter Filter

slide-17
SLIDE 17
  • Aggregations:

– Need to join results across parallel computations

17

Parallelization complicates fault-tolerance Avg

CtoF CtoF CtoF Sum Cnt Sum Cnt Sum Cnt

Filter Filter Filter

  • blocks -
slide-18
SLIDE 18

18

Parallelization complicates fault-tolerance Avg

CtoF CtoF CtoF Sum Cnt Sum Cnt Sum Cnt

Filter Filter Filter

  • blocks -

Can we ensure exactly-once semantics?

slide-19
SLIDE 19
  • Compute trending keywords

– E.g.,

19

Can parallelize joins

Sum / key

Sum / key Sum / key Sum / key

Sort top-k

  • blocks -

portion tweets portion tweets portion tweets

slide-20
SLIDE 20

20

Can parallelize joins

Sum / key Sum / key

top-k

Sum / key

portion tweets portion tweets portion tweets

Sum / key Sum / key Sum / key

top-k top-k Sort Sort Sort

Hash partitioned tweets

  • 1. merge
  • 2. sort
  • 3. top-k
slide-21
SLIDE 21

21

Parallelization complicates fault-tolerance

Sum / key Sum / key

top-k

Sum / key

portion tweets portion tweets portion tweets

Sum / key Sum / key Sum / key

top-k top-k Sort Sort Sort

Hash partitioned tweets

  • 1. merge
  • 2. sort
  • 3. top-k
slide-22
SLIDE 22

A Tale of Four Frameworks

  • 1. Record acknowledgement (Storm)
  • 2. Micro-batches (Spark Streaming, Storm Trident)
  • 3. Transactional updates (Google Cloud dataflow)
  • 4. Distributed snapshots (Flink)

22

slide-23
SLIDE 23
  • Architectural components

– Data: streams of tuples, e.g., Tweet = <Author, Msg, Time> – Sources of data: “spouts” – Operators to process data: “bolts” – Topology: Directed graph of spouts & bolts

23

Apache Storm

slide-24
SLIDE 24
  • Multiple processes (tasks) run per bolt
  • Incoming streams split among tasks

– Shuffle Grouping: Round-robin distribute tuples to tasks – Fields Grouping: Partitioned by key / field – All Grouping: All tasks receive all tuples (e.g., for joins)

24

Apache Storm: Parallelization

slide-25
SLIDE 25
  • Goal: Ensure each input “fully processed”
  • Approach: DAG / tree edge tracking

– Record edges that get created as tuple is processed – Wait for all edges to be marked done – Inform source (spout) of data when complete; otherwise, they resend tuple

  • Challenge: “at least once” means:

– Bolts can receive tuple > once – Replay can be out-of-order – ... application needs to handle

25

Fault tolerance via record acknowledgement

(Apache Storm – at least once semantics)

slide-26
SLIDE 26
  • Spout assigns new unique ID to each tuple
  • When bolt “emits” dependent tuple, it

informs system of dependency (new edge)

  • When a bolt finishes processing tuple, it

calls ACK (or can FAIL)

  • Acker tasks:

– Keep track of all emitted edges and receive ACK/FAIL messages from bolts. – When messages received about all edges in graph, inform originating spout

  • Spout garbage collects tuple or retransmits
  • Note: Best effort delivery by not generating

dependency on downstream tuples

26

Fault tolerance via record acknowledgement

(Apache Storm – at least once semantics)

slide-27
SLIDE 27
  • Split stream into series of small, atomic

batch jobs (each of X seconds)

  • Process each individual batch using

Spark “batch” framework

– Akin to in-memory MapReduce

  • Emit each micro-batch result

– RDD = “Resilient Distributed Data”

27

Apache Spark Streaming:

Discretized Stream Processing

Spark Spark Streaming batches of X seconds live data stream processed results

slide-28
SLIDE 28

28

Apache Spark Streaming:

Dataflow-oriented programming

# Create a local StreamingContext with batch interval of 1 second ssc = StreamingContext(sc, 1) # Create a DStream that reads from network socket lines = ssc.socketTextStream("localhost", 9999) words = lines.flatMap(lambda line: line.split(" ")) # Split each line into words # Count each word in each batch pairs = words.map(lambda word: (word, 1)) wordCounts = pairs.reduceByKey(lambda x, y: x + y) wordCounts.pprint() ssc.start() # Start the computation ssc.awaitTermination() # Wait for the computation to terminate

slide-29
SLIDE 29

29

Apache Spark Streaming:

Dataflow-oriented programming

# Create a local StreamingContext with batch interval of 1 second ssc = StreamingContext(sc, 1) # Create a DStream that reads from network socket lines = ssc.socketTextStream("localhost", 9999) words = lines.flatMap(lambda line: line.split(" ")) # Split each line into words # Count each word in each batch pairs = words.map(lambda word: (word, 1)) wordCounts = pairs.reduceByKeyAndWindow( lambda x, y: x + y, lambda x, y: x - y, 3, 2) wordCounts.pprint() ssc.start() # Start the computation ssc.awaitTermination() # Wait for the computation to terminate

slide-30
SLIDE 30
  • Can build on batch frameworks (Spark) and tuple-by-tuple (Storm)

– Tradeoff between throughput (higher) and latency (higher)

  • Each micro-batch may succeed or fail

– Original inputs are replicated (memory, disk)

– At failure, latest micro-batch can be simply recomputed (trickier if stateful)

  • DAG is a pipeline of transformations from micro-batch to micro-batch

– Lineage info in each RDD specifies how generated from other RDDs

  • To support failure recovery:

– Occasionally checkpoints RDDs (state) by replicating to other nodes – To recover: another worker (1) gets last checkpoint, (2) determines upstream dependencies, then (3) starts recomputing using those usptream dependencies starting at checkpoint (downstream might filter)

30

Fault tolerance via micro batches

(Apache Spark Streaming, Storm Trident)

slide-31
SLIDE 31
  • Computation is long-running DAG of continuous operators
  • For each intermediate record at operator

– Create commit record including input record, state update, and derived downstream records generated – Write commit record to transactional log / DB

  • On failure, replay log to

– Restore a consistent state of the computation – Replay lost records (further downstream might filter)

  • Requires: High-throughput writes to distributed store

31

Fault Tolerance via transactional updates

(Google Cloud Dataflow)

slide-32
SLIDE 32
  • Rather than log each record for each operator,

take system-wide snapshots

  • Snapshotting:

– Determine consistent snapshot of system-wide state (includes in-flight records and operator state) – Store state in durable storage

  • Recover:

– Restoring latest snapshot from durable storage – Rewinding the stream source to snapshot point, and replay inputs

  • Algorithm is based on Chandy-Lamport distributed snapshots,

but also captures stream topology

32

Fault Tolerance via distributed snapshots

(Apache Flink)

slide-33
SLIDE 33
  • Use markers (barriers) in the input data stream to tell

downstream operators when to consistently snapshot

Fault Tolerance via distributed snapshots

(Apache Flink)

33

slide-34
SLIDE 34

Coordination

Practical consensus

34

slide-35
SLIDE 35
  • Lots of apps need various coordination primitives

– Leader election – Group membership – Locks – Leases

  • Common requirement is consensus but we’d like to

avoid duplication

– Duplicating is bad and duplicating poorly even worse – Maintenance?

35

Needs of distributed apps

slide-36
SLIDE 36
  • One approach

– For each coordination primitive build a specific service

  • Some recent examples

– Chubby, Google [Burrows et al, USENIX OSDI, 2006]

  • Lock service

– Centrifuge, Microsoft [Adya et al, USENIX NSDI, 2010]

  • Lease service

36

How do we go about coordination?

slide-37
SLIDE 37
  • Alternative approach

– A coordination service – Develop a set of lower level primitives (i.e., an API) that can be used to implement higher-level coordination services – Use the coordination service API across many applications

  • Example: Apache Zookeeper

37

How do we go about coordination?

slide-38
SLIDE 38
  • A “Coordination Kernel”

– Provides a file system abstraction and API that enables realizing several coordination primitives

  • Group membership
  • Leader election
  • Locks
  • Queueing
  • Barriers
  • Status monitoring

38

ZooKeeper

slide-39
SLIDE 39
  • In brief, it’s a file system with a simplified API
  • Only whole file reads and writes

– No appends, inserts, partial reads

  • Files are znodes; organized in hierarchical

namespace

  • Payload not designed for application data storage

but for application metadata storage

  • Znodes also have associated version counters

and some metadata (e.g., flags)

39

Data model

slide-40
SLIDE 40
  • CAP perspective: Zookeeper is CP

– It guarantees consistency – May sacrifice availability under system partitions

  • strict quorum based replication for writes
  • Consistency (safety)

– FIFO client order: all client requests are executed in

  • rder sent by client
  • Matters for asynchronous calls

– Linearizable writes: all writes are linearizable – Serializable reads: reads can be served locally by any server, which may have a stale value

40

Semantics

slide-41
SLIDE 41
  • Regular znodes

– May have children – Explicitly deleted by clients

  • Ephemeral znodes

– May not have children – Disappear when deleted or when creator terminates

  • Session termination can be deliberate or due to failure
  • Sequential flag

– Property of regular znodes – Children have strictly increasing integer appended to their names

41

Types of znodes

slide-42
SLIDE 42
  • create(znode, data, flags)

– Flags denote the type of the znode:

  • REGULAR, EPHEMERAL, SEQUENTIAL

– znode must be addressed by giving a full path in all

  • perations (e.g., ‘/app1/foo/bar’)

– returns znode path

  • delete(znode, version)

– Deletes the znode if the version is equal to the actual version of the znode – set version = -1 to omit the conditional check (applies to other operations as well)

42

Client API

slide-43
SLIDE 43
  • exists(znode, watch)

– Returns true if the znode exists, false otherwise – watch flag enables a client to set a watch on the znode – watch is a subscription to receive an information from the Zookeeper when this znode is changed – NB: a watch may be set even if a znode does not exist

  • The client will be then informed when a znode is created
  • getData(znode, watch)

– Returns data stored at this znode – watch is not set unless znode exists

43

Client API (cont’d)

slide-44
SLIDE 44
  • setData(znode, data, version)

– Rewrites znode with data, if version is the current version number of the znode – version = -1 applies here as well to omit the condition check and to force setData

  • getChildren(znode, watch)

– Returns the set of children znodes of the znode

  • sync()

– Waits for all updates pending at the start of the

  • peration to be propagated to the Zookeeper server

that the client is connected to

44

Client API (cont’d)

slide-45
SLIDE 45

Some examples

45

slide-46
SLIDE 46
  • Propose(v)

create(“/c/proposal-”, “v”, SEQUENTIAL)

  • Decide()

C = getChildren(“/c”) Select znode z in C with smallest sequence number v’ = getData(z) Decide v’

46

Implementing consensus

slide-47
SLIDE 47
  • Clients initialized with the name of znode

– E.g., “/config”

config = getData(“/config”, TRUE) while (true) wait for watch notification on “/config” config = getData(“/config”, TRUE)

Note: A client may miss some configuration, but it will always “refresh” when it realizes the configuration is stale

47

Simple configuration management

slide-48
SLIDE 48
  • Idea: leverage ephemeral znodes
  • Fix a znode “/group”
  • Assume every process (client) is initialized with its
  • wn unique name and ID

– What to do if there are no unique names?

joinGroup()

create(“/group/” + name, [address,port], EPHEMERAL)

getMembers()

getChildren(“/group”, false)

48

Group membership

Set to true to get notified about membership changes

slide-49
SLIDE 49

Lock(filename)

1:

create(filename, “”, EPHEMERAL) 2: if create is successful 3: return //have lock 4: else 5: getData(filename,TRUE) 6: wait for filename watch 7: goto 1:

Release(filename)

delete(filename)

49

A simple lock

slide-50
SLIDE 50
  • Herd effect

– If many clients wait for the lock they will all try to get it as soon as it is released

  • Only implements exclusive locking

50

Problems?

slide-51
SLIDE 51

Lock(filename)

1: myLock = create(filename + “/lock-”, “”, EPHEMERAL & SEQUENTIAL) 2: C = getChildren(filename, false) 3: if myLock is the lowest znode in C then return 4: else 5: precLock = znode in C ordered just before myLock 6: if exists(precLock, true) 7: wait for precLock watch 8: goto 2:

Release(filename)

delete(myLock)

51

Simple Lock without Herd Effect

slide-52
SLIDE 52
  • The previous lock solves herd effect but makes

reads block other reads

  • How to do it such that reads always get the lock

unless there is a concurrent write?

52

Read/Write Locks

slide-53
SLIDE 53

Write Lock(filename)

1: myLock = create(filename + “/write-”, “”, EPHEMERAL & SEQUENTIAL) [...] // same as simple lock w/o herd effect

Read Lock(filename)

1: myLock = create(filename + “/read-”, “”, EPHEMERAL & SEQUENTIAL) 2: C = getChildren(filename, false) 3: if no write znodes lower than myLock in C then return 4: else 5: precLock = write znode in C ordered just before myLock 6: if exists(precLock, true) 7: wait for precLock watch 8: goto 3:

Release(filename)

delete(myLock)

53

Read/Write Locks

slide-54
SLIDE 54

A brief look inside

54

slide-55
SLIDE 55

55

Zookeeper components

Write requests

Request

processor

In-memory

Replicated

DB

DB

Commit log Read requests ZAB Atomic broadcast Tx Tx Tx

slide-56
SLIDE 56
  • Fully replicated

– To be contrasted with partitioning/placement in storage systems

  • Each server has a copy of in-memory DB

– Store the entire znode tree – Default max 1 MB per znode (configurable)

  • Crash-recovery model

– Commit log – + periodic snapshots of the database

56

Zookeeper DB

slide-57
SLIDE 57
  • Used to totally order write requests

– Relies on a quorum of servers (f+1 out of 2f+1)

  • ZAB internally elects leader replica
  • Zookeeper adopts this notion of a leader

– Other servers are followers

  • All writes are sent by followers to the leader

– Leader sequences the requests and invokes ZAB atomic broadcast

57

ZAB: a very brief overview

slide-58
SLIDE 58
  • Upon receiving a write request

– Leader calculates in what state system will be after the write is applied – Transforms the operation in a transactional update

  • Transactional updates are then processed by ZAB,

DB

– Guarantees idempotency of updates to the DB

  • riginating from the same operation
  • Idempotency important as ZAB may redeliver a

message

58

Request processor

slide-59
SLIDE 59

That’s all Hope you enjoyed CS 240 Review session: Dec 6, in class Final exam: Dec 10, 9AM-12PM, Bldg 9: Lecture Hall 1

59