39
Apache Flink Fast and Reliable Large-Scale Data Processing Fabian Hueske [email protected] @fhueske 1

ApacheCon: Apache Flink - Fast and Reliable Large-Scale Data Processing

Embed Size (px)

Citation preview

Page 1: ApacheCon: Apache Flink - Fast and Reliable Large-Scale Data Processing

Apache FlinkFast and Reliable Large-Scale Data Processing

Fabian Hueske

[email protected] @fhueske1

Page 2: ApacheCon: Apache Flink - Fast and Reliable Large-Scale Data Processing

About me

Fabian [email protected]

• PMC member of Apache Flink

• With Flink since its beginnings in 2009

– back then an academic research project called Stratosphere

Page 3: ApacheCon: Apache Flink - Fast and Reliable Large-Scale Data Processing

What is Apache Flink?

Distributed Data Flow Processing System

• Focused on large-scale data analytics

• Real-time stream and batch processing

• Easy and powerful APIs (Java / Scala)

• Robust execution backend

3

Page 4: ApacheCon: Apache Flink - Fast and Reliable Large-Scale Data Processing

4

Flink in the Hadoop Ecosystem

Tab

le A

PI

Ge

lly L

ibra

ry

ML

Lib

rary

Ap

ach

e S

AM

OA

Optimizer

DataSet API (Java/Scala) DataStream API (Java/Scala)

Stream Builder

Runtime

Local Cluster Yarn Apache TezEmbedded

Ap

ach

e M

RQ

L

Dat

aflo

w

HDFS

S3JDBCHCatalog

Apache HBase Apache Kafka Apache Flume

RabbitMQ

Hadoop IO

...

Data Sources

ExecutionEnvironments

Flink Core

Libraries

Tab

le A

PI

Page 5: ApacheCon: Apache Flink - Fast and Reliable Large-Scale Data Processing

What is Flink good at?

It‘s a general-purpose data analytics system

• Complex and heavy ETL jobs

• Real-time stream processing with flexible windows

• Analyzing huge graphs

• Machine-learning on large data sets

• ...

5

Page 6: ApacheCon: Apache Flink - Fast and Reliable Large-Scale Data Processing

Flink in the ASF

• Flink entered the ASF about one year ago

– 04/2014: Incubation

– 12/2014: Graduation

• Strongly growing community

– 17 committers

– 15 PMC members

0

20

40

60

80

100

120

Nov-10 Apr-12 Aug-13 Dec-14

#unique git committers (w/o manual de-dup)6

Page 7: ApacheCon: Apache Flink - Fast and Reliable Large-Scale Data Processing

Where is Flink moving?

A "use-case complete" framework to unify batch & stream processing

Data Streams• Kafka• RabbitMQ• ...

“Historic” data• HDFS• JDBC• ...

Analytical Workloads• ETL • Relational processing• Graph analysis• Machine learning• Streaming data analysis

7

Goal: Treat batch as finite stream

Page 8: ApacheCon: Apache Flink - Fast and Reliable Large-Scale Data Processing

HOW TO USE FLINK?

Programming Model & APIs

8

Page 9: ApacheCon: Apache Flink - Fast and Reliable Large-Scale Data Processing

DataSets and Transformations

ExecutionEnvironment env =

ExecutionEnvironment.getExecutionEnvironment();

DataSet<String> input = env.readTextFile(input);

DataSet<String> first = input

.filter (str -> str.contains(“Apache Flink“));

DataSet<String> second = first

.map(str -> str.toLowerCase());

second.print();

env.execute();

Input First Secondfilter map

9

Page 10: ApacheCon: Apache Flink - Fast and Reliable Large-Scale Data Processing

Expressive Transformations

• Element-wise– map, flatMap, filter, project

• Group-wise– groupBy, reduce, reduceGroup, combineGroup, mapPartition, aggregate, distinct

• Binary– join, coGroup, union, cross

• Iterations– iterate, iterateDelta

• Physical re-organization– rebalance, partitionByHash, sortPartition

• Streaming– window, windowMap, coMap, ...

10

Page 11: ApacheCon: Apache Flink - Fast and Reliable Large-Scale Data Processing

Rich Type System

• Use any Java/Scala classes as a data type

– Special support for tuples, POJOs, and case classes

– Not restricted to key-value pairs

• Define (composite) keys directly on data types

– Expression

– Tuple position

– Selector function

11

Page 12: ApacheCon: Apache Flink - Fast and Reliable Large-Scale Data Processing

Counting Words in Batch and Stream

12

case class WordCount (word: String, count: Int)

val lines: DataStream[String] = env.fromSocketStream(...)

lines.flatMap {line => line.split(" ")

.map(word => WordCount(word,1))}

.window(Count.of(1000)).every(Count.of(100))

.groupBy("word").sum("count")

.print()

val lines: DataSet[String] = env.readTextFile(...)

lines.flatMap {line => line.split(" ")

.map(word => WordCount(word,1))}

.groupBy("word").sum("count")

.print()

DataSet API (batch):

DataStream API (streaming):

Page 13: ApacheCon: Apache Flink - Fast and Reliable Large-Scale Data Processing

Table API

• Execute SQL-like expressions on table data

– Tight integration with Java and Scala APIs

– Available for batch and streaming programs

val orders = env.readCsvFile(…)

.as('oId, 'oDate, 'shipPrio)

.filter('shipPrio === 5)

val items = orders

.join(lineitems).where('oId === 'id)

.select('oId, 'oDate, 'shipPrio,

'extdPrice * (Literal(1.0f) - 'discnt) as 'revenue)

val result = items

.groupBy('oId, 'oDate, 'shipPrio)

.select('oId, 'revenue.sum, 'oDate, 'shipPrio)

13

Page 14: ApacheCon: Apache Flink - Fast and Reliable Large-Scale Data Processing

WHAT IS HAPPENING INSIDE?

Processing Engine

14

Page 15: ApacheCon: Apache Flink - Fast and Reliable Large-Scale Data Processing

System Architecture

Coordination

Processing

Optimization

Client (pre-flight) Master

Workers

...

FlinkProgram

...

15

Page 16: ApacheCon: Apache Flink - Fast and Reliable Large-Scale Data Processing

Lots of cool technology inside Flink

• Batch and Streaming in one system

• Memory-safe execution

• Native data flow iterations

• Cost-based data flow optimizer

• Flexible windows on data streams

• Type extraction and custom serialization utilities

• Static code analysis on user functions

• and much more...

16

Page 17: ApacheCon: Apache Flink - Fast and Reliable Large-Scale Data Processing

STREAM AND BATCH IN ONE SYSTEM

Pipelined Data Transfer

17

Page 18: ApacheCon: Apache Flink - Fast and Reliable Large-Scale Data Processing

Stream and Batch in one System

• Most systems do either stream or batch

• In the past, Flink focused on batch processing

– Flink‘s runtime has always done stream processing

– Operators pipeline data forward as soon as it is processed

– Some operators are blocking (such as sort)

• Pipelining gives better performance for manybatch workloads

– Avoids materialization of large intermediate results

18

Page 19: ApacheCon: Apache Flink - Fast and Reliable Large-Scale Data Processing

Pipelined Data Transfer

Large Input

Small Input

SmallInput

Resultjoin

LargeInput

mapInterm.DataSet

BuildHT

Result

Program

Pipelined

Execution

Pipeline 1

Pipeline 2

joinProbeHT

map No intermediate materialization!

19

Page 20: ApacheCon: Apache Flink - Fast and Reliable Large-Scale Data Processing

Flink Data Stream Processing

• Pipelining enables Flink‘s runtime to process streams

– API to define stream programs

– Operators for stream processing

• Stream API and operators are recent contributions

– Evolving very quickly under heavy development

– Integration with batch mode

20

Page 21: ApacheCon: Apache Flink - Fast and Reliable Large-Scale Data Processing

MEMORY SAFE EXECUTION

Memory Management and Out-of-Core Algorithms

21

Page 22: ApacheCon: Apache Flink - Fast and Reliable Large-Scale Data Processing

Memory-safe Execution

• Challenge of JVM-based data processing systems

– OutOfMemoryErrors due to data objects on the heap

• Flink runs complex data flows without memory tuning

– C++-style memory management

– Robust out-of-core algorithms

22

Page 23: ApacheCon: Apache Flink - Fast and Reliable Large-Scale Data Processing

Managed Memory

• Active memory management

– Workers allocate 70% of JVM memory as byte arrays

– Algorithms serialize data objects into byte arrays

– In-memory processing as long as data is small enough

– Otherwise partial destaging to disk

• Benefits

– Safe memory bounds (no OutOfMemoryError)

– Scales to very large JVMs

– Reduced GC pressure

23

Page 24: ApacheCon: Apache Flink - Fast and Reliable Large-Scale Data Processing

Going out-of-core

Single-core join of 1KB Java objects beyond memory (4 GB)

Blue bars are in-memory, orange bars (partially) out-of-core

24

Page 25: ApacheCon: Apache Flink - Fast and Reliable Large-Scale Data Processing

GRAPH ANALYSIS

Native Data Flow Iterations

25

Page 26: ApacheCon: Apache Flink - Fast and Reliable Large-Scale Data Processing

Native Data Flow Iterations

• Many graph and ML algorithms require iterations

• Flink features two types of iterations

– Bulk iterations

– Delta iterations

26

2

15

43

0.1

0.5

0.2

0.4

0.70.3

0.9

Page 27: ApacheCon: Apache Flink - Fast and Reliable Large-Scale Data Processing

Iterative Data Flows

• Flink runs iterations „natively“ as cyclic data flows

– No loop unrolling

– Operators are scheduled once

– Data is fed back through backflow channel

– Loop-invariant data is cached

• Operator state is preserved across iterations!

initialinput

Iterationhead

resultreducejoinIteration

tail

otherdatasets 27

Page 28: ApacheCon: Apache Flink - Fast and Reliable Large-Scale Data Processing

Delta Iterations

• Delta iteration computes

– Delta update of solution set

– Work set for next iteration

• Work set drives computations of next iteration

– Workload of later iterations significantly reduced

– Fast convergence

• Applicable to certain problem domains

– Graph processing

0

5000000

10000000

15000000

20000000

25000000

30000000

35000000

40000000

45000000

1 6 11 16 21 26 31 36 41 46 51 56 61

# o

f el

eme

nts

up

dat

ed

# of iterations

28

Page 29: ApacheCon: Apache Flink - Fast and Reliable Large-Scale Data Processing

Iteration Performance

PageRank on Twitter Follower Graph

30 Iterations

61 Iterations (Convergence)

29

Page 30: ApacheCon: Apache Flink - Fast and Reliable Large-Scale Data Processing

WHAT IS COMING NEXT?

Roadmap

30

Page 31: ApacheCon: Apache Flink - Fast and Reliable Large-Scale Data Processing

Just released a new version

• 0.9.0-milestone1 preview release just got out!

• Features

– Table API

– Flink ML Library

– Gelly Library

– Flink on Tez

– …

31

Page 32: ApacheCon: Apache Flink - Fast and Reliable Large-Scale Data Processing

Flink’s Roadmap

Mission: Unified stream and batch processing

• Exactly-once streaming semantics with

flexible state checkpointing

• Extending the ML library

• Extending graph library

• Integration with Apache Zeppelin (incubating)

• SQL on top of the Table API

• And much more…32

Page 33: ApacheCon: Apache Flink - Fast and Reliable Large-Scale Data Processing

tl;dr – What’s worth to remember?

• Flink is a general-purpose data analytics system

• Unifies streaming and batch processing

• Expressive high-level APIs

• Robust and fast execution engine

33

Page 34: ApacheCon: Apache Flink - Fast and Reliable Large-Scale Data Processing

I Flink, do you? ;-)

If you find Flink exciting,

get involved and start a discussion on Flink‘s ML

or stay tuned by

subscribing to [email protected] or

following @ApacheFlink on Twitter

34

Page 35: ApacheCon: Apache Flink - Fast and Reliable Large-Scale Data Processing

35

Page 36: ApacheCon: Apache Flink - Fast and Reliable Large-Scale Data Processing

BACKUP

36

Page 37: ApacheCon: Apache Flink - Fast and Reliable Large-Scale Data Processing

Data Flow Optimizer

• Database-style optimizations for parallel data flows

• Optimizes all batch programs

• Optimizations– Task chaining

– Join algorithms

– Re-use partitioning and sorting for later operations

– Caching for iterations

37

Page 38: ApacheCon: Apache Flink - Fast and Reliable Large-Scale Data Processing

Data Flow Optimizer

val orders = …

val lineitems = …

val filteredOrders = orders

.filter(o => dataFormat.parse(l.shipDate).after(date))

.filter(o => o.shipPrio > 2)

val lineitemsOfOrders = filteredOrders

.join(lineitems)

.where(“orderId”).equalTo(“orderId”)

.apply((o,l) => new SelectedItem(o.orderDate, l.extdPrice))

val priceSums = lineitemsOfOrders

.groupBy(“orderDate”)

.sum(“l.extdPrice”);

38

Page 39: ApacheCon: Apache Flink - Fast and Reliable Large-Scale Data Processing

Data Flow Optimizer

DataSourceorders.tbl

Filter DataSourcelineitem.tbl

JoinHybrid Hash

buildHT probe

broadcast forward

Combine

Reduce

sort[0,1]

DataSourceorders.tbl

Filter DataSourcelineitem.tbl

JoinHybrid Hash

buildHT probe

hash-part [0] hash-part [0]

hash-part [0,1]

Reduce

sort[0,1]

Best plan depends on

relative sizes of input filespartial sort[0,1]

39