SlideShare ist ein Scribd-Unternehmen logo
1 von 49
Powering Cloud IT
Dynamically Configured
Stream Processing
Using Flink & Kafka
David Hardwick
Sean Hester
David Brelloch
https://github.com/brelloch/FlinkForward2017
BETTERCLOUD2017
Multi-SaaS Management
“What does that mean?”
BETTERCLOUD2017
A Few Years Ago
Complex Interconnect of Apps, People and Data
This is Now
Mission Control for IT Admins
CENTRALIZATIONINTELLIGENCE ORCHESTRATION
USERS DATA RESOURCES
“Multi-SaaS Management” is like
Alert
Detections
Policy
Violations
Normalization
Automated
Workflows
Single
or Bulk
Actions
PUBLIC APIs
Data
Ingestion
USERS
Internal Users
External Users
Memberships
DATA
Files
Connected
Apps
RESOURCES
Calendars
Devices
Conference Rooms
Role-BasedPrivileges
BetterCloud Platform
Multi-SaaS Management
We process 100s millions of messages daily
CONNECTORS INTELLIGENCE ORCHESTRATIONCENTRALIZE
Alert
Detections
Policy
Violations
Normalization
Automated
Workflows
Single
or Bulk
Actions
PUBLIC APIs
Data
Ingestion
USERS
Internal Users
External Users
Memberships
DATA
Files
Connected
Apps
RESOURCES
Calendars
Devices
Conference Rooms
Role-BasedPrivileges
BetterCloud Platform
Multi-SaaS Management
BetterCloud Platform
CONNECTORS INTELLIGENCE ORCHESTRATIONCENTRALIZE
Alert
Detections
Policy
Violations
Normalization
Automated
Workflows
Single
or Bulk
Actions
PUBLIC APIs
Data
Ingestion
USERS
Internal Users
External Users
Memberships
DATA
Files
Connected
Apps
RESOURCES
Calendars
Devices
Conference Rooms
Role-BasedPrivileges
BetterCloud Platform
Multi-SaaS Management
BetterCloud Platform
CONNECTORS INTELLIGENCE ORCHESTRATIONCENTRALIZE
data centralization
Data Centralization (GRID)
data centralization
Alert
Detections
Policy
Violations
Normalization
Automated
Workflows
Single
or Bulk
Actions
PUBLIC APIs
Data
Ingestion
USERS
Internal Users
External Users
Memberships
DATA
Files
Connected
Apps
RESOURCES
Calendars
Devices
Conference Rooms
Role-BasedPrivileges
BetterCloud Platform
Multi-SaaS Management
BetterCloud Platform
CONNECTORS INTELLIGENCE ORCHESTRATIONCENTRALIZE
Alert
Detections
Policy
Violations
Normalization
Automated
Workflows
Single
or Bulk
Actions
PUBLIC APIs
Data
Ingestion
USERS
Internal Users
External Users
Memberships
DATA
Files
Connected
Apps
RESOURCES
Calendars
Devices
Conference Rooms
Role-BasedPrivileges
BetterCloud Platform
Multi-SaaS Management
BetterCloud Platform
CONNECTORS INTELLIGENCE ORCHESTRATIONCENTRALIZE
operational intelligence
Alert
Detections
Policy
Violations
Normalization
Automated
Workflows
Single
or Bulk
Actions
PUBLIC APIs
Data
Ingestion
USERS
Internal Users
External Users
Memberships
DATA
Files
Connected
Apps
RESOURCES
Calendars
Devices
Conference Rooms
Role-BasedPrivileges
BetterCloud Platform
Multi-SaaS Management
BetterCloud Platform
CONNECTORS INTELLIGENCE ORCHESTRATIONCENTRALIZE
Alert
Detections
Policy
Violations
Normalization
Automated
Workflows
Single
or Bulk
Actions
PUBLIC APIs
Data
Ingestion
USERS
Internal Users
External Users
Memberships
DATA
Files
Connected
Apps
RESOURCES
Calendars
Devices
Conference Rooms
Role-BasedPrivileges
BetterCloud Platform
Multi-SaaS Management
BetterCloud Platform
CONNECTORS INTELLIGENCE ORCHESTRATIONCENTRALIZE
action orchestration
action orchestration
Flink detects and evaluates
CONNECTORS OBJECTS INTELLIGENCE
Alert
Detections
Policy
Violations
ORCHESTRATION
Normalization
Automated
Workflows
Single
or Bulk
Actions
PUBLIC APIs
Data
Ingestion
CENTRALIZE
USERS
Internal Users
External Users
Memberships
DATA
Files
Connected
Apps
RESOURCES
Calendars
Devices
Conference Rooms
Role-BasedPrivileges
BetterCloud Platform
Heavy use of Flink here
© 2016 BetterCloud, Inc. All Rights Reserved
Business Needs and Challenges
● Alert quickly < 2s latency from ingest to alert
● Scale tremendously ~100M events/day ...and growing
● Keep innovating daily deployments to production
● Show the power detect global alerts across all customers
● Let customers drive custom alerts for every customer
● Replay history “go back in time” for new alerts ...or alert bugs
BETTERCLOUD2017
“Okay, can you go deeper?”
Nope, but Sean and David can!
© 2016 BetterCloud, Inc. All Rights Reserved
Foundational Prior Learnings
1. Event Stream Processing is a better model for Operational
Intelligence than Ingest + Query
© 2016 BetterCloud, Inc. All Rights Reserved
Foundational Prior Learnings
1. Event Stream Processing is a better model for Operational
Intelligence than Ingest + Query
2. Rules Engines add significantly more value than hard-
coded rules
Alert
Detections
Policy
Violations
Normalization
Automated
Workflows
Single
or Bulk
Actions
PUBLIC APIs
Data
Ingestion
USERS
Internal Users
External Users
Memberships
DATA
Files
Connected
Apps
RESOURCES
Calendars
Devices
Conference Rooms
Role-BasedPrivileges
BetterCloud Platform
Multi-SaaS Management
We process 100s of millions of messages daily
CONNECTORS INTELLIGENCE ORCHESTRATIONCENTRALIZE
© 2016 BetterCloud, Inc. All Rights Reserved
Foundational Prior Learnings
1. Event Stream Processing is a better model for Operational
Intelligence than Ingest + Query
2. Rules Engines add significantly more value than hard-
coded rules
© 2016 BetterCloud, Inc. All Rights Reserved
JsonPath
● Jayway JsonPath: https://github.com/jayway/JsonPath
● Executes queries again JSON documents
● For us, simplifies the creation of a rules interface for our
non-technical users
© 2016 BetterCloud, Inc. All Rights Reserved
JsonPath Continued
Example Paths and Output:
$.expensive => 10
$.store.bicycle.price => 19.95
$.store.book[0].author => "Nigel Rees"
$.store.book.length > 0 => true
$.store.book[?(@.category ==
‘fiction’)].price > 10.00 => { 
 }
© 2016 BetterCloud, Inc. All Rights Reserved
JsonPath Wrapped in a User Interface
© 2016 BetterCloud, Inc. All Rights Reserved
The Control Stream
© 2016 BetterCloud, Inc. All Rights Reserved
The Solution
© 2016 BetterCloud, Inc. All Rights Reserved
Models
case class CustomerEvent(customerId: UUID, payload: String)
case class ControlEvent(customerId: UUID, alertId: UUID, alertName: String, alertDescription:
String, threshold: Int, jsonPath: String, bootstrapCustomerId: UUID)
© 2016 BetterCloud, Inc. All Rights Reserved
Sources - Event Stream
val eventStream = env.addSource(new FlinkKafkaConsumer09("events", new CustomerEventSchema(),
properties))
.filter(x => x.isDefined)
.map(x => x.get)
.keyBy((ce: CustomerEvent) => { ce.customerId } )
© 2016 BetterCloud, Inc. All Rights Reserved
Sources - Control Stream
val controlStream = env.addSource(new FlinkKafkaConsumer09("controls", new ControlEventSchema(),
properties))
.filter(x => x.isDefined)
.map(x => x.get)
.name("Control Source")
.split((ce: ControlEvent) => {
ce.customerId match {
case Constants.GLOBAL_CUSTOMER_ID => List("global")
case _ => List("specific")
}
})
© 2016 BetterCloud, Inc. All Rights Reserved
Sources - Control Stream Continued
val globalControlStream = controlStream.select("global").broadcast
val specificControlStream = controlStream.select("specific")
.keyBy((ce: ControlEvent) => { ce.customerId })
© 2016 BetterCloud, Inc. All Rights Reserved
Sources - Join the Streams
// Join the control and event streams
val filterStream = globalControlStream.union(specificControlStream)
.connect(
eventStream
)
© 2016 BetterCloud, Inc. All Rights Reserved
Work on Streams - Filtering
class FilterFunction() extends RichCoFlatMapFunction[ControlEvent, CustomerEvent, FilteredEvent] {
var configs = new mutable.ListBuffer[ControlEvent]()
override def flatMap1(value: ControlEvent, out: Collector[FilteredEvent]): Unit = {
configs = configs.filter(x => (x.customerId != value.customerId) && (x.alertId != value.alertId))
configs.append(value)
}
override def flatMap2(value: CustomerEvent, out: Collector[FilteredEvent]): Unit = {
val eventConfigs = configs.filter(x => (x.customerId == x.customerId) || (x.customerId ==
Constants.GLOBAL_CUSTOMER_ID))
if (eventConfigs.size > 0) {
out.collect(FilteredEvent(value, eventConfigs.toList))
}
}
}
© 2016 BetterCloud, Inc. All Rights Reserved
Work on Streams - Qualifying
class QualifierFunction extends FlatMapFunction[FilteredEvent, QualifiedEvent] {
override def flatMap(value: FilteredEvent, out: Collector[QualifiedEvent]): Unit = {
Try(JsonPath.parse(value.event.payload)).map(ctx => {
value.controls.foreach(control => {
Try {
val result: String = ctx.read(control.jsonPath)
if (!result.isEmpty) {
out.collect(QualifiedEvent(value.event, control))
}
}
})
})
}
}
© 2016 BetterCloud, Inc. All Rights Reserved
Work on Streams - Counting
class CounterFunction extends FlatMapFunction[QualifiedEvent, ControlEvent] {
var counts = scala.collection.mutable.HashMap[String, Int]()
override def flatMap(value: QualifiedEvent, out: Collector[ControlEvent]): Unit = {
val key = s"${value.event.customerId}${value.control.alertId}"
if (counts.contains(key)) {
counts.put(key, counts.get(key).get + 1)
println(s"Count for ${key}: ${counts.get(key).get}")
} else {
counts.put(key, 1)
println(s"Count for ${key}: ${counts.get(key).get}")
}
}
}
© 2016 BetterCloud, Inc. All Rights Reserved
Wiring It Up
val filterFunction = new FilterFunction
val qualifierFunction = new QualifierFunction
val counterFunction = new CounterFunction
// Join the control and event streams
val filterStream = globalControlStream.union(specificControlStream)
.connect(
eventStream
)
.flatMap(filterFunction).name("Filtering Function")
.flatMap(qualifierFunction).name("Qualifier Function")
.flatMap(counterFunction).name("Counter Function")
© 2016 BetterCloud, Inc. All Rights Reserved
What about historical data?
● The current solution works great against the live stream of data, but

how do you get to the current number when the events we need have already gone
through the system?
© 2016 BetterCloud, Inc. All Rights Reserved
Basic Implementation
© 2016 BetterCloud, Inc. All Rights Reserved
Counter Function Updated
override def flatMap(value: QualifiedEvent, out: Collector[ControlEvent]): Unit = {
val key = s"${value.event.customerId}${value.control.alertId}"
if (counts.contains(key)) {
counts.put(key, counts.get(key).get + 1)
println(s"Count for ${key}: ${counts.get(key).get}")
} else {
val c = value.control
counts.put(key, 1)
out.collect(ControlEvent(c.customerId, c.alertId, c.alertName, c.alertDescription,
c.threshold, c.jsonPath, value.event.customerId))
println(s"Bootstrap count for ${key}: ${counts.get(key).get}")
}
}
© 2016 BetterCloud, Inc. All Rights Reserved
Bootstrap Function (“Go back in time”)
class BootstrapFunction extends FlatMapFunction[ControlEvent, FilteredEvent] {
override def flatMap(value: ControlEvent, out: Collector[FilteredEvent]): Unit = {
val stream = getClass.getResourceAsStream("/events.txt")
Source.fromInputStream(stream)
.getLines
.toList
.map(x => CustomerEvent(x))
.filter(x => x.customerId == value.bootstrapCustomerId)
.foreach(x => {
out.collect(FilteredEvent(x, List(value)))
})
}
}
© 2016 BetterCloud, Inc. All Rights Reserved
Wire up bootstrap (“Go back in time”)
val bootstrapStream = env.addSource(new FlinkKafkaConsumer09("bootstrap", new
ControlEventSchema(), properties))
.filter(x => x.isDefined).map(x => x.get).flatMap(bootstrapFunction).name("Bootstrap Function")
.keyBy((fe: FilteredEvent) => { fe.event.customerId } )
val bootstrapSink = new FlinkKafkaProducer09("bootstrap", new ControlEventSchema(), properties)
val filterStream = globalControlStream.union(specificControlStream)
.connect(eventStream)
.flatMap(filterFunction).name("Filtering Function")
.union(bootstrapStream)
.flatMap(qualifierFunction).name("Qualifier Function")
.flatMap(counterFunction).name("Counter Function")
.addSink(bootstrapSink)
© 2016 BetterCloud, Inc. All Rights Reserved
Bootstrap Function Notes (“Go back in
time”)
● Extremely simplified compared to what you would want in production
○ A real system requires both ingestion of all events and some kind of query
system (API, database, kafka, etc
)
○ Be careful with how you implement the query system. It is easy to block the
whole stream with an API or database (Async I/O!!!!).
● There should be some kind of tracking on the event which triggered to bootstrap
○ You will need to get all events up until that event from the storage system
● If ordering does not matter:
○ Can just replay all previous events as in the example code
© 2016 BetterCloud, Inc. All Rights Reserved
Bootstrap Function Notes (“Go back in
time”)
● If ordering does matter:
○ You will need to collect and block all incoming events for that specific key until
the replay of old events completes
© 2016 BetterCloud, Inc. All Rights Reserved
Our Solution For Historical Data - Long Term Storage
TO THE DEMO!
© 2016 BetterCloud, Inc. All Rights Reserved
Further Areas for Improvement
● Most expensive operations for us are JsonPath operations. It may be worth moving
towards broadcasting all alerts instead of just global and move the keyed stream to
as late as possible (we are switching to this)
● State is not being saved. At a minimum the controls and counts should be saved in
state
● The current models only support incrementing
● JsonPath supports different types so you can have more operators than equals (>, <,
etc...)
● Only a single property path is supported
© 2016 BetterCloud, Inc. All Rights Reserved
We are hiring (go figure, right?)!!!
Seriously, we are always hiring. If you are interested talk to David Hardwick or visit
https://www.bettercloud.com/careers/
Questions?
https://github.com/brelloch/FlinkForward2017

Weitere Àhnliche Inhalte

Was ist angesagt?

Apache Beam: A unified model for batch and stream processing data
Apache Beam: A unified model for batch and stream processing dataApache Beam: A unified model for batch and stream processing data
Apache Beam: A unified model for batch and stream processing dataDataWorks Summit/Hadoop Summit
 
Flink Forward SF 2017: Bill Liu & Haohui Mai - AthenaX : Uber’s streaming pro...
Flink Forward SF 2017: Bill Liu & Haohui Mai - AthenaX : Uber’s streaming pro...Flink Forward SF 2017: Bill Liu & Haohui Mai - AthenaX : Uber’s streaming pro...
Flink Forward SF 2017: Bill Liu & Haohui Mai - AthenaX : Uber’s streaming pro...Flink Forward
 
Flink Forward SF 2017: Srikanth Satya & Tom Kaitchuck - Pravega: Storage Rei...
Flink Forward SF 2017: Srikanth Satya & Tom Kaitchuck -  Pravega: Storage Rei...Flink Forward SF 2017: Srikanth Satya & Tom Kaitchuck -  Pravega: Storage Rei...
Flink Forward SF 2017: Srikanth Satya & Tom Kaitchuck - Pravega: Storage Rei...Flink Forward
 
Flink forward SF 2017: Elizabeth K. Joseph and Ravi Yadav - Flink meet DC/OS ...
Flink forward SF 2017: Elizabeth K. Joseph and Ravi Yadav - Flink meet DC/OS ...Flink forward SF 2017: Elizabeth K. Joseph and Ravi Yadav - Flink meet DC/OS ...
Flink forward SF 2017: Elizabeth K. Joseph and Ravi Yadav - Flink meet DC/OS ...Flink Forward
 
Apache Beam (incubating)
Apache Beam (incubating)Apache Beam (incubating)
Apache Beam (incubating)Apache Apex
 
Expanding Apache Spark Use Cases in 2.2 and Beyond with Matei Zaharia and dem...
Expanding Apache Spark Use Cases in 2.2 and Beyond with Matei Zaharia and dem...Expanding Apache Spark Use Cases in 2.2 and Beyond with Matei Zaharia and dem...
Expanding Apache Spark Use Cases in 2.2 and Beyond with Matei Zaharia and dem...Databricks
 
Greg Hogan – To Petascale and Beyond- Apache Flink in the Clouds
Greg Hogan – To Petascale and Beyond- Apache Flink in the CloudsGreg Hogan – To Petascale and Beyond- Apache Flink in the Clouds
Greg Hogan – To Petascale and Beyond- Apache Flink in the CloudsFlink Forward
 
Towards sql for streams
Towards sql for streamsTowards sql for streams
Towards sql for streamsRadu Tudoran
 
Advanced Streaming Analytics with Apache Flink and Apache Kafka, Stephan Ewen
Advanced Streaming Analytics with Apache Flink and Apache Kafka, Stephan EwenAdvanced Streaming Analytics with Apache Flink and Apache Kafka, Stephan Ewen
Advanced Streaming Analytics with Apache Flink and Apache Kafka, Stephan Ewenconfluent
 
Arbitrary Stateful Aggregations using Structured Streaming in Apache Spark
Arbitrary Stateful Aggregations using Structured Streaming in Apache SparkArbitrary Stateful Aggregations using Structured Streaming in Apache Spark
Arbitrary Stateful Aggregations using Structured Streaming in Apache SparkDatabricks
 
Flink Forward Berlin 2017: Stephan Ewen - The State of Flink and how to adopt...
Flink Forward Berlin 2017: Stephan Ewen - The State of Flink and how to adopt...Flink Forward Berlin 2017: Stephan Ewen - The State of Flink and how to adopt...
Flink Forward Berlin 2017: Stephan Ewen - The State of Flink and how to adopt...Flink Forward
 
Streaming SQL (at FlinkForward, Berlin, 2016/09/12)
Streaming SQL (at FlinkForward, Berlin, 2016/09/12)Streaming SQL (at FlinkForward, Berlin, 2016/09/12)
Streaming SQL (at FlinkForward, Berlin, 2016/09/12)Julian Hyde
 
Streaming SQL
Streaming SQLStreaming SQL
Streaming SQLJulian Hyde
 
Introduction to Apache Beam & No Shard Left Behind: APIs for Massive Parallel...
Introduction to Apache Beam & No Shard Left Behind: APIs for Massive Parallel...Introduction to Apache Beam & No Shard Left Behind: APIs for Massive Parallel...
Introduction to Apache Beam & No Shard Left Behind: APIs for Massive Parallel...Dan Halperin
 
Stateful Distributed Stream Processing
Stateful Distributed Stream ProcessingStateful Distributed Stream Processing
Stateful Distributed Stream ProcessingGyula FĂłra
 
Unified Stream & Batch Processing with Apache Flink (Hadoop Summit Dublin 2016)
Unified Stream & Batch Processing with Apache Flink (Hadoop Summit Dublin 2016)Unified Stream & Batch Processing with Apache Flink (Hadoop Summit Dublin 2016)
Unified Stream & Batch Processing with Apache Flink (Hadoop Summit Dublin 2016)ucelebi
 
Kenneth Knowles - Apache Beam - A Unified Model for Batch and Streaming Data...
Kenneth Knowles -  Apache Beam - A Unified Model for Batch and Streaming Data...Kenneth Knowles -  Apache Beam - A Unified Model for Batch and Streaming Data...
Kenneth Knowles - Apache Beam - A Unified Model for Batch and Streaming Data...Flink Forward
 
Gelly-Stream: Single-Pass Graph Streaming Analytics with Apache Flink
Gelly-Stream: Single-Pass Graph Streaming Analytics with Apache FlinkGelly-Stream: Single-Pass Graph Streaming Analytics with Apache Flink
Gelly-Stream: Single-Pass Graph Streaming Analytics with Apache FlinkVasia Kalavri
 
Flink Forward SF 2017: Stefan Richter - Improvements for large state and reco...
Flink Forward SF 2017: Stefan Richter - Improvements for large state and reco...Flink Forward SF 2017: Stefan Richter - Improvements for large state and reco...
Flink Forward SF 2017: Stefan Richter - Improvements for large state and reco...Flink Forward
 

Was ist angesagt? (20)

Apache Beam: A unified model for batch and stream processing data
Apache Beam: A unified model for batch and stream processing dataApache Beam: A unified model for batch and stream processing data
Apache Beam: A unified model for batch and stream processing data
 
Flink Forward SF 2017: Bill Liu & Haohui Mai - AthenaX : Uber’s streaming pro...
Flink Forward SF 2017: Bill Liu & Haohui Mai - AthenaX : Uber’s streaming pro...Flink Forward SF 2017: Bill Liu & Haohui Mai - AthenaX : Uber’s streaming pro...
Flink Forward SF 2017: Bill Liu & Haohui Mai - AthenaX : Uber’s streaming pro...
 
Flink Forward SF 2017: Srikanth Satya & Tom Kaitchuck - Pravega: Storage Rei...
Flink Forward SF 2017: Srikanth Satya & Tom Kaitchuck -  Pravega: Storage Rei...Flink Forward SF 2017: Srikanth Satya & Tom Kaitchuck -  Pravega: Storage Rei...
Flink Forward SF 2017: Srikanth Satya & Tom Kaitchuck - Pravega: Storage Rei...
 
Flink forward SF 2017: Elizabeth K. Joseph and Ravi Yadav - Flink meet DC/OS ...
Flink forward SF 2017: Elizabeth K. Joseph and Ravi Yadav - Flink meet DC/OS ...Flink forward SF 2017: Elizabeth K. Joseph and Ravi Yadav - Flink meet DC/OS ...
Flink forward SF 2017: Elizabeth K. Joseph and Ravi Yadav - Flink meet DC/OS ...
 
Apache Beam (incubating)
Apache Beam (incubating)Apache Beam (incubating)
Apache Beam (incubating)
 
Expanding Apache Spark Use Cases in 2.2 and Beyond with Matei Zaharia and dem...
Expanding Apache Spark Use Cases in 2.2 and Beyond with Matei Zaharia and dem...Expanding Apache Spark Use Cases in 2.2 and Beyond with Matei Zaharia and dem...
Expanding Apache Spark Use Cases in 2.2 and Beyond with Matei Zaharia and dem...
 
Greg Hogan – To Petascale and Beyond- Apache Flink in the Clouds
Greg Hogan – To Petascale and Beyond- Apache Flink in the CloudsGreg Hogan – To Petascale and Beyond- Apache Flink in the Clouds
Greg Hogan – To Petascale and Beyond- Apache Flink in the Clouds
 
Towards sql for streams
Towards sql for streamsTowards sql for streams
Towards sql for streams
 
Advanced Streaming Analytics with Apache Flink and Apache Kafka, Stephan Ewen
Advanced Streaming Analytics with Apache Flink and Apache Kafka, Stephan EwenAdvanced Streaming Analytics with Apache Flink and Apache Kafka, Stephan Ewen
Advanced Streaming Analytics with Apache Flink and Apache Kafka, Stephan Ewen
 
Arbitrary Stateful Aggregations using Structured Streaming in Apache Spark
Arbitrary Stateful Aggregations using Structured Streaming in Apache SparkArbitrary Stateful Aggregations using Structured Streaming in Apache Spark
Arbitrary Stateful Aggregations using Structured Streaming in Apache Spark
 
The Stream Processor as a Database Apache Flink
The Stream Processor as a Database Apache FlinkThe Stream Processor as a Database Apache Flink
The Stream Processor as a Database Apache Flink
 
Flink Forward Berlin 2017: Stephan Ewen - The State of Flink and how to adopt...
Flink Forward Berlin 2017: Stephan Ewen - The State of Flink and how to adopt...Flink Forward Berlin 2017: Stephan Ewen - The State of Flink and how to adopt...
Flink Forward Berlin 2017: Stephan Ewen - The State of Flink and how to adopt...
 
Streaming SQL (at FlinkForward, Berlin, 2016/09/12)
Streaming SQL (at FlinkForward, Berlin, 2016/09/12)Streaming SQL (at FlinkForward, Berlin, 2016/09/12)
Streaming SQL (at FlinkForward, Berlin, 2016/09/12)
 
Streaming SQL
Streaming SQLStreaming SQL
Streaming SQL
 
Introduction to Apache Beam & No Shard Left Behind: APIs for Massive Parallel...
Introduction to Apache Beam & No Shard Left Behind: APIs for Massive Parallel...Introduction to Apache Beam & No Shard Left Behind: APIs for Massive Parallel...
Introduction to Apache Beam & No Shard Left Behind: APIs for Massive Parallel...
 
Stateful Distributed Stream Processing
Stateful Distributed Stream ProcessingStateful Distributed Stream Processing
Stateful Distributed Stream Processing
 
Unified Stream & Batch Processing with Apache Flink (Hadoop Summit Dublin 2016)
Unified Stream & Batch Processing with Apache Flink (Hadoop Summit Dublin 2016)Unified Stream & Batch Processing with Apache Flink (Hadoop Summit Dublin 2016)
Unified Stream & Batch Processing with Apache Flink (Hadoop Summit Dublin 2016)
 
Kenneth Knowles - Apache Beam - A Unified Model for Batch and Streaming Data...
Kenneth Knowles -  Apache Beam - A Unified Model for Batch and Streaming Data...Kenneth Knowles -  Apache Beam - A Unified Model for Batch and Streaming Data...
Kenneth Knowles - Apache Beam - A Unified Model for Batch and Streaming Data...
 
Gelly-Stream: Single-Pass Graph Streaming Analytics with Apache Flink
Gelly-Stream: Single-Pass Graph Streaming Analytics with Apache FlinkGelly-Stream: Single-Pass Graph Streaming Analytics with Apache Flink
Gelly-Stream: Single-Pass Graph Streaming Analytics with Apache Flink
 
Flink Forward SF 2017: Stefan Richter - Improvements for large state and reco...
Flink Forward SF 2017: Stefan Richter - Improvements for large state and reco...Flink Forward SF 2017: Stefan Richter - Improvements for large state and reco...
Flink Forward SF 2017: Stefan Richter - Improvements for large state and reco...
 

Ähnlich wie Flink Forward SF 2017: David Hardwick, Sean Hester & David Brelloch - Dynamically Configured Stream Processing using Flink & Kafka

Web Oriented Architecture at Oracle
Web Oriented Architecture at OracleWeb Oriented Architecture at Oracle
Web Oriented Architecture at OracleEmiliano Pecis
 
Big Data on Azure Tutorial
Big Data on Azure TutorialBig Data on Azure Tutorial
Big Data on Azure Tutorialrustd
 
Introduction to Microsoft Flow - Introduction & advanced scenarios
Introduction to Microsoft Flow - Introduction & advanced scenariosIntroduction to Microsoft Flow - Introduction & advanced scenarios
Introduction to Microsoft Flow - Introduction & advanced scenariosserge luca
 
Data Ingestion in Big Data and IoT platforms
Data Ingestion in Big Data and IoT platformsData Ingestion in Big Data and IoT platforms
Data Ingestion in Big Data and IoT platformsGuido Schmutz
 
What's new in log insight 3.3 presentation
What's new in log insight 3.3 presentationWhat's new in log insight 3.3 presentation
What's new in log insight 3.3 presentationDavid Pasek
 
Architecting for change: LinkedIn's new data ecosystem
Architecting for change: LinkedIn's new data ecosystemArchitecting for change: LinkedIn's new data ecosystem
Architecting for change: LinkedIn's new data ecosystemYael Garten
 
Strata 2016 - Architecting for Change: LinkedIn's new data ecosystem
Strata 2016 - Architecting for Change: LinkedIn's new data ecosystemStrata 2016 - Architecting for Change: LinkedIn's new data ecosystem
Strata 2016 - Architecting for Change: LinkedIn's new data ecosystemShirshanka Das
 
Building Event-Driven (Micro)Services with Apache Kafka
Building Event-Driven (Micro)Services with Apache KafkaBuilding Event-Driven (Micro)Services with Apache Kafka
Building Event-Driven (Micro)Services with Apache KafkaGuido Schmutz
 
Keynote: Trends in Modern Application Development - Gilly Dekel, IBM
Keynote: Trends in Modern Application Development - Gilly Dekel, IBMKeynote: Trends in Modern Application Development - Gilly Dekel, IBM
Keynote: Trends in Modern Application Development - Gilly Dekel, IBMCodemotion Tel Aviv
 
James Turner (Caplin) - Enterprise HTML5 Patterns
James Turner (Caplin) - Enterprise HTML5 PatternsJames Turner (Caplin) - Enterprise HTML5 Patterns
James Turner (Caplin) - Enterprise HTML5 Patternsakqaanoraks
 
“Lights Out”Configuration using Tivoli Netcool AutoDiscovery Tools
“Lights Out”Configuration using Tivoli Netcool AutoDiscovery Tools“Lights Out”Configuration using Tivoli Netcool AutoDiscovery Tools
“Lights Out”Configuration using Tivoli Netcool AutoDiscovery ToolsAntonio Rolle
 
Innovation, Cloud Powered - Dr Werner Vogels
Innovation, Cloud Powered - Dr Werner VogelsInnovation, Cloud Powered - Dr Werner Vogels
Innovation, Cloud Powered - Dr Werner VogelsAmazon Web Services
 
Hybrid Identity Made Simple - Microsoft World Partner Conference 2016 Follow Up
Hybrid Identity Made Simple - Microsoft World Partner Conference 2016 Follow UpHybrid Identity Made Simple - Microsoft World Partner Conference 2016 Follow Up
Hybrid Identity Made Simple - Microsoft World Partner Conference 2016 Follow UpNicole Bray
 
MongoDB.local Atlanta: Introduction to Serverless MongoDB
MongoDB.local Atlanta: Introduction to Serverless MongoDBMongoDB.local Atlanta: Introduction to Serverless MongoDB
MongoDB.local Atlanta: Introduction to Serverless MongoDBMongoDB
 
Data-Driven and User-Centric: Improving enterprise productivity and engagemen...
Data-Driven and User-Centric: Improving enterprise productivity and engagemen...Data-Driven and User-Centric: Improving enterprise productivity and engagemen...
Data-Driven and User-Centric: Improving enterprise productivity and engagemen...Windows Developer
 
Activeeon use cases for cloud, digital transformation, IoT and big data autom...
Activeeon use cases for cloud, digital transformation, IoT and big data autom...Activeeon use cases for cloud, digital transformation, IoT and big data autom...
Activeeon use cases for cloud, digital transformation, IoT and big data autom...Activeeon
 
Apache Eagle at Hadoop Summit 2016 San Jose
Apache Eagle at Hadoop Summit 2016 San JoseApache Eagle at Hadoop Summit 2016 San Jose
Apache Eagle at Hadoop Summit 2016 San JoseHao Chen
 

Ähnlich wie Flink Forward SF 2017: David Hardwick, Sean Hester & David Brelloch - Dynamically Configured Stream Processing using Flink & Kafka (20)

Web Oriented Architecture at Oracle
Web Oriented Architecture at OracleWeb Oriented Architecture at Oracle
Web Oriented Architecture at Oracle
 
Big Data on Azure Tutorial
Big Data on Azure TutorialBig Data on Azure Tutorial
Big Data on Azure Tutorial
 
Introduction to Microsoft Flow - Introduction & advanced scenarios
Introduction to Microsoft Flow - Introduction & advanced scenariosIntroduction to Microsoft Flow - Introduction & advanced scenarios
Introduction to Microsoft Flow - Introduction & advanced scenarios
 
Data Ingestion in Big Data and IoT platforms
Data Ingestion in Big Data and IoT platformsData Ingestion in Big Data and IoT platforms
Data Ingestion in Big Data and IoT platforms
 
What's new in log insight 3.3 presentation
What's new in log insight 3.3 presentationWhat's new in log insight 3.3 presentation
What's new in log insight 3.3 presentation
 
Architecting for change: LinkedIn's new data ecosystem
Architecting for change: LinkedIn's new data ecosystemArchitecting for change: LinkedIn's new data ecosystem
Architecting for change: LinkedIn's new data ecosystem
 
Strata 2016 - Architecting for Change: LinkedIn's new data ecosystem
Strata 2016 - Architecting for Change: LinkedIn's new data ecosystemStrata 2016 - Architecting for Change: LinkedIn's new data ecosystem
Strata 2016 - Architecting for Change: LinkedIn's new data ecosystem
 
Building Event-Driven (Micro)Services with Apache Kafka
Building Event-Driven (Micro)Services with Apache KafkaBuilding Event-Driven (Micro)Services with Apache Kafka
Building Event-Driven (Micro)Services with Apache Kafka
 
Keynote: Trends in Modern Application Development - Gilly Dekel, IBM
Keynote: Trends in Modern Application Development - Gilly Dekel, IBMKeynote: Trends in Modern Application Development - Gilly Dekel, IBM
Keynote: Trends in Modern Application Development - Gilly Dekel, IBM
 
James Turner (Caplin) - Enterprise HTML5 Patterns
James Turner (Caplin) - Enterprise HTML5 PatternsJames Turner (Caplin) - Enterprise HTML5 Patterns
James Turner (Caplin) - Enterprise HTML5 Patterns
 
“Lights Out”Configuration using Tivoli Netcool AutoDiscovery Tools
“Lights Out”Configuration using Tivoli Netcool AutoDiscovery Tools“Lights Out”Configuration using Tivoli Netcool AutoDiscovery Tools
“Lights Out”Configuration using Tivoli Netcool AutoDiscovery Tools
 
Innovation, Cloud Powered - Dr Werner Vogels
Innovation, Cloud Powered - Dr Werner VogelsInnovation, Cloud Powered - Dr Werner Vogels
Innovation, Cloud Powered - Dr Werner Vogels
 
Hybrid Identity Made Simple - Microsoft World Partner Conference 2016 Follow Up
Hybrid Identity Made Simple - Microsoft World Partner Conference 2016 Follow UpHybrid Identity Made Simple - Microsoft World Partner Conference 2016 Follow Up
Hybrid Identity Made Simple - Microsoft World Partner Conference 2016 Follow Up
 
MongoDB.local Atlanta: Introduction to Serverless MongoDB
MongoDB.local Atlanta: Introduction to Serverless MongoDBMongoDB.local Atlanta: Introduction to Serverless MongoDB
MongoDB.local Atlanta: Introduction to Serverless MongoDB
 
Power
PowerPower
Power
 
Azure IoT Suite
Azure IoT Suite Azure IoT Suite
Azure IoT Suite
 
Data-Driven and User-Centric: Improving enterprise productivity and engagemen...
Data-Driven and User-Centric: Improving enterprise productivity and engagemen...Data-Driven and User-Centric: Improving enterprise productivity and engagemen...
Data-Driven and User-Centric: Improving enterprise productivity and engagemen...
 
Activeeon use cases for cloud, digital transformation, IoT and big data autom...
Activeeon use cases for cloud, digital transformation, IoT and big data autom...Activeeon use cases for cloud, digital transformation, IoT and big data autom...
Activeeon use cases for cloud, digital transformation, IoT and big data autom...
 
Apache Eagle: Secure Hadoop in Real Time
Apache Eagle: Secure Hadoop in Real TimeApache Eagle: Secure Hadoop in Real Time
Apache Eagle: Secure Hadoop in Real Time
 
Apache Eagle at Hadoop Summit 2016 San Jose
Apache Eagle at Hadoop Summit 2016 San JoseApache Eagle at Hadoop Summit 2016 San Jose
Apache Eagle at Hadoop Summit 2016 San Jose
 

Mehr von Flink Forward

Building a fully managed stream processing platform on Flink at scale for Lin...
Building a fully managed stream processing platform on Flink at scale for Lin...Building a fully managed stream processing platform on Flink at scale for Lin...
Building a fully managed stream processing platform on Flink at scale for Lin...Flink Forward
 
Evening out the uneven: dealing with skew in Flink
Evening out the uneven: dealing with skew in FlinkEvening out the uneven: dealing with skew in Flink
Evening out the uneven: dealing with skew in FlinkFlink Forward
 
“Alexa, be quiet!”: End-to-end near-real time model building and evaluation i...
“Alexa, be quiet!”: End-to-end near-real time model building and evaluation i...“Alexa, be quiet!”: End-to-end near-real time model building and evaluation i...
“Alexa, be quiet!”: End-to-end near-real time model building and evaluation i...Flink Forward
 
Introducing BinarySortedMultiMap - A new Flink state primitive to boost your ...
Introducing BinarySortedMultiMap - A new Flink state primitive to boost your ...Introducing BinarySortedMultiMap - A new Flink state primitive to boost your ...
Introducing BinarySortedMultiMap - A new Flink state primitive to boost your ...Flink Forward
 
Introducing the Apache Flink Kubernetes Operator
Introducing the Apache Flink Kubernetes OperatorIntroducing the Apache Flink Kubernetes Operator
Introducing the Apache Flink Kubernetes OperatorFlink Forward
 
Autoscaling Flink with Reactive Mode
Autoscaling Flink with Reactive ModeAutoscaling Flink with Reactive Mode
Autoscaling Flink with Reactive ModeFlink Forward
 
Dynamically Scaling Data Streams across Multiple Kafka Clusters with Zero Fli...
Dynamically Scaling Data Streams across Multiple Kafka Clusters with Zero Fli...Dynamically Scaling Data Streams across Multiple Kafka Clusters with Zero Fli...
Dynamically Scaling Data Streams across Multiple Kafka Clusters with Zero Fli...Flink Forward
 
One sink to rule them all: Introducing the new Async Sink
One sink to rule them all: Introducing the new Async SinkOne sink to rule them all: Introducing the new Async Sink
One sink to rule them all: Introducing the new Async SinkFlink Forward
 
Tuning Apache Kafka Connectors for Flink.pptx
Tuning Apache Kafka Connectors for Flink.pptxTuning Apache Kafka Connectors for Flink.pptx
Tuning Apache Kafka Connectors for Flink.pptxFlink Forward
 
Flink powered stream processing platform at Pinterest
Flink powered stream processing platform at PinterestFlink powered stream processing platform at Pinterest
Flink powered stream processing platform at PinterestFlink Forward
 
Apache Flink in the Cloud-Native Era
Apache Flink in the Cloud-Native EraApache Flink in the Cloud-Native Era
Apache Flink in the Cloud-Native EraFlink Forward
 
Where is my bottleneck? Performance troubleshooting in Flink
Where is my bottleneck? Performance troubleshooting in FlinkWhere is my bottleneck? Performance troubleshooting in Flink
Where is my bottleneck? Performance troubleshooting in FlinkFlink Forward
 
Using the New Apache Flink Kubernetes Operator in a Production Deployment
Using the New Apache Flink Kubernetes Operator in a Production DeploymentUsing the New Apache Flink Kubernetes Operator in a Production Deployment
Using the New Apache Flink Kubernetes Operator in a Production DeploymentFlink Forward
 
The Current State of Table API in 2022
The Current State of Table API in 2022The Current State of Table API in 2022
The Current State of Table API in 2022Flink Forward
 
Flink SQL on Pulsar made easy
Flink SQL on Pulsar made easyFlink SQL on Pulsar made easy
Flink SQL on Pulsar made easyFlink Forward
 
Dynamic Rule-based Real-time Market Data Alerts
Dynamic Rule-based Real-time Market Data AlertsDynamic Rule-based Real-time Market Data Alerts
Dynamic Rule-based Real-time Market Data AlertsFlink Forward
 
Exactly-Once Financial Data Processing at Scale with Flink and Pinot
Exactly-Once Financial Data Processing at Scale with Flink and PinotExactly-Once Financial Data Processing at Scale with Flink and Pinot
Exactly-Once Financial Data Processing at Scale with Flink and PinotFlink Forward
 
Processing Semantically-Ordered Streams in Financial Services
Processing Semantically-Ordered Streams in Financial ServicesProcessing Semantically-Ordered Streams in Financial Services
Processing Semantically-Ordered Streams in Financial ServicesFlink Forward
 
Tame the small files problem and optimize data layout for streaming ingestion...
Tame the small files problem and optimize data layout for streaming ingestion...Tame the small files problem and optimize data layout for streaming ingestion...
Tame the small files problem and optimize data layout for streaming ingestion...Flink Forward
 
Batch Processing at Scale with Flink & Iceberg
Batch Processing at Scale with Flink & IcebergBatch Processing at Scale with Flink & Iceberg
Batch Processing at Scale with Flink & IcebergFlink Forward
 

Mehr von Flink Forward (20)

Building a fully managed stream processing platform on Flink at scale for Lin...
Building a fully managed stream processing platform on Flink at scale for Lin...Building a fully managed stream processing platform on Flink at scale for Lin...
Building a fully managed stream processing platform on Flink at scale for Lin...
 
Evening out the uneven: dealing with skew in Flink
Evening out the uneven: dealing with skew in FlinkEvening out the uneven: dealing with skew in Flink
Evening out the uneven: dealing with skew in Flink
 
“Alexa, be quiet!”: End-to-end near-real time model building and evaluation i...
“Alexa, be quiet!”: End-to-end near-real time model building and evaluation i...“Alexa, be quiet!”: End-to-end near-real time model building and evaluation i...
“Alexa, be quiet!”: End-to-end near-real time model building and evaluation i...
 
Introducing BinarySortedMultiMap - A new Flink state primitive to boost your ...
Introducing BinarySortedMultiMap - A new Flink state primitive to boost your ...Introducing BinarySortedMultiMap - A new Flink state primitive to boost your ...
Introducing BinarySortedMultiMap - A new Flink state primitive to boost your ...
 
Introducing the Apache Flink Kubernetes Operator
Introducing the Apache Flink Kubernetes OperatorIntroducing the Apache Flink Kubernetes Operator
Introducing the Apache Flink Kubernetes Operator
 
Autoscaling Flink with Reactive Mode
Autoscaling Flink with Reactive ModeAutoscaling Flink with Reactive Mode
Autoscaling Flink with Reactive Mode
 
Dynamically Scaling Data Streams across Multiple Kafka Clusters with Zero Fli...
Dynamically Scaling Data Streams across Multiple Kafka Clusters with Zero Fli...Dynamically Scaling Data Streams across Multiple Kafka Clusters with Zero Fli...
Dynamically Scaling Data Streams across Multiple Kafka Clusters with Zero Fli...
 
One sink to rule them all: Introducing the new Async Sink
One sink to rule them all: Introducing the new Async SinkOne sink to rule them all: Introducing the new Async Sink
One sink to rule them all: Introducing the new Async Sink
 
Tuning Apache Kafka Connectors for Flink.pptx
Tuning Apache Kafka Connectors for Flink.pptxTuning Apache Kafka Connectors for Flink.pptx
Tuning Apache Kafka Connectors for Flink.pptx
 
Flink powered stream processing platform at Pinterest
Flink powered stream processing platform at PinterestFlink powered stream processing platform at Pinterest
Flink powered stream processing platform at Pinterest
 
Apache Flink in the Cloud-Native Era
Apache Flink in the Cloud-Native EraApache Flink in the Cloud-Native Era
Apache Flink in the Cloud-Native Era
 
Where is my bottleneck? Performance troubleshooting in Flink
Where is my bottleneck? Performance troubleshooting in FlinkWhere is my bottleneck? Performance troubleshooting in Flink
Where is my bottleneck? Performance troubleshooting in Flink
 
Using the New Apache Flink Kubernetes Operator in a Production Deployment
Using the New Apache Flink Kubernetes Operator in a Production DeploymentUsing the New Apache Flink Kubernetes Operator in a Production Deployment
Using the New Apache Flink Kubernetes Operator in a Production Deployment
 
The Current State of Table API in 2022
The Current State of Table API in 2022The Current State of Table API in 2022
The Current State of Table API in 2022
 
Flink SQL on Pulsar made easy
Flink SQL on Pulsar made easyFlink SQL on Pulsar made easy
Flink SQL on Pulsar made easy
 
Dynamic Rule-based Real-time Market Data Alerts
Dynamic Rule-based Real-time Market Data AlertsDynamic Rule-based Real-time Market Data Alerts
Dynamic Rule-based Real-time Market Data Alerts
 
Exactly-Once Financial Data Processing at Scale with Flink and Pinot
Exactly-Once Financial Data Processing at Scale with Flink and PinotExactly-Once Financial Data Processing at Scale with Flink and Pinot
Exactly-Once Financial Data Processing at Scale with Flink and Pinot
 
Processing Semantically-Ordered Streams in Financial Services
Processing Semantically-Ordered Streams in Financial ServicesProcessing Semantically-Ordered Streams in Financial Services
Processing Semantically-Ordered Streams in Financial Services
 
Tame the small files problem and optimize data layout for streaming ingestion...
Tame the small files problem and optimize data layout for streaming ingestion...Tame the small files problem and optimize data layout for streaming ingestion...
Tame the small files problem and optimize data layout for streaming ingestion...
 
Batch Processing at Scale with Flink & Iceberg
Batch Processing at Scale with Flink & IcebergBatch Processing at Scale with Flink & Iceberg
Batch Processing at Scale with Flink & Iceberg
 

KĂŒrzlich hochgeladen

FESE Capital Markets Fact Sheet 2024 Q1.pdf
FESE Capital Markets Fact Sheet 2024 Q1.pdfFESE Capital Markets Fact Sheet 2024 Q1.pdf
FESE Capital Markets Fact Sheet 2024 Q1.pdfMarinCaroMartnezBerg
 
Call Girls đŸ«€ Dwarka âžĄïž 9711199171 âžĄïž Delhi đŸ«Š Two shot with one girl
Call Girls đŸ«€ Dwarka âžĄïž 9711199171 âžĄïž Delhi đŸ«Š Two shot with one girlCall Girls đŸ«€ Dwarka âžĄïž 9711199171 âžĄïž Delhi đŸ«Š Two shot with one girl
Call Girls đŸ«€ Dwarka âžĄïž 9711199171 âžĄïž Delhi đŸ«Š Two shot with one girlkumarajju5765
 
VIP Call Girls Service Miyapur Hyderabad Call +91-8250192130
VIP Call Girls Service Miyapur Hyderabad Call +91-8250192130VIP Call Girls Service Miyapur Hyderabad Call +91-8250192130
VIP Call Girls Service Miyapur Hyderabad Call +91-8250192130Suhani Kapoor
 
꧁❀ Greater Noida Call Girls Delhi ❀꧂ 9711199171 ☎ Hard And Sexy Vip Call
꧁❀ Greater Noida Call Girls Delhi ❀꧂ 9711199171 ☎ Hard And Sexy Vip Call꧁❀ Greater Noida Call Girls Delhi ❀꧂ 9711199171 ☎ Hard And Sexy Vip Call
꧁❀ Greater Noida Call Girls Delhi ❀꧂ 9711199171 ☎ Hard And Sexy Vip Callshivangimorya083
 
Best VIP Call Girls Noida Sector 39 Call Me: 8448380779
Best VIP Call Girls Noida Sector 39 Call Me: 8448380779Best VIP Call Girls Noida Sector 39 Call Me: 8448380779
Best VIP Call Girls Noida Sector 39 Call Me: 8448380779Delhi Call girls
 
April 2024 - Crypto Market Report's Analysis
April 2024 - Crypto Market Report's AnalysisApril 2024 - Crypto Market Report's Analysis
April 2024 - Crypto Market Report's Analysismanisha194592
 
Accredited-Transport-Cooperatives-Jan-2021-Web.pdf
Accredited-Transport-Cooperatives-Jan-2021-Web.pdfAccredited-Transport-Cooperatives-Jan-2021-Web.pdf
Accredited-Transport-Cooperatives-Jan-2021-Web.pdfadriantubila
 
Sampling (random) method and Non random.ppt
Sampling (random) method and Non random.pptSampling (random) method and Non random.ppt
Sampling (random) method and Non random.pptDr. Soumendra Kumar Patra
 
Invezz.com - Grow your wealth with trading signals
Invezz.com - Grow your wealth with trading signalsInvezz.com - Grow your wealth with trading signals
Invezz.com - Grow your wealth with trading signalsInvezz1
 
Determinants of health, dimensions of health, positive health and spectrum of...
Determinants of health, dimensions of health, positive health and spectrum of...Determinants of health, dimensions of health, positive health and spectrum of...
Determinants of health, dimensions of health, positive health and spectrum of...shambhavirathore45
 
Best VIP Call Girls Noida Sector 22 Call Me: 8448380779
Best VIP Call Girls Noida Sector 22 Call Me: 8448380779Best VIP Call Girls Noida Sector 22 Call Me: 8448380779
Best VIP Call Girls Noida Sector 22 Call Me: 8448380779Delhi Call girls
 
Week-01-2.ppt BBB human Computer interaction
Week-01-2.ppt BBB human Computer interactionWeek-01-2.ppt BBB human Computer interaction
Week-01-2.ppt BBB human Computer interactionfulawalesam
 
Log Analysis using OSSEC sasoasasasas.pptx
Log Analysis using OSSEC sasoasasasas.pptxLog Analysis using OSSEC sasoasasasas.pptx
Log Analysis using OSSEC sasoasasasas.pptxJohnnyPlasten
 
BigBuy dropshipping via API with DroFx.pptx
BigBuy dropshipping via API with DroFx.pptxBigBuy dropshipping via API with DroFx.pptx
BigBuy dropshipping via API with DroFx.pptxolyaivanovalion
 
Call me @ 9892124323 Cheap Rate Call Girls in Vashi with Real Photo 100% Secure
Call me @ 9892124323  Cheap Rate Call Girls in Vashi with Real Photo 100% SecureCall me @ 9892124323  Cheap Rate Call Girls in Vashi with Real Photo 100% Secure
Call me @ 9892124323 Cheap Rate Call Girls in Vashi with Real Photo 100% SecurePooja Nehwal
 
Edukaciniai dropshipping via API with DroFx
Edukaciniai dropshipping via API with DroFxEdukaciniai dropshipping via API with DroFx
Edukaciniai dropshipping via API with DroFxolyaivanovalion
 
Schema on read is obsolete. Welcome metaprogramming..pdf
Schema on read is obsolete. Welcome metaprogramming..pdfSchema on read is obsolete. Welcome metaprogramming..pdf
Schema on read is obsolete. Welcome metaprogramming..pdfLars Albertsson
 
Chintamani Call Girls: 🍓 7737669865 🍓 High Profile Model Escorts | Bangalore ...
Chintamani Call Girls: 🍓 7737669865 🍓 High Profile Model Escorts | Bangalore ...Chintamani Call Girls: 🍓 7737669865 🍓 High Profile Model Escorts | Bangalore ...
Chintamani Call Girls: 🍓 7737669865 🍓 High Profile Model Escorts | Bangalore ...amitlee9823
 

KĂŒrzlich hochgeladen (20)

CHEAP Call Girls in Saket (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Saket (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICECHEAP Call Girls in Saket (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Saket (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
 
FESE Capital Markets Fact Sheet 2024 Q1.pdf
FESE Capital Markets Fact Sheet 2024 Q1.pdfFESE Capital Markets Fact Sheet 2024 Q1.pdf
FESE Capital Markets Fact Sheet 2024 Q1.pdf
 
Call Girls đŸ«€ Dwarka âžĄïž 9711199171 âžĄïž Delhi đŸ«Š Two shot with one girl
Call Girls đŸ«€ Dwarka âžĄïž 9711199171 âžĄïž Delhi đŸ«Š Two shot with one girlCall Girls đŸ«€ Dwarka âžĄïž 9711199171 âžĄïž Delhi đŸ«Š Two shot with one girl
Call Girls đŸ«€ Dwarka âžĄïž 9711199171 âžĄïž Delhi đŸ«Š Two shot with one girl
 
VIP Call Girls Service Miyapur Hyderabad Call +91-8250192130
VIP Call Girls Service Miyapur Hyderabad Call +91-8250192130VIP Call Girls Service Miyapur Hyderabad Call +91-8250192130
VIP Call Girls Service Miyapur Hyderabad Call +91-8250192130
 
꧁❀ Greater Noida Call Girls Delhi ❀꧂ 9711199171 ☎ Hard And Sexy Vip Call
꧁❀ Greater Noida Call Girls Delhi ❀꧂ 9711199171 ☎ Hard And Sexy Vip Call꧁❀ Greater Noida Call Girls Delhi ❀꧂ 9711199171 ☎ Hard And Sexy Vip Call
꧁❀ Greater Noida Call Girls Delhi ❀꧂ 9711199171 ☎ Hard And Sexy Vip Call
 
Best VIP Call Girls Noida Sector 39 Call Me: 8448380779
Best VIP Call Girls Noida Sector 39 Call Me: 8448380779Best VIP Call Girls Noida Sector 39 Call Me: 8448380779
Best VIP Call Girls Noida Sector 39 Call Me: 8448380779
 
April 2024 - Crypto Market Report's Analysis
April 2024 - Crypto Market Report's AnalysisApril 2024 - Crypto Market Report's Analysis
April 2024 - Crypto Market Report's Analysis
 
Accredited-Transport-Cooperatives-Jan-2021-Web.pdf
Accredited-Transport-Cooperatives-Jan-2021-Web.pdfAccredited-Transport-Cooperatives-Jan-2021-Web.pdf
Accredited-Transport-Cooperatives-Jan-2021-Web.pdf
 
Abortion pills in Doha Qatar (+966572737505 ! Get Cytotec
Abortion pills in Doha Qatar (+966572737505 ! Get CytotecAbortion pills in Doha Qatar (+966572737505 ! Get Cytotec
Abortion pills in Doha Qatar (+966572737505 ! Get Cytotec
 
Sampling (random) method and Non random.ppt
Sampling (random) method and Non random.pptSampling (random) method and Non random.ppt
Sampling (random) method and Non random.ppt
 
Invezz.com - Grow your wealth with trading signals
Invezz.com - Grow your wealth with trading signalsInvezz.com - Grow your wealth with trading signals
Invezz.com - Grow your wealth with trading signals
 
Determinants of health, dimensions of health, positive health and spectrum of...
Determinants of health, dimensions of health, positive health and spectrum of...Determinants of health, dimensions of health, positive health and spectrum of...
Determinants of health, dimensions of health, positive health and spectrum of...
 
Best VIP Call Girls Noida Sector 22 Call Me: 8448380779
Best VIP Call Girls Noida Sector 22 Call Me: 8448380779Best VIP Call Girls Noida Sector 22 Call Me: 8448380779
Best VIP Call Girls Noida Sector 22 Call Me: 8448380779
 
Week-01-2.ppt BBB human Computer interaction
Week-01-2.ppt BBB human Computer interactionWeek-01-2.ppt BBB human Computer interaction
Week-01-2.ppt BBB human Computer interaction
 
Log Analysis using OSSEC sasoasasasas.pptx
Log Analysis using OSSEC sasoasasasas.pptxLog Analysis using OSSEC sasoasasasas.pptx
Log Analysis using OSSEC sasoasasasas.pptx
 
BigBuy dropshipping via API with DroFx.pptx
BigBuy dropshipping via API with DroFx.pptxBigBuy dropshipping via API with DroFx.pptx
BigBuy dropshipping via API with DroFx.pptx
 
Call me @ 9892124323 Cheap Rate Call Girls in Vashi with Real Photo 100% Secure
Call me @ 9892124323  Cheap Rate Call Girls in Vashi with Real Photo 100% SecureCall me @ 9892124323  Cheap Rate Call Girls in Vashi with Real Photo 100% Secure
Call me @ 9892124323 Cheap Rate Call Girls in Vashi with Real Photo 100% Secure
 
Edukaciniai dropshipping via API with DroFx
Edukaciniai dropshipping via API with DroFxEdukaciniai dropshipping via API with DroFx
Edukaciniai dropshipping via API with DroFx
 
Schema on read is obsolete. Welcome metaprogramming..pdf
Schema on read is obsolete. Welcome metaprogramming..pdfSchema on read is obsolete. Welcome metaprogramming..pdf
Schema on read is obsolete. Welcome metaprogramming..pdf
 
Chintamani Call Girls: 🍓 7737669865 🍓 High Profile Model Escorts | Bangalore ...
Chintamani Call Girls: 🍓 7737669865 🍓 High Profile Model Escorts | Bangalore ...Chintamani Call Girls: 🍓 7737669865 🍓 High Profile Model Escorts | Bangalore ...
Chintamani Call Girls: 🍓 7737669865 🍓 High Profile Model Escorts | Bangalore ...
 

Flink Forward SF 2017: David Hardwick, Sean Hester & David Brelloch - Dynamically Configured Stream Processing using Flink & Kafka

  • 1. Powering Cloud IT Dynamically Configured Stream Processing Using Flink & Kafka David Hardwick Sean Hester David Brelloch https://github.com/brelloch/FlinkForward2017
  • 3. BETTERCLOUD2017 A Few Years Ago Complex Interconnect of Apps, People and Data This is Now
  • 4. Mission Control for IT Admins CENTRALIZATIONINTELLIGENCE ORCHESTRATION USERS DATA RESOURCES “Multi-SaaS Management” is like
  • 5. Alert Detections Policy Violations Normalization Automated Workflows Single or Bulk Actions PUBLIC APIs Data Ingestion USERS Internal Users External Users Memberships DATA Files Connected Apps RESOURCES Calendars Devices Conference Rooms Role-BasedPrivileges BetterCloud Platform Multi-SaaS Management We process 100s millions of messages daily CONNECTORS INTELLIGENCE ORCHESTRATIONCENTRALIZE
  • 6. Alert Detections Policy Violations Normalization Automated Workflows Single or Bulk Actions PUBLIC APIs Data Ingestion USERS Internal Users External Users Memberships DATA Files Connected Apps RESOURCES Calendars Devices Conference Rooms Role-BasedPrivileges BetterCloud Platform Multi-SaaS Management BetterCloud Platform CONNECTORS INTELLIGENCE ORCHESTRATIONCENTRALIZE
  • 7. Alert Detections Policy Violations Normalization Automated Workflows Single or Bulk Actions PUBLIC APIs Data Ingestion USERS Internal Users External Users Memberships DATA Files Connected Apps RESOURCES Calendars Devices Conference Rooms Role-BasedPrivileges BetterCloud Platform Multi-SaaS Management BetterCloud Platform CONNECTORS INTELLIGENCE ORCHESTRATIONCENTRALIZE
  • 10. Alert Detections Policy Violations Normalization Automated Workflows Single or Bulk Actions PUBLIC APIs Data Ingestion USERS Internal Users External Users Memberships DATA Files Connected Apps RESOURCES Calendars Devices Conference Rooms Role-BasedPrivileges BetterCloud Platform Multi-SaaS Management BetterCloud Platform CONNECTORS INTELLIGENCE ORCHESTRATIONCENTRALIZE
  • 11. Alert Detections Policy Violations Normalization Automated Workflows Single or Bulk Actions PUBLIC APIs Data Ingestion USERS Internal Users External Users Memberships DATA Files Connected Apps RESOURCES Calendars Devices Conference Rooms Role-BasedPrivileges BetterCloud Platform Multi-SaaS Management BetterCloud Platform CONNECTORS INTELLIGENCE ORCHESTRATIONCENTRALIZE
  • 13. Alert Detections Policy Violations Normalization Automated Workflows Single or Bulk Actions PUBLIC APIs Data Ingestion USERS Internal Users External Users Memberships DATA Files Connected Apps RESOURCES Calendars Devices Conference Rooms Role-BasedPrivileges BetterCloud Platform Multi-SaaS Management BetterCloud Platform CONNECTORS INTELLIGENCE ORCHESTRATIONCENTRALIZE
  • 14. Alert Detections Policy Violations Normalization Automated Workflows Single or Bulk Actions PUBLIC APIs Data Ingestion USERS Internal Users External Users Memberships DATA Files Connected Apps RESOURCES Calendars Devices Conference Rooms Role-BasedPrivileges BetterCloud Platform Multi-SaaS Management BetterCloud Platform CONNECTORS INTELLIGENCE ORCHESTRATIONCENTRALIZE
  • 17. CONNECTORS OBJECTS INTELLIGENCE Alert Detections Policy Violations ORCHESTRATION Normalization Automated Workflows Single or Bulk Actions PUBLIC APIs Data Ingestion CENTRALIZE USERS Internal Users External Users Memberships DATA Files Connected Apps RESOURCES Calendars Devices Conference Rooms Role-BasedPrivileges BetterCloud Platform Heavy use of Flink here
  • 18. © 2016 BetterCloud, Inc. All Rights Reserved Business Needs and Challenges ● Alert quickly < 2s latency from ingest to alert ● Scale tremendously ~100M events/day ...and growing ● Keep innovating daily deployments to production ● Show the power detect global alerts across all customers ● Let customers drive custom alerts for every customer ● Replay history “go back in time” for new alerts ...or alert bugs
  • 19. BETTERCLOUD2017 “Okay, can you go deeper?” Nope, but Sean and David can!
  • 20. © 2016 BetterCloud, Inc. All Rights Reserved Foundational Prior Learnings 1. Event Stream Processing is a better model for Operational Intelligence than Ingest + Query
  • 21. © 2016 BetterCloud, Inc. All Rights Reserved Foundational Prior Learnings 1. Event Stream Processing is a better model for Operational Intelligence than Ingest + Query 2. Rules Engines add significantly more value than hard- coded rules
  • 22. Alert Detections Policy Violations Normalization Automated Workflows Single or Bulk Actions PUBLIC APIs Data Ingestion USERS Internal Users External Users Memberships DATA Files Connected Apps RESOURCES Calendars Devices Conference Rooms Role-BasedPrivileges BetterCloud Platform Multi-SaaS Management We process 100s of millions of messages daily CONNECTORS INTELLIGENCE ORCHESTRATIONCENTRALIZE
  • 23. © 2016 BetterCloud, Inc. All Rights Reserved Foundational Prior Learnings 1. Event Stream Processing is a better model for Operational Intelligence than Ingest + Query 2. Rules Engines add significantly more value than hard- coded rules
  • 24. © 2016 BetterCloud, Inc. All Rights Reserved JsonPath ● Jayway JsonPath: https://github.com/jayway/JsonPath ● Executes queries again JSON documents ● For us, simplifies the creation of a rules interface for our non-technical users
  • 25. © 2016 BetterCloud, Inc. All Rights Reserved JsonPath Continued Example Paths and Output: $.expensive => 10 $.store.bicycle.price => 19.95 $.store.book[0].author => "Nigel Rees" $.store.book.length > 0 => true $.store.book[?(@.category == ‘fiction’)].price > 10.00 => { 
 }
  • 26. © 2016 BetterCloud, Inc. All Rights Reserved JsonPath Wrapped in a User Interface
  • 27. © 2016 BetterCloud, Inc. All Rights Reserved The Control Stream
  • 28. © 2016 BetterCloud, Inc. All Rights Reserved The Solution
  • 29. © 2016 BetterCloud, Inc. All Rights Reserved Models case class CustomerEvent(customerId: UUID, payload: String) case class ControlEvent(customerId: UUID, alertId: UUID, alertName: String, alertDescription: String, threshold: Int, jsonPath: String, bootstrapCustomerId: UUID)
  • 30. © 2016 BetterCloud, Inc. All Rights Reserved Sources - Event Stream val eventStream = env.addSource(new FlinkKafkaConsumer09("events", new CustomerEventSchema(), properties)) .filter(x => x.isDefined) .map(x => x.get) .keyBy((ce: CustomerEvent) => { ce.customerId } )
  • 31. © 2016 BetterCloud, Inc. All Rights Reserved Sources - Control Stream val controlStream = env.addSource(new FlinkKafkaConsumer09("controls", new ControlEventSchema(), properties)) .filter(x => x.isDefined) .map(x => x.get) .name("Control Source") .split((ce: ControlEvent) => { ce.customerId match { case Constants.GLOBAL_CUSTOMER_ID => List("global") case _ => List("specific") } })
  • 32. © 2016 BetterCloud, Inc. All Rights Reserved Sources - Control Stream Continued val globalControlStream = controlStream.select("global").broadcast val specificControlStream = controlStream.select("specific") .keyBy((ce: ControlEvent) => { ce.customerId })
  • 33. © 2016 BetterCloud, Inc. All Rights Reserved Sources - Join the Streams // Join the control and event streams val filterStream = globalControlStream.union(specificControlStream) .connect( eventStream )
  • 34. © 2016 BetterCloud, Inc. All Rights Reserved Work on Streams - Filtering class FilterFunction() extends RichCoFlatMapFunction[ControlEvent, CustomerEvent, FilteredEvent] { var configs = new mutable.ListBuffer[ControlEvent]() override def flatMap1(value: ControlEvent, out: Collector[FilteredEvent]): Unit = { configs = configs.filter(x => (x.customerId != value.customerId) && (x.alertId != value.alertId)) configs.append(value) } override def flatMap2(value: CustomerEvent, out: Collector[FilteredEvent]): Unit = { val eventConfigs = configs.filter(x => (x.customerId == x.customerId) || (x.customerId == Constants.GLOBAL_CUSTOMER_ID)) if (eventConfigs.size > 0) { out.collect(FilteredEvent(value, eventConfigs.toList)) } } }
  • 35. © 2016 BetterCloud, Inc. All Rights Reserved Work on Streams - Qualifying class QualifierFunction extends FlatMapFunction[FilteredEvent, QualifiedEvent] { override def flatMap(value: FilteredEvent, out: Collector[QualifiedEvent]): Unit = { Try(JsonPath.parse(value.event.payload)).map(ctx => { value.controls.foreach(control => { Try { val result: String = ctx.read(control.jsonPath) if (!result.isEmpty) { out.collect(QualifiedEvent(value.event, control)) } } }) }) } }
  • 36. © 2016 BetterCloud, Inc. All Rights Reserved Work on Streams - Counting class CounterFunction extends FlatMapFunction[QualifiedEvent, ControlEvent] { var counts = scala.collection.mutable.HashMap[String, Int]() override def flatMap(value: QualifiedEvent, out: Collector[ControlEvent]): Unit = { val key = s"${value.event.customerId}${value.control.alertId}" if (counts.contains(key)) { counts.put(key, counts.get(key).get + 1) println(s"Count for ${key}: ${counts.get(key).get}") } else { counts.put(key, 1) println(s"Count for ${key}: ${counts.get(key).get}") } } }
  • 37. © 2016 BetterCloud, Inc. All Rights Reserved Wiring It Up val filterFunction = new FilterFunction val qualifierFunction = new QualifierFunction val counterFunction = new CounterFunction // Join the control and event streams val filterStream = globalControlStream.union(specificControlStream) .connect( eventStream ) .flatMap(filterFunction).name("Filtering Function") .flatMap(qualifierFunction).name("Qualifier Function") .flatMap(counterFunction).name("Counter Function")
  • 38. © 2016 BetterCloud, Inc. All Rights Reserved What about historical data? ● The current solution works great against the live stream of data, but
 how do you get to the current number when the events we need have already gone through the system?
  • 39. © 2016 BetterCloud, Inc. All Rights Reserved Basic Implementation
  • 40. © 2016 BetterCloud, Inc. All Rights Reserved Counter Function Updated override def flatMap(value: QualifiedEvent, out: Collector[ControlEvent]): Unit = { val key = s"${value.event.customerId}${value.control.alertId}" if (counts.contains(key)) { counts.put(key, counts.get(key).get + 1) println(s"Count for ${key}: ${counts.get(key).get}") } else { val c = value.control counts.put(key, 1) out.collect(ControlEvent(c.customerId, c.alertId, c.alertName, c.alertDescription, c.threshold, c.jsonPath, value.event.customerId)) println(s"Bootstrap count for ${key}: ${counts.get(key).get}") } }
  • 41. © 2016 BetterCloud, Inc. All Rights Reserved Bootstrap Function (“Go back in time”) class BootstrapFunction extends FlatMapFunction[ControlEvent, FilteredEvent] { override def flatMap(value: ControlEvent, out: Collector[FilteredEvent]): Unit = { val stream = getClass.getResourceAsStream("/events.txt") Source.fromInputStream(stream) .getLines .toList .map(x => CustomerEvent(x)) .filter(x => x.customerId == value.bootstrapCustomerId) .foreach(x => { out.collect(FilteredEvent(x, List(value))) }) } }
  • 42. © 2016 BetterCloud, Inc. All Rights Reserved Wire up bootstrap (“Go back in time”) val bootstrapStream = env.addSource(new FlinkKafkaConsumer09("bootstrap", new ControlEventSchema(), properties)) .filter(x => x.isDefined).map(x => x.get).flatMap(bootstrapFunction).name("Bootstrap Function") .keyBy((fe: FilteredEvent) => { fe.event.customerId } ) val bootstrapSink = new FlinkKafkaProducer09("bootstrap", new ControlEventSchema(), properties) val filterStream = globalControlStream.union(specificControlStream) .connect(eventStream) .flatMap(filterFunction).name("Filtering Function") .union(bootstrapStream) .flatMap(qualifierFunction).name("Qualifier Function") .flatMap(counterFunction).name("Counter Function") .addSink(bootstrapSink)
  • 43. © 2016 BetterCloud, Inc. All Rights Reserved Bootstrap Function Notes (“Go back in time”) ● Extremely simplified compared to what you would want in production ○ A real system requires both ingestion of all events and some kind of query system (API, database, kafka, etc
) ○ Be careful with how you implement the query system. It is easy to block the whole stream with an API or database (Async I/O!!!!). ● There should be some kind of tracking on the event which triggered to bootstrap ○ You will need to get all events up until that event from the storage system ● If ordering does not matter: ○ Can just replay all previous events as in the example code
  • 44. © 2016 BetterCloud, Inc. All Rights Reserved Bootstrap Function Notes (“Go back in time”) ● If ordering does matter: ○ You will need to collect and block all incoming events for that specific key until the replay of old events completes
  • 45. © 2016 BetterCloud, Inc. All Rights Reserved Our Solution For Historical Data - Long Term Storage
  • 47. © 2016 BetterCloud, Inc. All Rights Reserved Further Areas for Improvement ● Most expensive operations for us are JsonPath operations. It may be worth moving towards broadcasting all alerts instead of just global and move the keyed stream to as late as possible (we are switching to this) ● State is not being saved. At a minimum the controls and counts should be saved in state ● The current models only support incrementing ● JsonPath supports different types so you can have more operators than equals (>, <, etc...) ● Only a single property path is supported
  • 48. © 2016 BetterCloud, Inc. All Rights Reserved We are hiring (go figure, right?)!!! Seriously, we are always hiring. If you are interested talk to David Hardwick or visit https://www.bettercloud.com/careers/

Hinweis der Redaktion

  1. [ Time : 30 seconds, 30 seconds total ] DYNAMICALLY CONFIGuRED STREAM PROCESSING using Flink and Kafka! I have five minutes to tell you about the marketspace BetterCloud resides in and how it drove us to solve the problems that we will cover in today’s session.
  2. [ Time : 15 seconds, 45 seconds total ] UNIFED SAAS MANAGEMENT, that’s the marketspace that we are in....so WHAT DOES THAT MEAN, EXACTLY?
  3. [ Time : 15 seconds, 60 seconds total ] A few years ago, Cloud was relatively easy...but now there are so many awesome SaaS apps that IT Admins struggle to control it
  4. [ Time : 15 seconds, 1m 15 seconds total ] Unified SaaS Management feels like ‘MISSION CONTROL’ for IT Admins and Support Techs... They can have intelligent alerts, centralize all their data and orchestrate both within and across their favorite IT SaaS apps. ...let me quickly visualize what all this means, with a focus on INTELLIGENCE because that is where we leverage Flink for the solution we are covering today
  5. [ Time : 15 seconds, 1m 30 seconds total ]
  6. [ Time : 15 seconds, 1m 45 seconds total ]
  7. [ Time : 15 seconds, 2m 00 seconds total ]
  8. [ Time : 15 seconds, 2m 15 seconds total ]
  9. [ Time : 15 seconds, 2m 30 seconds total ] Here’s a detail view...showing all the SaaS groups the user to which it belongs.
  10. [ Time : 15 seconds, 2m 45 seconds total ]
  11. [ Time : 15 seconds, 3m 00 seconds total ]
  12. [ Time : 15 seconds, 4m 15 seconds total ] ...the ability to create alerts based on the meta data that is being streamed into the platform. For example: If Two factor is on for Google but off for Slack
  13. [ Time : 15 seconds, 3m 00 seconds total ]
  14. [ Time : 15 seconds, 3m 15 seconds total ] If create Jira project then create new Slack channel with project name
  15. [ Time : 10 seconds, 1m 47.5 sec seconds total ] The second way to visualize our orchestrator, is from the ‘action engine’ this is what we added to Jira
  16. [ Time : 10 seconds, 1m 37.5 sec seconds total ] If Create Jira project then create new “private-room” named the same as “project name” If Added to a Jira group, then add to this “private-room” If Create alias for a team, then add to team members to the alias as they add to the team
  17. [ Time : 15 seconds, 3m 45 seconds total ]
  18. [ Time : 45 seconds, 5m 00 seconds total ] An alert that fires 12 hours from now isn’t very helpful We’ve already had peak loads exceeding 100M events in a day We need to stay agile, and using continuous delivery techniques such as features flags and jenkins pipelines to ship new capabilities to customers multiple times a day We need to show the power by providing commong alerts across many thousands of customers that have multiple SaaS apps and multiple alerts per SaaS app. AND put the customers in the drivers seat by allowing them to create custom alerts for their specific needs. And finally, we need to be able to replay history, to go back in time in case we have to correct a bug in a global alert or if customer deploys a new alert that would benefit from looking at the historical data and not just the data going forward from the time that the alert is deployed.
  19. [ Time : 15 seconds, 45 seconds total ] UNIFED SAAS MANAGEMENT, that’s the marketspace that we are in....so WHAT DOES THAT MEAN, EXACTLY? ----- HESTER START ----- Thanks, Hardwick! Hi everyone, I’m Sean Hester, a Director of Engineering at BetterCloud. I provide architectural support and leadership for teams in the Operational Intelligence segment of BetterCloud’s platform. Before my teammate David Brelloch takes on a dive through some code, I wanted to give you some quick architectural backstory. Before we transitioned into this project both David and I had worked on a somewhat similar project for BetterCloud, and we had several “learnings” from that project that we wanted to apply here:
  20. Event Stream Processing is a better solution for this domain than Ingest + Query. Ingest + Query is where you read all events into a giant database, and then run a bunch of queries against the it to extract the Operational Intelligence. It has many downsides: it’s slow and inefficient--lots of redundant processing It has high latency--best case it takes minutes or hours to surface the latest data It’s datastore intensive, which makes it expensive to scale Worst of all, it focuses on state instead of state transitions. In Operational Intelligence we care at least as much about state transitions as we do the current state.
  21. Rules Engines add significantly more value than hard-coded rules. They’re slow to develop. They’re expensive to maintain. No one likes to code them--they’re boring and redundant. They aren’t conducive to an agile business--long cycle times from your Kanban board to production. The first point was a fairly easy sell for us. As you may have noticed during Hardwick’s intro
 The entire organization has embraced an event stream model. Everything flows from the SaaS provider APIs through the BetterCloud platform as a set of continuous streams. This made it simple to take our prefered approach.
  22. The entire organization has embraced an event stream model. Everything flows from the SaaS provider APIs through the BetterCloud platform as a set of continuous streams. This made it simple for our team to take our prefered approach.
  23. For the second point we went outside the box a bit more. I’ve been around long enough to have had significant experience with the XML stack back before Douglas Crockford killed it. XPath + XSLT were two of my favorite tools in the stack, i’ve built rules engines with them, and it turns out several folks have ported them to the JSON stack. For those of you not familiar with JSONPath (or XPath), let me give you a quick intro so that you’ll be on better footing when David starts walking through the code.
  24. As I mentioned, we’re using the Jayway JSONPath implementation, and you can find more info at the URL shown here. It executes queries (of a sort) against JSON documents, and It offers a simple model for creating a user interface for non-technical users Bonus: since it’s Javascript at it’s core, there are pure javascript implementations that we’ve used to build tooling to validate the queries in the web browser before they’re submitted to the stream processing jobs.
  25. To put some meat on JSONPath, here’s an example JSON document we’ve borrowed from the Jayway docs, and out to the right are three JSONPath query examples. In JSONPath the dollar sign indicates the root node of the document tree, and from there the queries walk down the tree structure using dot notation. As you can see in the third example it supports selection of a specific array index, which offers just a hint that JSONPath supports some non-trivial queries. The language supports a fairly robust set of WHERE-style conditional clauses, as well as a subset of standard Javascript operations.
  26. Here’s an example of one of the UIs skins we’ve built around JSONPath queries. If you look at the highlighted conditions section, each line there translates to an individual JSONPath statement, and then each of those are all combined into a compound query. The output of the UI sends the alert as a control event to a Kafka topic dedicated to control messages that all of our jobs consume from.
  27. The control topic is a Kafka topic that’s a standard Data Source used in almost all of our Flink jobs Most of our Flink Functions are actually CoFlatMap, with the flatMap1 method dedicated to control messages, and flatMap2 dedicated to the main event stream Control streams are one of our key enablers--we use it to dynamically update the behaviors of our Flink jobs in many ways: We do use it for sending dynamic queries and/or updating alert configurations, but we also use it for... Resetting state prior to state rebuilding operations Coordinating behaviors across multiple Flink jobs or that require coordinating multiple data sources Modifying logging + monitoring behaviors We do use both global and key-specific control messages in production...but in the demo we’re going to stick to only global control messages.
  28. Since our production jobs would overwhelm our time budget, here’s the simplified version David’s going to walk you through. There are two Kafka data sources: one for the main event stream and one for the control events, which is where the queries are sent. The Filtering Function is responsible for both storing the queries and for preliminarily matching incoming events to queries that might apply to them. The Qualifier Function is responsible for executing the pre-matched queries against each event. And finally the events that match a query are collected to the “Unnamed” data sink. There is one more critical high-level architectural consideration, but we’ll let David speak to that after he’s walked you through the code a bit. David...
  29. CustomerEvent: comes from events kafka topic and contains customer id and json payload ControlEvent: event that comes in from control kafka - note: customerId, alertId, jsonPath and later bootstrapCustomerId
  30. eventStream: Returns Option[CustomerEvent], removes undefined (None) events, gets event from Some(event), keys by the customer id
  31. controlStream: listens to control topic and splits the stream based on global alerts vs single company alerts globalControlStream: broadcast global alerts so all task managers will have those configs specificControlStream: keyed stream based on customerId
  32. ControlEvent: event that comes in from control kafka - note: customerId, alertId, jsonPath and later bootstrapCustomerId controlStream: listens to control topic and splits the stream based on global alerts vs single company alerts globalControlStream: broadcast global alerts so all task managers will have those configs specificControlStream: keyed stream based on customerId
  33. filteredStream unions the specific and global control stream and connects the event stream
  34. FilteredFunction takes in the connect control and event streams flatMap1: takes control stream and tracks the list of configurations - no output flatmap2: takes the event stream, filters for any global or cusomter specific configs based on event customerId, outputs a FilteredEvent(the event and any matching configs)
  35. Qualifier function takes in an event and all potentially matching controls Evaluates the event against each matching control’s json path JsonPath.parse should be moved out of the foreach for production - just easier to read this way
  36. Counts the number of times a message matching that customer and alertid flow through
  37. Connect the stream -> filter -> qualifier -> counter
  38. Shows the dag for the system from earlier with support for bootstrap requests
  39. Updated counter function outputs a request to bootstrap on the first time this customer-alert is hit Flatmap only shown
  40. Takes in a bootstrap request control message As an example reads from a text file for “historical” events - would normally be an API, database or replay on kafka topic Output each event which matches the customerId with the configuration to qualify
  41. bootstrapStream: the stream of control event bootstrap requests bootStrapSink: sink out of counter to request bootstrap kafka topic Union of bootstrap and filterfunction streams
  42. Ingest takes in a configurable list of topics and saves them keyed by customer and provider Replay accepts a query on a kafka topic and replays the requested data to the requested topic
  43. Reminder to repeat questions, only have one mic