SlideShare a Scribd company logo
1 of 25
Download to read offline
Data Modeling Examples
Matthew F. Dennis // @mdennis
Overview
●   general guiding goals for Cassandra data
    models

●   Interesting and/or common examples/questions
    to get us started

●   Should be plenty of time at the end for
    questions, so bring them up if you have them !
Data Modeling Goals
●   Keep data queried together on disk together
●   In a more general sense think about the
    efficiency of querying your data and work
    backward from there to a model in Cassandra
●   Usually, you shouldn't try to normalize your data
    (contrary to many use cases in relational
    databases)
●   Usually better to keep a record that something
    happened as opposed to changing a value (not
    always the best approach though)
Time Series Data
●   Easily the most common use of Cassandra
    ●   Financial tick data
    ●   Click streams
    ●   Sensor data
    ●   Performance metrics
    ●   GPS data
    ●   Event logs
    ●   etc, etc, etc ...
●   All of the above are essentially the same as far as
    C* is concerned
Time Series Thought Model
●   Things happen in some timestamp ordered
    stream and consist of values associated with
    the given timestamp (i.e. “data points”)
       –   Every 30 seconds record location, speed, heading and
           engine temp
       –   Every 5 minutes record CPU, IO and Memory usage
●   We are interested in recreating, aggregating
    and/or analyzing arbitrary time slices of the
    stream
       –   Where was agent:007 and what was he doing between
           11:21am and 2:38pm yesterday?
       –   What are the last N actions foo did on my site?
Data Points Defined
●   Each data point has 1-N values

●   Each data point corresponds to a specific point
    in time or an interval/bucket (e.g. 5 th minute of
    17th hour on some date)
Data Points Mapped to Cassandra
●   Row Key is id of the data point stream bucketed by time
       –   e.g. plane01:jan_2011 or plane01:jan_01_2011 for month or day buckets
           respectively


●   Column Name is TimeUUID(timestamp of date point)

●   Column Value is serialized data point
       –   JSON, XML, pickle, msgpack, thrift, protobuf, avro, BSON, WTFe


●   Bucketing
       –   Avoids always requiring multiple seeks when only small slices of the stream are
           requested (e.g. stream is 5 years old but I'm on only interested in Jan 5 th 3 years
           ago and/or yesterday between 2pm and 3pm).
       –   Make it easy to lazily aggregate old stream activity
       –   Reduces compaction overhead since old rows will never have to be merged again
           (until you “back fill” and/or delete something)
A Slightly More Concrete Example
●   Sensor data from airplanes

●   Every 30 seconds each plane sends
    latitude+longitude, altitude and wine remaining
    in mdennis' glass.
The Visual
                   plane5:jan_2011

                  TimeUUID0      TimeUUID1         TimeUUID2

    p5:j11       28.90, 124.30
                   45K feet
                                 28.85, 124.25
                                   44K feet
                                                   28.81, 124.22
                                                     44K feet
                     70%             50%               95%

                                                 Middle of the ocean and half
                                                  a glass of wine at 44K feet

●   Row Key is the id of stream being recorded (e.g.
    plane5:jan_2011)
●   Column Name is timestamp (or TimeUUID) associated with
    the data point
●   Column Value is the value of the event (e.g. protobuf
    serialized lat/long+alt+wine_level)
Querying
●   When querying, construct TimeUUIDs for
    the min/max of the time range in question
    and use them as the start/end in your
    get_slice call

●   Or use a empty start and/or end along with
    a count
Bucket Sizes?
●   Depends greatly on
    ●   Average size of time slice queried
    ●   Average data point size
    ●   Write rate of data points to a stream
    ●   IO capacity of the nodes
So... Bucket Sizes?
●   No Bigger than a few GB per row
    ●   bucket_size * write_rate * sizeof(avg_data_point)
●   Bucket size >= average size of time slice queried
●   No more than maybe 10M entries per row
●   No more than a month if you have lots of different
    streams
●   NB: there are exceptions to all of the above, which
    are really nothing more than guidelines
Ordering
●   In cases where the most recent data is the
    most interesting (e.g. last N events for entity foo
    or last hour of events for entity bar), you can
    reverse the comparator (i.e. sort descending
    instead of ascending)
    ●   http://thelastpickle.com/2011/10/03/Reverse-Comparators/
    ●   https://issues.apache.org/jira/browse/CASSANDRA-2355
Spanning Buckets
●   If your time slice spans buckets, you'll need to
    construct all the row keys in question (i.e. number of
    unique row keys = spans+1)
●   If you want all the results between the dates, pass
    all the row keys to multiget_slice with the start and
    end of the desired time slice
●   If you only want the first N results within your time
    slice, lowest latency comes from multiget_slice as
    above but best efficiency comes from serially paging
    one row key at a time until your desired count is
    reached
Expiring Streams
                (e.g. “I only care about the past year”)

●   Just set the TTL to the age you want to keep
●   yeah, that's pretty much it ...
Counters
●   Sometimes you're only interested in counting
    things that happened within some time slice
●   Minor adaptation to the previous content to use
    counters (be aware they are not idempotent)
    ●   Column names become buckets
    ●   Values become counters
Example: Counting User Logins
                     user3:system5:logins:by_day

                                     20110107          ...          20110523
            U3:S5:L:D
                                        2              ...               7

    2 logins on Jan 7th 2011           7 logins on May 23rd 2011
    for user 3 on system 5               for user 3 on system 5


                    user3:system5:logins:by_hour

                                    2011010710         ...         2011052316
            U3:S5:L:H
                                        1              ...               7

one login for user 3 on system 5     2 logins for user 3 on system 5
on Jan 7th 2011 for the 10th hour   on May 23rd 2011 for the 16th hour
Eventually Atomic
●   In a legacy RDBMS atomicity is “easy”
●   Attempting full ACID compliance in distributed systems is a
    bad idea (and actually impossible in the strictest sense)
●   However, consistency is important and can certainly be
    achieved in C*
●   Many approaches / alternatives
●   I like a transaction log approach, especially in the context
    of C*
Transaction Logs
                   (in this context)
●   Records what is going to be performed before it
    is actually performed
●   Performs the actions that need to be atomic (in
    the indivisible sense, not the all at once sense
    which is usually what people mean when they
    say isolation)
●   Marks that the actions were performed
In Cassandra
●   Serialize all actions that need to be performed
    in a single column – JSON, XML, YAML (yuck!),
    pickle, JSO, msgpack, protobuf, et cetera
    ●   Row Key = randomly chosen C* node token
    ●   Column Name = TimeUUID(nowish)
●   Perform actions
●   Delete Column
Configuration Details
●   Short gc_grace_seconds on the XACT_LOG
    Column Family (e.g. 5 minutes)
●   Write to XACT_LOG at CL.QUORUM or
    CL.LOCAL_QUORUM for durability
    ●   if it fails with an unavailable exception, pick a
        different node token and/or node and try again
        (gives same semantics as a relational DB in terms
        of knowing the state of your transaction)
Failures
●   Before insert into the XACT_LOG
●   After insert, before actions
●   After insert, in middle of actions
●   After insert, after actions, before delete
●   After insert, after actions, after delete
Recovery
●   Each C* has a crond job offset from every other
    by some time period
●   Each job runs the same code: multiget_slice for
    all node tokens for all columns older than some
    time period (the “recovery period”)
●   Any columns need to be replayed in their
    entirety and are deleted after replay (normally
    there are no columns because normally things
    are working)
XACT_LOG Comments
●   Idempotent writes are awesome (that's why this
    works so well)
●   Doesn't work so well for counters (they're not
    idempotent)
●   Clients must be able to deal with temporarily
    inconsistent data (they have to do this anyway)
Q?
Cassandra Data Modeling Examples
  Matthew F. Dennis // @mdennis

More Related Content

What's hot

Tuning Speculative Retries to Fight Latency (Michael Figuiere, Minh Do, Netfl...
Tuning Speculative Retries to Fight Latency (Michael Figuiere, Minh Do, Netfl...Tuning Speculative Retries to Fight Latency (Michael Figuiere, Minh Do, Netfl...
Tuning Speculative Retries to Fight Latency (Michael Figuiere, Minh Do, Netfl...
DataStax
 
How does PostgreSQL work with disks: a DBA's checklist in detail. PGConf.US 2015
How does PostgreSQL work with disks: a DBA's checklist in detail. PGConf.US 2015How does PostgreSQL work with disks: a DBA's checklist in detail. PGConf.US 2015
How does PostgreSQL work with disks: a DBA's checklist in detail. PGConf.US 2015
PostgreSQL-Consulting
 

What's hot (20)

Reactive programming with examples
Reactive programming with examplesReactive programming with examples
Reactive programming with examples
 
Stateful streaming data pipelines
Stateful streaming data pipelinesStateful streaming data pipelines
Stateful streaming data pipelines
 
Tuning Speculative Retries to Fight Latency (Michael Figuiere, Minh Do, Netfl...
Tuning Speculative Retries to Fight Latency (Michael Figuiere, Minh Do, Netfl...Tuning Speculative Retries to Fight Latency (Michael Figuiere, Minh Do, Netfl...
Tuning Speculative Retries to Fight Latency (Michael Figuiere, Minh Do, Netfl...
 
How does PostgreSQL work with disks: a DBA's checklist in detail. PGConf.US 2015
How does PostgreSQL work with disks: a DBA's checklist in detail. PGConf.US 2015How does PostgreSQL work with disks: a DBA's checklist in detail. PGConf.US 2015
How does PostgreSQL work with disks: a DBA's checklist in detail. PGConf.US 2015
 
Flink Forward Berlin 2017: Tzu-Li (Gordon) Tai - Managing State in Apache Flink
Flink Forward Berlin 2017: Tzu-Li (Gordon) Tai - Managing State in Apache FlinkFlink Forward Berlin 2017: Tzu-Li (Gordon) Tai - Managing State in Apache Flink
Flink Forward Berlin 2017: Tzu-Li (Gordon) Tai - Managing State in Apache Flink
 
OpenTSDB 2.0
OpenTSDB 2.0OpenTSDB 2.0
OpenTSDB 2.0
 
Cassandra multi-datacenter operations essentials
Cassandra multi-datacenter operations essentialsCassandra multi-datacenter operations essentials
Cassandra multi-datacenter operations essentials
 
Autovacuum, explained for engineers, new improved version PGConf.eu 2015 Vienna
Autovacuum, explained for engineers, new improved version PGConf.eu 2015 ViennaAutovacuum, explained for engineers, new improved version PGConf.eu 2015 Vienna
Autovacuum, explained for engineers, new improved version PGConf.eu 2015 Vienna
 
Introduction to Cassandra
Introduction to CassandraIntroduction to Cassandra
Introduction to Cassandra
 
How Scylla Make Adding and Removing Nodes Faster and Safer
How Scylla Make Adding and Removing Nodes Faster and SaferHow Scylla Make Adding and Removing Nodes Faster and Safer
How Scylla Make Adding and Removing Nodes Faster and Safer
 
Introduction to Cassandra: Replication and Consistency
Introduction to Cassandra: Replication and ConsistencyIntroduction to Cassandra: Replication and Consistency
Introduction to Cassandra: Replication and Consistency
 
Discretized Stream - Fault-Tolerant Streaming Computation at Scale - SOSP
Discretized Stream - Fault-Tolerant Streaming Computation at Scale - SOSPDiscretized Stream - Fault-Tolerant Streaming Computation at Scale - SOSP
Discretized Stream - Fault-Tolerant Streaming Computation at Scale - SOSP
 
Michael Häusler – Everyday flink
Michael Häusler – Everyday flinkMichael Häusler – Everyday flink
Michael Häusler – Everyday flink
 
Riak add presentation
Riak add presentationRiak add presentation
Riak add presentation
 
Enter the Snake Pit for Fast and Easy Spark
Enter the Snake Pit for Fast and Easy SparkEnter the Snake Pit for Fast and Easy Spark
Enter the Snake Pit for Fast and Easy Spark
 
Cassandra Day Atlanta 2015: Introduction to Apache Cassandra & DataStax Enter...
Cassandra Day Atlanta 2015: Introduction to Apache Cassandra & DataStax Enter...Cassandra Day Atlanta 2015: Introduction to Apache Cassandra & DataStax Enter...
Cassandra Day Atlanta 2015: Introduction to Apache Cassandra & DataStax Enter...
 
Deep dive into PostgreSQL statistics.
Deep dive into PostgreSQL statistics.Deep dive into PostgreSQL statistics.
Deep dive into PostgreSQL statistics.
 
Bucket Your Partitions Wisely (Markus Höfer, codecentric AG) | Cassandra Summ...
Bucket Your Partitions Wisely (Markus Höfer, codecentric AG) | Cassandra Summ...Bucket Your Partitions Wisely (Markus Höfer, codecentric AG) | Cassandra Summ...
Bucket Your Partitions Wisely (Markus Höfer, codecentric AG) | Cassandra Summ...
 
Nine Circles of Inferno or Explaining the PostgreSQL Vacuum
Nine Circles of Inferno or Explaining the PostgreSQL VacuumNine Circles of Inferno or Explaining the PostgreSQL Vacuum
Nine Circles of Inferno or Explaining the PostgreSQL Vacuum
 
Update on OpenTSDB and AsyncHBase
Update on OpenTSDB and AsyncHBase Update on OpenTSDB and AsyncHBase
Update on OpenTSDB and AsyncHBase
 

Viewers also liked

6 Data Modeling for NoSQL 2/2
6 Data Modeling for NoSQL 2/26 Data Modeling for NoSQL 2/2
6 Data Modeling for NoSQL 2/2
Fabio Fumarola
 
5 Data Modeling for NoSQL 1/2
5 Data Modeling for NoSQL 1/25 Data Modeling for NoSQL 1/2
5 Data Modeling for NoSQL 1/2
Fabio Fumarola
 

Viewers also liked (20)

Cassandra Data Model
Cassandra Data ModelCassandra Data Model
Cassandra Data Model
 
DZone Cassandra Data Modeling Webinar
DZone Cassandra Data Modeling WebinarDZone Cassandra Data Modeling Webinar
DZone Cassandra Data Modeling Webinar
 
Cassandra Anti-Patterns
Cassandra Anti-PatternsCassandra Anti-Patterns
Cassandra Anti-Patterns
 
Cassandra, Modeling and Availability at AMUG
Cassandra, Modeling and Availability at AMUGCassandra, Modeling and Availability at AMUG
Cassandra, Modeling and Availability at AMUG
 
BigData as a Platform: Cassandra and Current Trends
BigData as a Platform: Cassandra and Current TrendsBigData as a Platform: Cassandra and Current Trends
BigData as a Platform: Cassandra and Current Trends
 
The Future Of Big Data
The Future Of Big DataThe Future Of Big Data
The Future Of Big Data
 
strangeloop 2012 apache cassandra anti patterns
strangeloop 2012 apache cassandra anti patternsstrangeloop 2012 apache cassandra anti patterns
strangeloop 2012 apache cassandra anti patterns
 
Cassandra concepts, patterns and anti-patterns
Cassandra concepts, patterns and anti-patternsCassandra concepts, patterns and anti-patterns
Cassandra concepts, patterns and anti-patterns
 
Cassandra On EC2
Cassandra On EC2Cassandra On EC2
Cassandra On EC2
 
Planning to Fail #phpuk13
Planning to Fail #phpuk13Planning to Fail #phpuk13
Planning to Fail #phpuk13
 
Planning to Fail #phpne13
Planning to Fail #phpne13Planning to Fail #phpne13
Planning to Fail #phpne13
 
Cabs, Cassandra, and Hailo (at Cassandra EU)
Cabs, Cassandra, and Hailo (at Cassandra EU)Cabs, Cassandra, and Hailo (at Cassandra EU)
Cabs, Cassandra, and Hailo (at Cassandra EU)
 
Cassandra nice use cases and worst anti patterns
Cassandra nice use cases and worst anti patternsCassandra nice use cases and worst anti patterns
Cassandra nice use cases and worst anti patterns
 
Cassandra's Sweet Spot - an introduction to Apache Cassandra
Cassandra's Sweet Spot - an introduction to Apache CassandraCassandra's Sweet Spot - an introduction to Apache Cassandra
Cassandra's Sweet Spot - an introduction to Apache Cassandra
 
Cabs, Cassandra, and Hailo
Cabs, Cassandra, and HailoCabs, Cassandra, and Hailo
Cabs, Cassandra, and Hailo
 
Data Modeling for NoSQL
Data Modeling for NoSQLData Modeling for NoSQL
Data Modeling for NoSQL
 
Learning Cassandra
Learning CassandraLearning Cassandra
Learning Cassandra
 
6 Data Modeling for NoSQL 2/2
6 Data Modeling for NoSQL 2/26 Data Modeling for NoSQL 2/2
6 Data Modeling for NoSQL 2/2
 
5 Data Modeling for NoSQL 1/2
5 Data Modeling for NoSQL 1/25 Data Modeling for NoSQL 1/2
5 Data Modeling for NoSQL 1/2
 
Cassandra By Example: Data Modelling with CQL3
Cassandra By Example: Data Modelling with CQL3Cassandra By Example: Data Modelling with CQL3
Cassandra By Example: Data Modelling with CQL3
 

Similar to Cassandra NYC 2011 Data Modeling

Keynote: Building and Operating A Serverless Streaming Runtime for Apache Bea...
Keynote: Building and Operating A Serverless Streaming Runtime for Apache Bea...Keynote: Building and Operating A Serverless Streaming Runtime for Apache Bea...
Keynote: Building and Operating A Serverless Streaming Runtime for Apache Bea...
Flink Forward
 
Scala like distributed collections - dumping time-series data with apache spark
Scala like distributed collections - dumping time-series data with apache sparkScala like distributed collections - dumping time-series data with apache spark
Scala like distributed collections - dumping time-series data with apache spark
Demi Ben-Ari
 

Similar to Cassandra NYC 2011 Data Modeling (20)

Understanding time in structured streaming
Understanding time in structured streamingUnderstanding time in structured streaming
Understanding time in structured streaming
 
A Brief History of Stream Processing
A Brief History of Stream ProcessingA Brief History of Stream Processing
A Brief History of Stream Processing
 
Big Data Day LA 2016/ Big Data Track - Portable Stream and Batch Processing w...
Big Data Day LA 2016/ Big Data Track - Portable Stream and Batch Processing w...Big Data Day LA 2016/ Big Data Track - Portable Stream and Batch Processing w...
Big Data Day LA 2016/ Big Data Track - Portable Stream and Batch Processing w...
 
Introduction to redis - version 2
Introduction to redis - version 2Introduction to redis - version 2
Introduction to redis - version 2
 
Keynote: Building and Operating A Serverless Streaming Runtime for Apache Bea...
Keynote: Building and Operating A Serverless Streaming Runtime for Apache Bea...Keynote: Building and Operating A Serverless Streaming Runtime for Apache Bea...
Keynote: Building and Operating A Serverless Streaming Runtime for Apache Bea...
 
Flink Forward SF 2017: Kenneth Knowles - Back to Sessions overview
Flink Forward SF 2017: Kenneth Knowles - Back to Sessions overviewFlink Forward SF 2017: Kenneth Knowles - Back to Sessions overview
Flink Forward SF 2017: Kenneth Knowles - Back to Sessions overview
 
Concurrency, Parallelism And IO
Concurrency,  Parallelism And IOConcurrency,  Parallelism And IO
Concurrency, Parallelism And IO
 
OSMC 2018 | Learnings, patterns and Uber’s metrics platform M3, open sourced ...
OSMC 2018 | Learnings, patterns and Uber’s metrics platform M3, open sourced ...OSMC 2018 | Learnings, patterns and Uber’s metrics platform M3, open sourced ...
OSMC 2018 | Learnings, patterns and Uber’s metrics platform M3, open sourced ...
 
Realtime
RealtimeRealtime
Realtime
 
Advanced memory allocation
Advanced memory allocationAdvanced memory allocation
Advanced memory allocation
 
Job Queues Overview
Job Queues OverviewJob Queues Overview
Job Queues Overview
 
Data all over the place! How SQL and Apache Calcite bring sanity to streaming...
Data all over the place! How SQL and Apache Calcite bring sanity to streaming...Data all over the place! How SQL and Apache Calcite bring sanity to streaming...
Data all over the place! How SQL and Apache Calcite bring sanity to streaming...
 
Ledingkart Meetup #2: Scaling Search @Lendingkart
Ledingkart Meetup #2: Scaling Search @LendingkartLedingkart Meetup #2: Scaling Search @Lendingkart
Ledingkart Meetup #2: Scaling Search @Lendingkart
 
Analyzing and Interpreting AWR
Analyzing and Interpreting AWRAnalyzing and Interpreting AWR
Analyzing and Interpreting AWR
 
Dconf2015 d2 t4
Dconf2015 d2 t4Dconf2015 d2 t4
Dconf2015 d2 t4
 
Building a Unified Logging Layer with Fluentd, Elasticsearch and Kibana
Building a Unified Logging Layer with Fluentd, Elasticsearch and KibanaBuilding a Unified Logging Layer with Fluentd, Elasticsearch and Kibana
Building a Unified Logging Layer with Fluentd, Elasticsearch and Kibana
 
Log Event Stream Processing In Flink Way
Log Event Stream Processing In Flink WayLog Event Stream Processing In Flink Way
Log Event Stream Processing In Flink Way
 
Everything We Learned About In-Memory Data Layout While Building VoltDB
Everything We Learned About In-Memory Data Layout While Building VoltDBEverything We Learned About In-Memory Data Layout While Building VoltDB
Everything We Learned About In-Memory Data Layout While Building VoltDB
 
Scala like distributed collections - dumping time-series data with apache spark
Scala like distributed collections - dumping time-series data with apache sparkScala like distributed collections - dumping time-series data with apache spark
Scala like distributed collections - dumping time-series data with apache spark
 
Data Warehousing 101(and a video)
Data Warehousing 101(and a video)Data Warehousing 101(and a video)
Data Warehousing 101(and a video)
 

Recently uploaded

Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
Joaquim Jorge
 

Recently uploaded (20)

Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
 
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live StreamsTop 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
HTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation StrategiesHTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation Strategies
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 

Cassandra NYC 2011 Data Modeling

  • 1. Data Modeling Examples Matthew F. Dennis // @mdennis
  • 2. Overview ● general guiding goals for Cassandra data models ● Interesting and/or common examples/questions to get us started ● Should be plenty of time at the end for questions, so bring them up if you have them !
  • 3. Data Modeling Goals ● Keep data queried together on disk together ● In a more general sense think about the efficiency of querying your data and work backward from there to a model in Cassandra ● Usually, you shouldn't try to normalize your data (contrary to many use cases in relational databases) ● Usually better to keep a record that something happened as opposed to changing a value (not always the best approach though)
  • 4. Time Series Data ● Easily the most common use of Cassandra ● Financial tick data ● Click streams ● Sensor data ● Performance metrics ● GPS data ● Event logs ● etc, etc, etc ... ● All of the above are essentially the same as far as C* is concerned
  • 5. Time Series Thought Model ● Things happen in some timestamp ordered stream and consist of values associated with the given timestamp (i.e. “data points”) – Every 30 seconds record location, speed, heading and engine temp – Every 5 minutes record CPU, IO and Memory usage ● We are interested in recreating, aggregating and/or analyzing arbitrary time slices of the stream – Where was agent:007 and what was he doing between 11:21am and 2:38pm yesterday? – What are the last N actions foo did on my site?
  • 6. Data Points Defined ● Each data point has 1-N values ● Each data point corresponds to a specific point in time or an interval/bucket (e.g. 5 th minute of 17th hour on some date)
  • 7. Data Points Mapped to Cassandra ● Row Key is id of the data point stream bucketed by time – e.g. plane01:jan_2011 or plane01:jan_01_2011 for month or day buckets respectively ● Column Name is TimeUUID(timestamp of date point) ● Column Value is serialized data point – JSON, XML, pickle, msgpack, thrift, protobuf, avro, BSON, WTFe ● Bucketing – Avoids always requiring multiple seeks when only small slices of the stream are requested (e.g. stream is 5 years old but I'm on only interested in Jan 5 th 3 years ago and/or yesterday between 2pm and 3pm). – Make it easy to lazily aggregate old stream activity – Reduces compaction overhead since old rows will never have to be merged again (until you “back fill” and/or delete something)
  • 8. A Slightly More Concrete Example ● Sensor data from airplanes ● Every 30 seconds each plane sends latitude+longitude, altitude and wine remaining in mdennis' glass.
  • 9. The Visual plane5:jan_2011 TimeUUID0 TimeUUID1 TimeUUID2 p5:j11 28.90, 124.30 45K feet 28.85, 124.25 44K feet 28.81, 124.22 44K feet 70% 50% 95% Middle of the ocean and half a glass of wine at 44K feet ● Row Key is the id of stream being recorded (e.g. plane5:jan_2011) ● Column Name is timestamp (or TimeUUID) associated with the data point ● Column Value is the value of the event (e.g. protobuf serialized lat/long+alt+wine_level)
  • 10. Querying ● When querying, construct TimeUUIDs for the min/max of the time range in question and use them as the start/end in your get_slice call ● Or use a empty start and/or end along with a count
  • 11. Bucket Sizes? ● Depends greatly on ● Average size of time slice queried ● Average data point size ● Write rate of data points to a stream ● IO capacity of the nodes
  • 12. So... Bucket Sizes? ● No Bigger than a few GB per row ● bucket_size * write_rate * sizeof(avg_data_point) ● Bucket size >= average size of time slice queried ● No more than maybe 10M entries per row ● No more than a month if you have lots of different streams ● NB: there are exceptions to all of the above, which are really nothing more than guidelines
  • 13. Ordering ● In cases where the most recent data is the most interesting (e.g. last N events for entity foo or last hour of events for entity bar), you can reverse the comparator (i.e. sort descending instead of ascending) ● http://thelastpickle.com/2011/10/03/Reverse-Comparators/ ● https://issues.apache.org/jira/browse/CASSANDRA-2355
  • 14. Spanning Buckets ● If your time slice spans buckets, you'll need to construct all the row keys in question (i.e. number of unique row keys = spans+1) ● If you want all the results between the dates, pass all the row keys to multiget_slice with the start and end of the desired time slice ● If you only want the first N results within your time slice, lowest latency comes from multiget_slice as above but best efficiency comes from serially paging one row key at a time until your desired count is reached
  • 15. Expiring Streams (e.g. “I only care about the past year”) ● Just set the TTL to the age you want to keep ● yeah, that's pretty much it ...
  • 16. Counters ● Sometimes you're only interested in counting things that happened within some time slice ● Minor adaptation to the previous content to use counters (be aware they are not idempotent) ● Column names become buckets ● Values become counters
  • 17. Example: Counting User Logins user3:system5:logins:by_day 20110107 ... 20110523 U3:S5:L:D 2 ... 7 2 logins on Jan 7th 2011 7 logins on May 23rd 2011 for user 3 on system 5 for user 3 on system 5 user3:system5:logins:by_hour 2011010710 ... 2011052316 U3:S5:L:H 1 ... 7 one login for user 3 on system 5 2 logins for user 3 on system 5 on Jan 7th 2011 for the 10th hour on May 23rd 2011 for the 16th hour
  • 18. Eventually Atomic ● In a legacy RDBMS atomicity is “easy” ● Attempting full ACID compliance in distributed systems is a bad idea (and actually impossible in the strictest sense) ● However, consistency is important and can certainly be achieved in C* ● Many approaches / alternatives ● I like a transaction log approach, especially in the context of C*
  • 19. Transaction Logs (in this context) ● Records what is going to be performed before it is actually performed ● Performs the actions that need to be atomic (in the indivisible sense, not the all at once sense which is usually what people mean when they say isolation) ● Marks that the actions were performed
  • 20. In Cassandra ● Serialize all actions that need to be performed in a single column – JSON, XML, YAML (yuck!), pickle, JSO, msgpack, protobuf, et cetera ● Row Key = randomly chosen C* node token ● Column Name = TimeUUID(nowish) ● Perform actions ● Delete Column
  • 21. Configuration Details ● Short gc_grace_seconds on the XACT_LOG Column Family (e.g. 5 minutes) ● Write to XACT_LOG at CL.QUORUM or CL.LOCAL_QUORUM for durability ● if it fails with an unavailable exception, pick a different node token and/or node and try again (gives same semantics as a relational DB in terms of knowing the state of your transaction)
  • 22. Failures ● Before insert into the XACT_LOG ● After insert, before actions ● After insert, in middle of actions ● After insert, after actions, before delete ● After insert, after actions, after delete
  • 23. Recovery ● Each C* has a crond job offset from every other by some time period ● Each job runs the same code: multiget_slice for all node tokens for all columns older than some time period (the “recovery period”) ● Any columns need to be replayed in their entirety and are deleted after replay (normally there are no columns because normally things are working)
  • 24. XACT_LOG Comments ● Idempotent writes are awesome (that's why this works so well) ● Doesn't work so well for counters (they're not idempotent) ● Clients must be able to deal with temporarily inconsistent data (they have to do this anyway)
  • 25. Q? Cassandra Data Modeling Examples Matthew F. Dennis // @mdennis