samza at linkedin: taking stream processing to the next level

39
Apache Samza: Taking stream processing to the next level Martin Kleppmann — @martinkl

Upload: martin-kleppmann

Post on 19-Aug-2014

414 views

Category:

Engineering


3 download

DESCRIPTION

Slides from my talk at Berlin Buzzwords, 27 May 2014. Unfortunately Slideshare has screwed up the fonts. See https://speakerdeck.com/ept/samza-at-linkedin-taking-stream-processing-to-the-next-level for a version of the deck with correct fonts. Stream processing is an essential part of real-time data systems, such as news feeds, live search indexes, real-time analytics, metrics and monitoring. But writing stream processes is still hard, especially when you're dealing with so much data that you have to distribute it across multiple machines. How can you keep the system running smoothly, even when machines fail and bugs occur? Apache Samza is a new framework for writing scalable stream processing jobs. Like Hadoop and MapReduce for batch processing, it takes care of the hard parts of running your message-processing code on a distributed infrastructure, so that you can concentrate on writing your application using simple APIs. It is in production use at LinkedIn. This talk will introduce Samza, and show how to use it to solve a range of different problems. Samza has some unique features that make it especially interesting for large deployments, and in this talk we will dig into how they work under the hood. In particular: • Samza is built to support many different jobs written by different teams. Isolation between jobs ensures that a single badly behaved job doesn't affect other jobs. It is robust by design. • Samza can handle jobs that require large amounts of state, for example joining multiple streams, augmenting a stream with data from a database, or aggregating data over long time windows. This makes it a very powerful tool for applications.

TRANSCRIPT

Page 1: Samza at LinkedIn: Taking Stream Processing to the Next Level

Apache Samza: Taking stream processingto the next levelMartin Kleppmann — @martinkl

Page 2: Samza at LinkedIn: Taking Stream Processing to the Next Level

Martin KleppmannHacker, designer, inventor, entrepreneur

Co-founded two startups, Rapportive ⇒ LinkedIn Committer on Avro & Samza ⇒ Apache Writing book on data-intensive apps ⇒ O’Reilly martinkl.com | @martinkl

Page 3: Samza at LinkedIn: Taking Stream Processing to the Next Level

Apache Kafka Apache Samza

Page 4: Samza at LinkedIn: Taking Stream Processing to the Next Level

Apache Kafka Apache Samza

Credit: Jason Walsh on Flickrhttps://www.flickr.com/photos/22882695@N00/2477241427/

Credit: Lucas Richarz on Flickrhttps://www.flickr.com/photos/22057420@N00/5690285549/

Page 5: Samza at LinkedIn: Taking Stream Processing to the Next Level

Things we would like to do(better)

Page 6: Samza at LinkedIn: Taking Stream Processing to the Next Level

Provide timely, relevant updates to your newsfeed

Page 7: Samza at LinkedIn: Taking Stream Processing to the Next Level

Update search results with new information as it appears

Page 8: Samza at LinkedIn: Taking Stream Processing to the Next Level

“Real-time” analysis of logs and metrics

Page 9: Samza at LinkedIn: Taking Stream Processing to the Next Level

Tools?

Response latency

Kafka & Samza

Milliseconds to minutesLoosely coupled

REST

SynchronousClosely coupled

Hours to days

Loosely coupled

Page 10: Samza at LinkedIn: Taking Stream Processing to the Next Level

Service 1

Kafkaevents/messages

Analytics Cache maintenance

Notifications

subscribe subscribe subscribe

publish publish

Service 2

Page 11: Samza at LinkedIn: Taking Stream Processing to the Next Level

Publish / subscribe Event / message = “something happened”– Tracking: User x clicked y at time z– Data change: Key x, old value y, set to new

value z– Logging: Service x threw exception y in request z– Metrics: Machine x had free memory y at time z

Many independent consumers High throughput (millions msgs/sec) Fairly low latency (a few ms)

Page 12: Samza at LinkedIn: Taking Stream Processing to the Next Level

Kafka at LinkedIn 350+ Kafka brokers 8,000+ topics 140,000+ Partitions

278 Billion messages/day 49 TB/day in 176 TB/day out

Peak Load– 4.4 Million messages per second– 6 Gigabits/sec Inbound– 21 Gigabits/sec Outbound

Page 13: Samza at LinkedIn: Taking Stream Processing to the Next Level

public interface StreamTask {void process(

IncomingMessageEnvelope envelope,MessageCollector

collector,TaskCoordinator

coordinator);}

Samza API: processing messages

getKey(), getMsg()

commit(), shutdown()sendMsg(topic, key, value)

Page 14: Samza at LinkedIn: Taking Stream Processing to the Next Level

Familiar ideas from MR/Pig/Cascading/… Filter records matching

condition Map record ⇒ func(record) Join two/more datasets by key Group records with the same

value in field Aggregate records within the same group Pipe job 1’s output ⇒ job 2’s input

MapReduce assumes fixed dataset.Can we adapt this to unbounded streams?

Page 15: Samza at LinkedIn: Taking Stream Processing to the Next Level

Operations on streams Filter records matching

condition ✔ easy Map record ⇒ func(record) ✔

easy Join two/more datasets by key

…within time window, need buffer

Group records with the same value in field

…within time window, need buffer

Aggregaterecords within the same group✔ ok… when do

you emit result? Pipe job 1’s output ⇒ job 2’s input

✔ ok… but what about faults?

Page 16: Samza at LinkedIn: Taking Stream Processing to the Next Level

Stateful stream processing(join, group, aggregate)

Page 17: Samza at LinkedIn: Taking Stream Processing to the Next Level

Joining streams requires state

User goes to lunch ⇒ click long after impression Queue backlog ⇒ click before impression “Window join”

Join and aggregate

Click-through rate

Key-valuestore

Ad impressionsAd clicks

Page 18: Samza at LinkedIn: Taking Stream Processing to the Next Level

Remote state or local state?

Samza job partition 0

Samza job partition 1

e.g. Cassandra, MongoDB, …

100-500k msg/sec/node 100-500k msg/sec/node

1-5k queries/sec??

Page 19: Samza at LinkedIn: Taking Stream Processing to the Next Level

Remote state or local state?

Samza job partition 0

Samza job partition 1

LocalLevelDB/RocksDB

LocalLevelDB/RocksDB

Page 20: Samza at LinkedIn: Taking Stream Processing to the Next Level

Another example: Newsfeed & following User 138 followed user 582 User 463 followed user 536 User 582 posted: “I’m at Berlin Buzzwords and it

rocks” User 507 unfollowed user 115 User 536 posted: “Nice weather today, going for

a walk” User 981 followed user 575

Expected output: “inbox” (newsfeed) for each user

Page 21: Samza at LinkedIn: Taking Stream Processing to the Next Level

Newsfeed & following

Fan out messages to followersDelivered messages

582 => [ 138, 721, …]

Follow/unfollow eventsPosted messages

User 582 posted: “I’m at BerlinBuzzwords and it rocks” User 138 followed user 582

Notify user 138: {User 582 posted:“I’m at Berlin Buzzwords and it rocks”}Push notifications etc.

Page 22: Samza at LinkedIn: Taking Stream Processing to the Next Level

Local state:

Bring computation and datatogether in one place

Page 23: Samza at LinkedIn: Taking Stream Processing to the Next Level

Fault tolerance

Page 24: Samza at LinkedIn: Taking Stream Processing to the Next Level

Kafka Kafka

YARN NodeManager YARN NodeManagerYARN

RM Samza Container

Samza Container

Samza Container

Samza Container

Machine 1 Machine 2

Task Task

Task Task

Task Task

Task Task

BOOM

Page 25: Samza at LinkedIn: Taking Stream Processing to the Next Level

Kafka Kafka

YARN NodeManager YARN NodeManagerYARN

RM Samza Container

Samza Container

Samza Container

Samza Container

Machine 1 Machine 2

Task Task

Task Task

Task Task

Task Task

BOOM

Page 26: Samza at LinkedIn: Taking Stream Processing to the Next Level

YARN NodeManager

Samza Container

Samza Container

Kafka

YARN NodeManager

Samza Container

Samza Container

Machine 2

Task Task

Task Task

Kafka

Machine 3

Task Task

Task Task

Page 27: Samza at LinkedIn: Taking Stream Processing to the Next Level

Fault-tolerant local state

Samza job partition 0

Samza job partition 1

LocalLevelDB/RocksDB

LocalLevelDB/RocksDBDurable

changelog

replicate writes

Page 28: Samza at LinkedIn: Taking Stream Processing to the Next Level

YARN NodeManager

Samza Container

Samza Container

Kafka

YARN NodeManager

Samza Container

Samza Container

Machine 2

Task Task

Task Task

Machine 3

Task Task

Task Task

Kafka

Page 29: Samza at LinkedIn: Taking Stream Processing to the Next Level

Samza’s fault-tolerant local state Embedded key-value: very fast Machine dies ⇒ local key-value store is lost

Solution: replicate all writes to Kafka! Machine dies ⇒ restart on another machine Restore key-value store from changelog Changelog compaction in the background (Kafka

0.8.1)

Page 30: Samza at LinkedIn: Taking Stream Processing to the Next Level

When things go slow…

Page 31: Samza at LinkedIn: Taking Stream Processing to the Next Level

Owned byTeam X

Team Y Team Z

Cascades of jobs

Job 1

Stream BStream A

Job 2 Job 3

Job 4 Job 5

Page 32: Samza at LinkedIn: Taking Stream Processing to the Next Level

Consumer goes slow

Backpressure Queue upDrop data

Other jobs grindto a halt

Run out ofmemory

Spill to disk

Oh wait… Kafka does this anyway!

No thanks

Page 33: Samza at LinkedIn: Taking Stream Processing to the Next Level

Job 1

Stream BStream A

Job 2 Job 3

Job 4 Job 5

Job 1 output

Job 2 output Job 3 output

Page 34: Samza at LinkedIn: Taking Stream Processing to the Next Level

Samza always writesjob output to Kafka

MapReduce always writesjob output to HDFS

Page 35: Samza at LinkedIn: Taking Stream Processing to the Next Level

Every job output is a named stream Open: Anyone can consume it Robust: If a consumer goes slow, nobody else is

affected Durable: Tolerates machine failure Debuggable: Just look at it Scalable: Clean interface between teams Clean: loose coupling between jobs

Page 36: Samza at LinkedIn: Taking Stream Processing to the Next Level

Problem SolutionNeed to buffer job outputfor downstream consumers

Write it to Kafka!

Need to make local statestore fault-tolerant

Write it to Kafka!

Need to checkpoint jobstate for recovery

Write it to Kafka!

Recap

Page 37: Samza at LinkedIn: Taking Stream Processing to the Next Level

Apache Kafka Apache Samza

kafka.apache.org samza.incubator.apache.org

Page 38: Samza at LinkedIn: Taking Stream Processing to the Next Level

Hello Samza (try Samza in 5 mins)

Page 39: Samza at LinkedIn: Taking Stream Processing to the Next Level

Thank you!Samza:• Getting started:

samza.incubator.apache.org• Underlying thinking:bit.ly/jay_on_logs• Start contributing:

bit.ly/samza_newbie_issues

Me:• Twitter: @martinkl• Blog: martinkl.com