SlideShare a Scribd company logo
Apache Calcite for Enabling SQL
Access to NoSQL Data Systems
such as Apache Geode
Christian Tzolov
2
Christian Tzolov
Engineer at Pivotal,
Big-Data, Hadoop,
Spring Cloud Dataflow,
Apache Geode, Apache HAWQ,
Apache Committer,
Apache Crunch PMC member
ctzolov@pivotal.io
blog.tzolov.net
Twitter: @christzolov
https://nl.linkedin.com/in/tzolov
Whoami
Disclaimer
This talk expresses my personal opinions. It is not read or approved by Pivotal
and does not necessarily reflect the views and opinions of Pivotal nor does it
constitute any official communication of Pivotal.
Pivotal does not support any of the code shared here.
3
Big Data Landscape 2016
•  Volume
•  Velocity
•  Varity
•  Scalability
•  Latency
•  CAP - Consistency vs. Availability
4
•  SQL
•  Custom APIs
–  Key / Value
–  Fluid API
–  REST API
•  {My} Query Language
Unified Access?
At What Cost?
Data Access
5
•  Apache Apex
•  Apache Drill
•  Apache Flink
•  Apache Hive
•  Apache Kylin
•  Apache Phoenix
•  Apache Samza
•  Apache Storm
•  Cascading
•  Qubole Quark
•  SQL-Gremlin
…
SQL?
•  Apache Geode
Calcite Geode Adapter - Overview
Geode API and OQL
SQL/JDBC/ODBC
Convert SQL relational
expressions into OQL queriesGeode Adapter
(Geode Client)
Geode ServerGeode ServerGeode Server
Data Data Data
Push down the relational
expressions supported by Geode
OQL and falls back to the Calcite
Enumerable Adapter for the rest
Enumerable
Adapter
Apache Calcite
Spring Data
Geode
Spring Data API for
interacting with Geode
Parse SQL, converts into
relational expression and
optimizes
Relational Expressions and Optimization
7
Scan Scan
Join
Filter
Project
Customer (c) BookOrder (b)
on customerNumber
b.totalPrice > 0
c.firstName, b.totalPrice
SELECT b."totalPrice", c."firstName” FROM "BookOrder" as b
INNER JOIN "Customer" as c ON b."customerNumber" = c."customerNumber”
WHERE b."totalPrice" > 0;
Scan Scan
Join
Project
Customer (c) BookOrder (b)
on customerNumber
totalPrice > 0
c.firstName, b.totalPrice
Project
firstName,
customerNumber
Filter
totalPrice,
customerNumberProject
Optimiz
Push Down Candidates
8
Relational Operator Geode Support
LIMIT Supported without FETCH
PROJECTION Supported
FILTER Supported
JOIN Only for collocated data
AGGREGATE Only for MAX, MIN, SUM, AVG
SORT Requires DISTINCT statement
Implemented
Apache Geode?
“… in-memory, distributed database
with strong consistency built to
support low latency transactional
applications at extreme scale”
Why Apache Geode?
10
5,700 train stations
4.5 million tickets per day
20 million daily users
1.4 billion page views per day
40,000 visits per second
7,000 stations
72,000 miles of track
23 million passengers daily
120,000 concurrent users
10,000 transactions per minute
https://pivotal.io/big-data/case-study/distributed-in-memory-data-management-solution
https://pivotal.io/big-data/case-study/scaling-online-sales-for-the-largest-railway-in-the-world-china-railway-corporation
China Railway
11
•  In-Memory Data Storage
–  > 100TB memory
–  JVM Heap + Off Heap
•  Any Data Format
–  Key-Value/Object Store
•  ACID Compliant Transactions
•  HA and Linear Scalability
•  Strong Consistency
•  Streaming and Event Processing
–  Listeners
–  Distributed Functions
–  Continuous OQL Queries
•  Multi-site / Inter-cluster
•  Embedded and Standalone
•  Top Level Apache Project
Apache Geode Features
Apache Geode Concepts
Cache Server (member)
Cache
Region 1
Region N
ValKe
y
v1k1
v2k2
…
Cache - In-memory collection
of Regions
Region - consistent, distributed
Map (key-value),
Partitioned or Replicated
CacheServer – process
connected to the distributed
system with created Cache
Client (member)Locator (member)
Client –read and modify the
content of the distributed
system
Locator – tracks
system members and
provides membership
information
…
Listeners
Functions
Functions – distributed,
concurrent data
processing
Listener – event handler.
Registers for one or
more events and notified
when they occur
Geode Topologies
Cache ServerCache ServerCache Server
Cache Data Cache Data Cache Data Peer-to-Peer
Cache ServerCache ServerCache Server
Cache Data Cache Data Cache Data
Client
Local Cache
pool
Client-Server
Cache Server
Cache Server
Gateway Sender
…
Cache Server
Gateway Receiver
Cache ServerCache Server
Cache Data Cache Data Cache Data Cache Data
Gateway Receiver
Cache Server
… Gateway Sender
Cache ServerCache Server
Cache Data Cache Data Cache Data Cache Data
WAN Multi-site Boundary Multi-Site
Geode Client API
•  Client Cache
•  Key / Value - Region GET, PUT, REMOVE
•  OQL – QueryService
Geode Data Types & Serialization
•  Key-Value with complex value formats
•  Portable Data eXchange (PDX) Serialization – Delta propagation, schema
evolution, polyglot support …
•  Object Query Language (OQL)
SELECT p.name
FROM /Person p
WHERE p.pet.type = “dino”
{
id: 1,
name: “Fred”,
age: 42,
pet: {
name: “Barney”,
type: “dino”
}
}
single field deserialization
nested fields
Geode Demo (GFSH and OQL)
•  Connect to Geode cluster,
•  List available Regions
•  Run OQL query
Apache Calcite?
Java framework that allows SQL interface and advanced query
optimization, for virtually any data system
•  Query Parser, Validator and Optimizer(s)
•  Local/Remote JDBC drivers
•  Streaming
•  Agnostic to how data is stored and process
•  Balance SQL completes vs. integrity of Data system native capabilities
Apache Calcite Data Types
•  Catalog – namespaces accessed in queries
•  Schema - collection of schemas and tables
•  Table - single data set, collection of rows
•  RelDataType – SQL fields types in a Table
Your Data System
Data System Data Types
Calcite
Schema
SQL Engine
Table Table
JDBC
Table…
Data Type
Mapping SELECT title, author FROM test.BookMaster
Data Type Fields Schema Table
Calcite Data Types: RelDataType
19
Type of a scalar expression or row
•  RelDataTypeFactory – RelDataType factory
•  JavaTypeFactory - registers Java classes as record types
•  JavaTypeFactoryImpl - Java Reflection to build RelDataTypes
•  SqlTypeFactoryImpl - Default implementation with all SQL types
Geode to Calcite Data Types Mapping
20
Geode Cache
Region 1
Region K
ValKey
v1k1
v2k2
…
Calcite Schema
Table 1
Table K
Col1 Col2 ColN
V(M,1)RowM V(M,2) V(M,N)
V(2,1)Row2 V(2,2) V(2,N)
V(1,1)Row1 V(1,2) V(1,N)
…
Regions are mapped into Tables
Geode Cache is mapped into Calcite Schema
Geode Key/Value is mapped
into Table Row
Create Column Types
(RelDataType) from Geode
Value class
(JavaTypeFactoryImpl)
Calcite Bootstrap Flow
21
Typical calcite initialization flow
Model
(JSON)
SchemaFactory
Schema
Tables
Creates
Creates
Configures Calcite
Creates
Calcite Model
{
version: '1.0',
defaultSchema: 'TEST',
schemas: [ {
name: 'TEST',
type: 'custom',
factory: 'org.apache.calcite.adapter.geode.simple.GeodeSchemaFactory',
operand: {
locatorHost: 'localhost',
locatorPort: '10334',
regions: 'BookMaster',
pdxSerializablePackagePath: 'net.tzolov.geode.bookstore.domain.*'
}
}]
}
Reference to your adapter
schema factory implementation
class
Parameters to be passed to
your adapter schema factory
implementation
The path to <my-model>.json is passed as JDBC connection argument:
!connect jdbc:calcite:model=target/test-classes/<my-model-path>.json︎
Schema Name
Geode Calcite Schema and Schema Factory
public class GeodeSchemaFactory implements SchemaFactory {
public Schema create(SchemaPlus parentSchema, String schemaName, Map<String, Object> operand) {
String locatorHost = (String) operand.get(“locatorHost”);
int locatorPort = …
String[] regionNames = …
String pdxPackagePath = …
return new GeodeSchema(locatorHost, locatorPort, regionNames, pdxPackagePath);
}
}
public class GeodeSchema extends AbstractSchema {
private String regionName = ..
protected Map<String, Table> getTableMap() {
final ImmutableMap.Builder<String, Table> builder = ImmutableMap.builder();
Region region = … Get Geode Region by region name …
Class valueClass= … Find region’s value type …
builder.put(regionName, new GeodeScannableTable(regionName, valueClass, clientCache));
return tableMap;
}
Retrieves the parameters set in
the model.json
Create an Adapter Schema
instance with the provided
parameters.
Create GeodeScannableTable
instance for each Geode Region
Geode Scannable Table
public class GeodeScannableTable extends AbstractTable implements ScannableTable {
public RelDataType getRowType(RelDataTypeFactory typeFactory) {
return new JavaTypeFactoryImpl().createStructType(valueClass);
}
public Enumerable<Object[]> scan(DataContext root) {
return new AbstractEnumerable<Object[]>() {
public Enumerator<Object[]> enumerator() { return new GeodeEnumerator<Object[]>(clientCache, regionName); }
}
public class GeodeEnumerator<E> implements Enumerator<E> {
private E current;
private SelectResults geodeIterator;
public GeodeEnumerator(ClientCache clientCache, String regionName) {
geodeterator = clientCache.getQueryService().newQuery("select * from /" + regionName).execute().iterator();
}
public boolean moveNext() { current = convert(geodeIterator.next()); return true;}
public E current() {return current;}
public abstract E convert(Object geodeValue) {
Convert PDX value into RelDataType row
}
Defined in the Linq4j sub-project
Retrieves the entire Region!!
Converts Geode value response into Calcite row data
Uses reflection (or pdx-instance) to builds
RelDataType from value’s class type
Returns an Enumeration over the entire
target data store
Geode Demo (Scannable Tables)
$ ./sqlline ︎
sqlline> !connect jdbc:calcite:model=target/test-classes/model2.json admin admin︎
︎
jdbc:calcite> !tables ︎
jdbc:calcite> SELECT * FROM "BookMaster”;︎
jdbc:calcite> SELECT "yearPublished", AVG("retailCost") AS “AvgRetailCost” FROM "BookMaster" GROUP BY "yearPublished";︎
jdbc:calcite> SELECT b."totalPrice", c."firstName” FROM "BookOrder" AS b INNER JOIN "Customer" AS c ON b."customerNumber" = c."customerNumber” WHERE b."totalPrice" > 0;︎
︎
︎
Without and With Implementation
Non-Relational Tables
26
Scanned without intermediate relational expression.
•  ScannableTable - can be scanned
•  FilterableTable - can be scanned, applying supplied filter expressions
•  ProjectableFilterableTable - can be scanned, applying supplied filter expressions
and projecting a given list of columns
Enumerable<Object[]> scan(DataContext root, List<RexNode> filters, int[] projects);
Enumerable<Object[]> scan(DataContext root, List<RexNode> filters);
Enumerable<Object[]> scan(DataContext root);
Calcite Ecosystem
27
Several “semi-independent” projects.
JDBC and Avatica Linq4j
Expression
Tree
Enumerable
Adapter
Relational
•  Relational Expressions
•  Row Expression
•  Optimization Rules
•  Planner …
SQL Parser & AST
Port of LINQ (Language-Integrated Query)
to Java.
Local and Remote
JDBC driver
Converts SQL
queries Into AST
(SqlNode …)
3rd party Adapters
Method for translating
executable code into data
(LINQ/MSN port)
Default (In-memory) Data
Store Adapter
implementation.
Leverages Linq4j
Relational Algebra,
expression,
optimizations …
Interpreter
Complies Java code
generated from linq4j
“Expressions”. Part of the
physical plan implementer
Calcite SQL Query Execution Flow
28
Enumerable
Interpreter
Prepare
SQL,
Relational,
Planner
Geode
Adapter
Binder
JDBC
Geode
Cluster
1
2
3
4
5
6 7
7
7
2. Parse SQL, convert to rel.
expressions. Validate and Optimize
them
3. Start building a physical plan from
the relation expressions
4. Implement the Geode relations and
encode them as Expression tree
5. Pass the Expression tree to the
Interpreter to generate Java code
6. Generate and Compile a Binder
instance that on ‘bind()’ call runs
Geodes’ query method
1. On new SQL query JDBC delegates
to Prepare to prepare the query
execution
7. JDBC uses the newly compiled
Binder to perform the query on the
Geode Cluster
Calcite Framework
Geode Adapter
2
Linq4j and Expression Tree
29
(Node) Visitor
Node
+ accept(Visitor)
+ evaluate(Node)
Expression
Statement
Block
Condition
For
Goto
Label
Switch
Throw
Try
While
Binary Constant MethodCall Parameter Member…
…
Queryable
Enumberable
QueryProvider
Bindable Generated Code
30
Calcite via Enumerable Converts Expressions into Java Code
Calcite Relational Expressions
31
RelNode
Relational
expression
TableScan
Project
Filter
Aggregate
Join
Intersect
Sort
RexlNode
Row-level
expressions
Project, Sort fields
Filter, Join conditions
Input Column
Ref
Literal
Struct field
access
Function call
Window
expressions
*
RelTrait
*
Physical attribute
of a relation
Calcite Relational Expressions (2)
32
RelNode
+ register(RelOptPlander)
+ List<RelNode> getInputs();
RelOptPlanner
+findBestExp():RelNode
RexNode
RelTrait Convention
NONE
*
*
EnumberableConvention
RelOptRule
+ onMatch(call)
<<register>>
<<create>>
MyDBConvention
ConverterRule
+ RelNode convert(RelNode)
Converts from one calling
convention to another
Convertor
Indicate that it converts a
physical attribute only!
<<rules>>
*
<<inputs>>
*
<<root>>
Query optimizer: Transforms a
relational expression according to
a given set of rules and a cost model.
RelOptCluster
Rule transforms an expression into another. It has a list of
Operands, which determine whether the rule can be applied to
a particular section of the tree.
RelOptRuleOperand
*<<fire criteria>>
Calling convention used
to represent a single
data source.
Inputs to a relational
expression must be in
the same convention
Calcite Adapter Patterns
33
MyAdapterRel
+ implement(implContext)
MyAdapterConvention
Convention.Impl(“MyAdapter”)
Common interface for all MyAdapter
Relation Expressions. Provides
implementation callback method called
as part of physical plan implementation
ImplContext
+ implParm1
+ implParm2 …
RelNode
MyAdapterTable
+ toRel(optTable)
+ asQueryable(provider,…)
MyAdapterQueryable
+ myQuery(params) :
Enumetator
TranslatableTable
<<instance of>>
AbstractQueryableTable
AbstractTableQueryable <<create>>
Can convert
queries in
Expression
myQuery() implements the call to your DB
It is called by the auto generated code. It
must return an Enumberable instance
MyAdapterScan
+ register(planer) {
Registers all MyAdapter Rules
}
<<create>>
MyAdapterToEnumerableConvertorRule
operands: (RelNode.class,
MyAdapterConvention, EnumerableConvention) ConverterRue
TableScan
MyAdapterToEnumerableConvertor
+ implement(EnumerableRelImplementor) {
ctx = new MyAdapterRel.ImplContext()
getImputs().implement(ctx)
return BlockBuild.append( MY_QUERY_REF,
Expressions.constant(ctx.implParms1),
Expressions.constant(ctx.implParms2) …
EnumerableRel
ConvertorImpl
<<create on match >>
MyAdapterProject
MyAdapterFilter
MyAdapterXXX
RelOptRule
MyAdapterProjectRu
MyAdapterFilterRule
MyAdapterXXXRule
<<create on match >>
Recursively call the implement on each
MyAdapter Relation Expression
Encode the myQuery(params) call as
Expressions
MY_QUERY_REF = Types.lookupMethod(
MyAdapterQueryable.class,
”myQuery”,
String.class
String.class);
1
3
4
5
2
6
7
8
9
Calcite Framework
MyAdapter components
Calcite with Geode - Without Implementation
34
SELECT b."totalPrice", c."firstName"
FROM "BookOrder" as b
INNER JOIN "Customer" as c ON b."customerNumber" = c."customerNumber"
WHERE b."totalPrice" > 0;
Calcite with Geode - With Implementation
35
SELECT b."totalPrice", c."firstName" FROM "BookOrder" as b INNER JOIN "Customer" as c
ON b."customerNumber" = c."customerNumber" WHERE b."totalPrice" > 0;
Calcite JDBC Connection
36
What About Testing?
37
Future work
38
•  Improve nested data structures support
•  Push down Join for collocated data sets
•  Push down the COUNT expression
•  Push down the ORDER BY expression (requires adding a DISTINCT aggregate
expression to the query)
•  Use new Geode OQL aggregation operations (http://bit.ly/2eKApd0) to push down
MIN, MAX, SUM, AVG aggregations
•  Beyond OQL (e.g. implement Join, aggregations with custom functions)
•  Leverage Calcite Streaming with Geode
References
39
•  Apache Geode Adapter for Apache Calcite: https://github.com/tzolov/calcite
•  Introduction to Apache Calcite (2016) : http://bit.ly/2fB1iBz
•  Apache Calcite Overview (2014) : http://bit.ly/2fMJgbS
•  Introduction to Apache Geode (2016) : http://bit.ly/1Rfztbd
•  Apache Calcite Project (2016) : https://calcite.apache.org
•  Apache Geode Project (2016) : http://geode.apache.org
•  Geode Object Query Language (OQL) : http://bit.ly/2eKywgp
•  Expression Tree Basic: http://bit.ly/2flBiXH
Using Apache Calcite for Enabling SQL and JDBC Access to Apache Geode and Other NoSQL Data Systems

More Related Content

What's hot (20)

PDF
Introduction to Redis
Dvir Volk
 
PPTX
Introduction to Apache ZooKeeper
Saurav Haloi
 
PDF
Intro to HBase
alexbaranau
 
PDF
Spark shuffle introduction
colorant
 
PDF
Building an Interactive Query Service in Kafka Streams With Bill Bejeck | Cur...
HostedbyConfluent
 
KEY
Introduction to memcached
Jurriaan Persyn
 
PDF
Introduction and Overview of Apache Kafka, TriHUG July 23, 2013
mumrah
 
PPTX
Introduction to Storm
Chandler Huang
 
PPTX
Change Data Capture to Data Lakes Using Apache Pulsar and Apache Hudi - Pulsa...
StreamNative
 
PPTX
Apache Spark Architecture
Alexey Grishchenko
 
PPTX
Hive 3 - a new horizon
Thejas Nair
 
PDF
Apache Calcite: A Foundational Framework for Optimized Query Processing Over ...
Julian Hyde
 
PPTX
Apache Tez: Accelerating Hadoop Query Processing
DataWorks Summit
 
PPTX
Hive + Tez: A Performance Deep Dive
DataWorks Summit
 
PPT
Hadoop Security Architecture
Owen O'Malley
 
PPTX
Hadoop World 2011: Advanced HBase Schema Design - Lars George, Cloudera
Cloudera, Inc.
 
PPTX
From cache to in-memory data grid. Introduction to Hazelcast.
Taras Matyashovsky
 
PDF
Designing Apache Hudi for Incremental Processing With Vinoth Chandar and Etha...
HostedbyConfluent
 
PPTX
Processing Large Data with Apache Spark -- HasGeek
Venkata Naga Ravi
 
PDF
Introduction to MongoDB
Mike Dirolf
 
Introduction to Redis
Dvir Volk
 
Introduction to Apache ZooKeeper
Saurav Haloi
 
Intro to HBase
alexbaranau
 
Spark shuffle introduction
colorant
 
Building an Interactive Query Service in Kafka Streams With Bill Bejeck | Cur...
HostedbyConfluent
 
Introduction to memcached
Jurriaan Persyn
 
Introduction and Overview of Apache Kafka, TriHUG July 23, 2013
mumrah
 
Introduction to Storm
Chandler Huang
 
Change Data Capture to Data Lakes Using Apache Pulsar and Apache Hudi - Pulsa...
StreamNative
 
Apache Spark Architecture
Alexey Grishchenko
 
Hive 3 - a new horizon
Thejas Nair
 
Apache Calcite: A Foundational Framework for Optimized Query Processing Over ...
Julian Hyde
 
Apache Tez: Accelerating Hadoop Query Processing
DataWorks Summit
 
Hive + Tez: A Performance Deep Dive
DataWorks Summit
 
Hadoop Security Architecture
Owen O'Malley
 
Hadoop World 2011: Advanced HBase Schema Design - Lars George, Cloudera
Cloudera, Inc.
 
From cache to in-memory data grid. Introduction to Hazelcast.
Taras Matyashovsky
 
Designing Apache Hudi for Incremental Processing With Vinoth Chandar and Etha...
HostedbyConfluent
 
Processing Large Data with Apache Spark -- HasGeek
Venkata Naga Ravi
 
Introduction to MongoDB
Mike Dirolf
 

Viewers also liked (20)

PDF
Apache Calcite: One planner fits all
Julian Hyde
 
PPTX
Apache Calcite overview
Julian Hyde
 
PPT
Drill / SQL / Optiq
Julian Hyde
 
PDF
SQL on everything, in memory
Julian Hyde
 
PDF
Cost-based Query Optimization in Apache Phoenix using Apache Calcite
Julian Hyde
 
PDF
Building Apps with Distributed In-Memory Computing Using Apache Geode
PivotalOpenSourceHub
 
POTX
Building Effective Apache Geode Applications with Spring Data GemFire
John Blum
 
PPTX
Introducing Apache Geode and Spring Data GemFire
John Blum
 
PDF
Big Data, Simple and Fast: Addressing the Shortcomings of Hadoop
Hazelcast
 
PDF
CassieQ: The Distributed Message Queue Built on Cassandra (Anton Kropp, Cural...
DataStax
 
PDF
Why you care about
 relational algebra (even though you didn’t know it)
Julian Hyde
 
PDF
IMCSummit 2015 - 1 IT Business - The Evolution of Pivotal Gemfire
In-Memory Computing Summit
 
PPTX
Calcite meetup-2016-04-20
Josh Elser
 
PPTX
#GeodeSummit - Off-Heap Storage Current and Future Design
PivotalOpenSourceHub
 
PDF
#GeodeSummit - Redis to Geode Adaptor
PivotalOpenSourceHub
 
PDF
#GeodeSummit - Large Scale Fraud Detection using GemFire Integrated with Gree...
PivotalOpenSourceHub
 
PPTX
High performance queues with Cassandra
Mikalai Alimenkou
 
PDF
Streaming SQL (at FlinkForward, Berlin, 2016/09/12)
Julian Hyde
 
PDF
Streaming SQL
Julian Hyde
 
PPTX
Apache Hive 2.0: SQL, Speed, Scale
DataWorks Summit/Hadoop Summit
 
Apache Calcite: One planner fits all
Julian Hyde
 
Apache Calcite overview
Julian Hyde
 
Drill / SQL / Optiq
Julian Hyde
 
SQL on everything, in memory
Julian Hyde
 
Cost-based Query Optimization in Apache Phoenix using Apache Calcite
Julian Hyde
 
Building Apps with Distributed In-Memory Computing Using Apache Geode
PivotalOpenSourceHub
 
Building Effective Apache Geode Applications with Spring Data GemFire
John Blum
 
Introducing Apache Geode and Spring Data GemFire
John Blum
 
Big Data, Simple and Fast: Addressing the Shortcomings of Hadoop
Hazelcast
 
CassieQ: The Distributed Message Queue Built on Cassandra (Anton Kropp, Cural...
DataStax
 
Why you care about
 relational algebra (even though you didn’t know it)
Julian Hyde
 
IMCSummit 2015 - 1 IT Business - The Evolution of Pivotal Gemfire
In-Memory Computing Summit
 
Calcite meetup-2016-04-20
Josh Elser
 
#GeodeSummit - Off-Heap Storage Current and Future Design
PivotalOpenSourceHub
 
#GeodeSummit - Redis to Geode Adaptor
PivotalOpenSourceHub
 
#GeodeSummit - Large Scale Fraud Detection using GemFire Integrated with Gree...
PivotalOpenSourceHub
 
High performance queues with Cassandra
Mikalai Alimenkou
 
Streaming SQL (at FlinkForward, Berlin, 2016/09/12)
Julian Hyde
 
Streaming SQL
Julian Hyde
 
Apache Hive 2.0: SQL, Speed, Scale
DataWorks Summit/Hadoop Summit
 
Ad

Similar to Using Apache Calcite for Enabling SQL and JDBC Access to Apache Geode and Other NoSQL Data Systems (20)

PDF
Introduction to Apache Geode (Cork, Ireland)
Anthony Baker
 
PDF
Apache Geode Meetup, Cork, Ireland at CIT
Apache Geode
 
PDF
Apache Kylin: OLAP Engine on Hadoop - Tech Deep Dive
Xu Jiang
 
PDF
20170126 big data processing
Vienna Data Science Group
 
PPTX
StackMate - CloudFormation for CloudStack
Chiradeep Vittal
 
PDF
IBM Cloud Native Day April 2021: Serverless Data Lake
Torsten Steinbach
 
PDF
Real time analytics at uber @ strata data 2019
Zhenxiao Luo
 
PPTX
Ntg web services
Farag Zakaria
 
PPTX
Expose your data as an api is with oracle rest data services -spoug Madrid
Vinay Kumar
 
PDF
KSQL Intro
confluent
 
PPTX
Oracle OpenWorld 2014 Review Part Four - PaaS Middleware
Getting value from IoT, Integration and Data Analytics
 
PDF
Apache conbigdata2015 christiantzolov-federated sql on hadoop and beyond- lev...
Christian Tzolov
 
PPTX
A Smarter Pig: Building a SQL interface to Pig using Apache Calcite
Salesforce Engineering
 
PDF
Gluent New World #02 - SQL-on-Hadoop : A bit of History, Current State-of-the...
Mark Rittman
 
PPTX
xPatterns on Spark, Shark, Mesos, Tachyon
Claudiu Barbura
 
PDF
SQL on Hadoop
nvvrajesh
 
PDF
Presto talk @ Global AI conference 2018 Boston
kbajda
 
PDF
MySQL 8 loves JavaScript
Sanjay Manwani
 
PPTX
Виталий Бондаренко "Fast Data Platform for Real-Time Analytics. Architecture ...
Fwdays
 
PPTX
October 2016 HUG: Architecture of an Open Source RDBMS powered by HBase and ...
Yahoo Developer Network
 
Introduction to Apache Geode (Cork, Ireland)
Anthony Baker
 
Apache Geode Meetup, Cork, Ireland at CIT
Apache Geode
 
Apache Kylin: OLAP Engine on Hadoop - Tech Deep Dive
Xu Jiang
 
20170126 big data processing
Vienna Data Science Group
 
StackMate - CloudFormation for CloudStack
Chiradeep Vittal
 
IBM Cloud Native Day April 2021: Serverless Data Lake
Torsten Steinbach
 
Real time analytics at uber @ strata data 2019
Zhenxiao Luo
 
Ntg web services
Farag Zakaria
 
Expose your data as an api is with oracle rest data services -spoug Madrid
Vinay Kumar
 
KSQL Intro
confluent
 
Oracle OpenWorld 2014 Review Part Four - PaaS Middleware
Getting value from IoT, Integration and Data Analytics
 
Apache conbigdata2015 christiantzolov-federated sql on hadoop and beyond- lev...
Christian Tzolov
 
A Smarter Pig: Building a SQL interface to Pig using Apache Calcite
Salesforce Engineering
 
Gluent New World #02 - SQL-on-Hadoop : A bit of History, Current State-of-the...
Mark Rittman
 
xPatterns on Spark, Shark, Mesos, Tachyon
Claudiu Barbura
 
SQL on Hadoop
nvvrajesh
 
Presto talk @ Global AI conference 2018 Boston
kbajda
 
MySQL 8 loves JavaScript
Sanjay Manwani
 
Виталий Бондаренко "Fast Data Platform for Real-Time Analytics. Architecture ...
Fwdays
 
October 2016 HUG: Architecture of an Open Source RDBMS powered by HBase and ...
Yahoo Developer Network
 
Ad

Recently uploaded (20)

PPTX
ManageIQ - Sprint 264 Review - Slide Deck
ManageIQ
 
PDF
>Nitro Pro Crack 14.36.1.0 + Keygen Free Download [Latest]
utfefguu
 
PPTX
Iobit Driver Booster Pro 12 Crack Free Download
chaudhryakashoo065
 
PDF
AWS Consulting Services: Empowering Digital Transformation with Nlineaxis
Nlineaxis IT Solutions Pvt Ltd
 
PDF
Dealing with JSON in the relational world
Andres Almiray
 
PDF
Telemedicine App Development_ Key Factors to Consider for Your Healthcare Ven...
Mobilityinfotech
 
PPTX
Seamless-Image-Conversion-From-Raster-to-wrt-rtx-rtx.pptx
Quick Conversion Services
 
PDF
IObit Uninstaller Pro 14.3.1.8 Crack for Windows Latest
utfefguu
 
PDF
Difference Between Kubernetes and Docker .pdf
Kindlebit Solutions
 
PDF
LPS25 - Operationalizing MLOps in GEP - Terradue.pdf
terradue
 
PDF
What Is an Internal Quality Audit and Why It Matters for Your QMS
BizPortals365
 
PPTX
IObit Driver Booster Pro Crack Download Latest Version
chaudhryakashoo065
 
PPTX
ERP - FICO Presentation BY BSL BOKARO STEEL LIMITED.pptx
ravisranjan
 
PPTX
Android Notifications-A Guide to User-Facing Alerts in Android .pptx
Nabin Dhakal
 
PPTX
Automatic_Iperf_Log_Result_Excel_visual_v2.pptx
Chen-Chih Lee
 
PDF
Code Once; Run Everywhere - A Beginner’s Journey with React Native
Hasitha Walpola
 
PPTX
IObit Uninstaller Pro 14.3.1.8 Crack Free Download 2025
sdfger qwerty
 
PPTX
Introduction to web development | MERN Stack
JosephLiyon
 
PDF
IDM Crack with Internet Download Manager 6.42 Build 41
utfefguu
 
PDF
Power BI vs Tableau vs Looker - Which BI Tool is Right for You?
MagnusMinds IT Solution LLP
 
ManageIQ - Sprint 264 Review - Slide Deck
ManageIQ
 
>Nitro Pro Crack 14.36.1.0 + Keygen Free Download [Latest]
utfefguu
 
Iobit Driver Booster Pro 12 Crack Free Download
chaudhryakashoo065
 
AWS Consulting Services: Empowering Digital Transformation with Nlineaxis
Nlineaxis IT Solutions Pvt Ltd
 
Dealing with JSON in the relational world
Andres Almiray
 
Telemedicine App Development_ Key Factors to Consider for Your Healthcare Ven...
Mobilityinfotech
 
Seamless-Image-Conversion-From-Raster-to-wrt-rtx-rtx.pptx
Quick Conversion Services
 
IObit Uninstaller Pro 14.3.1.8 Crack for Windows Latest
utfefguu
 
Difference Between Kubernetes and Docker .pdf
Kindlebit Solutions
 
LPS25 - Operationalizing MLOps in GEP - Terradue.pdf
terradue
 
What Is an Internal Quality Audit and Why It Matters for Your QMS
BizPortals365
 
IObit Driver Booster Pro Crack Download Latest Version
chaudhryakashoo065
 
ERP - FICO Presentation BY BSL BOKARO STEEL LIMITED.pptx
ravisranjan
 
Android Notifications-A Guide to User-Facing Alerts in Android .pptx
Nabin Dhakal
 
Automatic_Iperf_Log_Result_Excel_visual_v2.pptx
Chen-Chih Lee
 
Code Once; Run Everywhere - A Beginner’s Journey with React Native
Hasitha Walpola
 
IObit Uninstaller Pro 14.3.1.8 Crack Free Download 2025
sdfger qwerty
 
Introduction to web development | MERN Stack
JosephLiyon
 
IDM Crack with Internet Download Manager 6.42 Build 41
utfefguu
 
Power BI vs Tableau vs Looker - Which BI Tool is Right for You?
MagnusMinds IT Solution LLP
 

Using Apache Calcite for Enabling SQL and JDBC Access to Apache Geode and Other NoSQL Data Systems

  • 1. Apache Calcite for Enabling SQL Access to NoSQL Data Systems such as Apache Geode Christian Tzolov
  • 2. 2 Christian Tzolov Engineer at Pivotal, Big-Data, Hadoop, Spring Cloud Dataflow, Apache Geode, Apache HAWQ, Apache Committer, Apache Crunch PMC member [email protected] blog.tzolov.net Twitter: @christzolov https://nl.linkedin.com/in/tzolov Whoami Disclaimer This talk expresses my personal opinions. It is not read or approved by Pivotal and does not necessarily reflect the views and opinions of Pivotal nor does it constitute any official communication of Pivotal. Pivotal does not support any of the code shared here.
  • 3. 3 Big Data Landscape 2016 •  Volume •  Velocity •  Varity •  Scalability •  Latency •  CAP - Consistency vs. Availability
  • 4. 4 •  SQL •  Custom APIs –  Key / Value –  Fluid API –  REST API •  {My} Query Language Unified Access? At What Cost? Data Access
  • 5. 5 •  Apache Apex •  Apache Drill •  Apache Flink •  Apache Hive •  Apache Kylin •  Apache Phoenix •  Apache Samza •  Apache Storm •  Cascading •  Qubole Quark •  SQL-Gremlin … SQL? •  Apache Geode
  • 6. Calcite Geode Adapter - Overview Geode API and OQL SQL/JDBC/ODBC Convert SQL relational expressions into OQL queriesGeode Adapter (Geode Client) Geode ServerGeode ServerGeode Server Data Data Data Push down the relational expressions supported by Geode OQL and falls back to the Calcite Enumerable Adapter for the rest Enumerable Adapter Apache Calcite Spring Data Geode Spring Data API for interacting with Geode Parse SQL, converts into relational expression and optimizes
  • 7. Relational Expressions and Optimization 7 Scan Scan Join Filter Project Customer (c) BookOrder (b) on customerNumber b.totalPrice > 0 c.firstName, b.totalPrice SELECT b."totalPrice", c."firstName” FROM "BookOrder" as b INNER JOIN "Customer" as c ON b."customerNumber" = c."customerNumber” WHERE b."totalPrice" > 0; Scan Scan Join Project Customer (c) BookOrder (b) on customerNumber totalPrice > 0 c.firstName, b.totalPrice Project firstName, customerNumber Filter totalPrice, customerNumberProject Optimiz
  • 8. Push Down Candidates 8 Relational Operator Geode Support LIMIT Supported without FETCH PROJECTION Supported FILTER Supported JOIN Only for collocated data AGGREGATE Only for MAX, MIN, SUM, AVG SORT Requires DISTINCT statement Implemented
  • 9. Apache Geode? “… in-memory, distributed database with strong consistency built to support low latency transactional applications at extreme scale”
  • 10. Why Apache Geode? 10 5,700 train stations 4.5 million tickets per day 20 million daily users 1.4 billion page views per day 40,000 visits per second 7,000 stations 72,000 miles of track 23 million passengers daily 120,000 concurrent users 10,000 transactions per minute https://pivotal.io/big-data/case-study/distributed-in-memory-data-management-solution https://pivotal.io/big-data/case-study/scaling-online-sales-for-the-largest-railway-in-the-world-china-railway-corporation China Railway
  • 11. 11 •  In-Memory Data Storage –  > 100TB memory –  JVM Heap + Off Heap •  Any Data Format –  Key-Value/Object Store •  ACID Compliant Transactions •  HA and Linear Scalability •  Strong Consistency •  Streaming and Event Processing –  Listeners –  Distributed Functions –  Continuous OQL Queries •  Multi-site / Inter-cluster •  Embedded and Standalone •  Top Level Apache Project Apache Geode Features
  • 12. Apache Geode Concepts Cache Server (member) Cache Region 1 Region N ValKe y v1k1 v2k2 … Cache - In-memory collection of Regions Region - consistent, distributed Map (key-value), Partitioned or Replicated CacheServer – process connected to the distributed system with created Cache Client (member)Locator (member) Client –read and modify the content of the distributed system Locator – tracks system members and provides membership information … Listeners Functions Functions – distributed, concurrent data processing Listener – event handler. Registers for one or more events and notified when they occur
  • 13. Geode Topologies Cache ServerCache ServerCache Server Cache Data Cache Data Cache Data Peer-to-Peer Cache ServerCache ServerCache Server Cache Data Cache Data Cache Data Client Local Cache pool Client-Server Cache Server Cache Server Gateway Sender … Cache Server Gateway Receiver Cache ServerCache Server Cache Data Cache Data Cache Data Cache Data Gateway Receiver Cache Server … Gateway Sender Cache ServerCache Server Cache Data Cache Data Cache Data Cache Data WAN Multi-site Boundary Multi-Site
  • 14. Geode Client API •  Client Cache •  Key / Value - Region GET, PUT, REMOVE •  OQL – QueryService
  • 15. Geode Data Types & Serialization •  Key-Value with complex value formats •  Portable Data eXchange (PDX) Serialization – Delta propagation, schema evolution, polyglot support … •  Object Query Language (OQL) SELECT p.name FROM /Person p WHERE p.pet.type = “dino” { id: 1, name: “Fred”, age: 42, pet: { name: “Barney”, type: “dino” } } single field deserialization nested fields
  • 16. Geode Demo (GFSH and OQL) •  Connect to Geode cluster, •  List available Regions •  Run OQL query
  • 17. Apache Calcite? Java framework that allows SQL interface and advanced query optimization, for virtually any data system •  Query Parser, Validator and Optimizer(s) •  Local/Remote JDBC drivers •  Streaming •  Agnostic to how data is stored and process •  Balance SQL completes vs. integrity of Data system native capabilities
  • 18. Apache Calcite Data Types •  Catalog – namespaces accessed in queries •  Schema - collection of schemas and tables •  Table - single data set, collection of rows •  RelDataType – SQL fields types in a Table Your Data System Data System Data Types Calcite Schema SQL Engine Table Table JDBC Table… Data Type Mapping SELECT title, author FROM test.BookMaster Data Type Fields Schema Table
  • 19. Calcite Data Types: RelDataType 19 Type of a scalar expression or row •  RelDataTypeFactory – RelDataType factory •  JavaTypeFactory - registers Java classes as record types •  JavaTypeFactoryImpl - Java Reflection to build RelDataTypes •  SqlTypeFactoryImpl - Default implementation with all SQL types
  • 20. Geode to Calcite Data Types Mapping 20 Geode Cache Region 1 Region K ValKey v1k1 v2k2 … Calcite Schema Table 1 Table K Col1 Col2 ColN V(M,1)RowM V(M,2) V(M,N) V(2,1)Row2 V(2,2) V(2,N) V(1,1)Row1 V(1,2) V(1,N) … Regions are mapped into Tables Geode Cache is mapped into Calcite Schema Geode Key/Value is mapped into Table Row Create Column Types (RelDataType) from Geode Value class (JavaTypeFactoryImpl)
  • 21. Calcite Bootstrap Flow 21 Typical calcite initialization flow Model (JSON) SchemaFactory Schema Tables Creates Creates Configures Calcite Creates
  • 22. Calcite Model { version: '1.0', defaultSchema: 'TEST', schemas: [ { name: 'TEST', type: 'custom', factory: 'org.apache.calcite.adapter.geode.simple.GeodeSchemaFactory', operand: { locatorHost: 'localhost', locatorPort: '10334', regions: 'BookMaster', pdxSerializablePackagePath: 'net.tzolov.geode.bookstore.domain.*' } }] } Reference to your adapter schema factory implementation class Parameters to be passed to your adapter schema factory implementation The path to <my-model>.json is passed as JDBC connection argument: !connect jdbc:calcite:model=target/test-classes/<my-model-path>.json︎ Schema Name
  • 23. Geode Calcite Schema and Schema Factory public class GeodeSchemaFactory implements SchemaFactory { public Schema create(SchemaPlus parentSchema, String schemaName, Map<String, Object> operand) { String locatorHost = (String) operand.get(“locatorHost”); int locatorPort = … String[] regionNames = … String pdxPackagePath = … return new GeodeSchema(locatorHost, locatorPort, regionNames, pdxPackagePath); } } public class GeodeSchema extends AbstractSchema { private String regionName = .. protected Map<String, Table> getTableMap() { final ImmutableMap.Builder<String, Table> builder = ImmutableMap.builder(); Region region = … Get Geode Region by region name … Class valueClass= … Find region’s value type … builder.put(regionName, new GeodeScannableTable(regionName, valueClass, clientCache)); return tableMap; } Retrieves the parameters set in the model.json Create an Adapter Schema instance with the provided parameters. Create GeodeScannableTable instance for each Geode Region
  • 24. Geode Scannable Table public class GeodeScannableTable extends AbstractTable implements ScannableTable { public RelDataType getRowType(RelDataTypeFactory typeFactory) { return new JavaTypeFactoryImpl().createStructType(valueClass); } public Enumerable<Object[]> scan(DataContext root) { return new AbstractEnumerable<Object[]>() { public Enumerator<Object[]> enumerator() { return new GeodeEnumerator<Object[]>(clientCache, regionName); } } public class GeodeEnumerator<E> implements Enumerator<E> { private E current; private SelectResults geodeIterator; public GeodeEnumerator(ClientCache clientCache, String regionName) { geodeterator = clientCache.getQueryService().newQuery("select * from /" + regionName).execute().iterator(); } public boolean moveNext() { current = convert(geodeIterator.next()); return true;} public E current() {return current;} public abstract E convert(Object geodeValue) { Convert PDX value into RelDataType row } Defined in the Linq4j sub-project Retrieves the entire Region!! Converts Geode value response into Calcite row data Uses reflection (or pdx-instance) to builds RelDataType from value’s class type Returns an Enumeration over the entire target data store
  • 25. Geode Demo (Scannable Tables) $ ./sqlline ︎ sqlline> !connect jdbc:calcite:model=target/test-classes/model2.json admin admin︎ ︎ jdbc:calcite> !tables ︎ jdbc:calcite> SELECT * FROM "BookMaster”;︎ jdbc:calcite> SELECT "yearPublished", AVG("retailCost") AS “AvgRetailCost” FROM "BookMaster" GROUP BY "yearPublished";︎ jdbc:calcite> SELECT b."totalPrice", c."firstName” FROM "BookOrder" AS b INNER JOIN "Customer" AS c ON b."customerNumber" = c."customerNumber” WHERE b."totalPrice" > 0;︎ ︎ ︎ Without and With Implementation
  • 26. Non-Relational Tables 26 Scanned without intermediate relational expression. •  ScannableTable - can be scanned •  FilterableTable - can be scanned, applying supplied filter expressions •  ProjectableFilterableTable - can be scanned, applying supplied filter expressions and projecting a given list of columns Enumerable<Object[]> scan(DataContext root, List<RexNode> filters, int[] projects); Enumerable<Object[]> scan(DataContext root, List<RexNode> filters); Enumerable<Object[]> scan(DataContext root);
  • 27. Calcite Ecosystem 27 Several “semi-independent” projects. JDBC and Avatica Linq4j Expression Tree Enumerable Adapter Relational •  Relational Expressions •  Row Expression •  Optimization Rules •  Planner … SQL Parser & AST Port of LINQ (Language-Integrated Query) to Java. Local and Remote JDBC driver Converts SQL queries Into AST (SqlNode …) 3rd party Adapters Method for translating executable code into data (LINQ/MSN port) Default (In-memory) Data Store Adapter implementation. Leverages Linq4j Relational Algebra, expression, optimizations … Interpreter Complies Java code generated from linq4j “Expressions”. Part of the physical plan implementer
  • 28. Calcite SQL Query Execution Flow 28 Enumerable Interpreter Prepare SQL, Relational, Planner Geode Adapter Binder JDBC Geode Cluster 1 2 3 4 5 6 7 7 7 2. Parse SQL, convert to rel. expressions. Validate and Optimize them 3. Start building a physical plan from the relation expressions 4. Implement the Geode relations and encode them as Expression tree 5. Pass the Expression tree to the Interpreter to generate Java code 6. Generate and Compile a Binder instance that on ‘bind()’ call runs Geodes’ query method 1. On new SQL query JDBC delegates to Prepare to prepare the query execution 7. JDBC uses the newly compiled Binder to perform the query on the Geode Cluster Calcite Framework Geode Adapter 2
  • 29. Linq4j and Expression Tree 29 (Node) Visitor Node + accept(Visitor) + evaluate(Node) Expression Statement Block Condition For Goto Label Switch Throw Try While Binary Constant MethodCall Parameter Member… … Queryable Enumberable QueryProvider
  • 30. Bindable Generated Code 30 Calcite via Enumerable Converts Expressions into Java Code
  • 31. Calcite Relational Expressions 31 RelNode Relational expression TableScan Project Filter Aggregate Join Intersect Sort RexlNode Row-level expressions Project, Sort fields Filter, Join conditions Input Column Ref Literal Struct field access Function call Window expressions * RelTrait * Physical attribute of a relation
  • 32. Calcite Relational Expressions (2) 32 RelNode + register(RelOptPlander) + List<RelNode> getInputs(); RelOptPlanner +findBestExp():RelNode RexNode RelTrait Convention NONE * * EnumberableConvention RelOptRule + onMatch(call) <<register>> <<create>> MyDBConvention ConverterRule + RelNode convert(RelNode) Converts from one calling convention to another Convertor Indicate that it converts a physical attribute only! <<rules>> * <<inputs>> * <<root>> Query optimizer: Transforms a relational expression according to a given set of rules and a cost model. RelOptCluster Rule transforms an expression into another. It has a list of Operands, which determine whether the rule can be applied to a particular section of the tree. RelOptRuleOperand *<<fire criteria>> Calling convention used to represent a single data source. Inputs to a relational expression must be in the same convention
  • 33. Calcite Adapter Patterns 33 MyAdapterRel + implement(implContext) MyAdapterConvention Convention.Impl(“MyAdapter”) Common interface for all MyAdapter Relation Expressions. Provides implementation callback method called as part of physical plan implementation ImplContext + implParm1 + implParm2 … RelNode MyAdapterTable + toRel(optTable) + asQueryable(provider,…) MyAdapterQueryable + myQuery(params) : Enumetator TranslatableTable <<instance of>> AbstractQueryableTable AbstractTableQueryable <<create>> Can convert queries in Expression myQuery() implements the call to your DB It is called by the auto generated code. It must return an Enumberable instance MyAdapterScan + register(planer) { Registers all MyAdapter Rules } <<create>> MyAdapterToEnumerableConvertorRule operands: (RelNode.class, MyAdapterConvention, EnumerableConvention) ConverterRue TableScan MyAdapterToEnumerableConvertor + implement(EnumerableRelImplementor) { ctx = new MyAdapterRel.ImplContext() getImputs().implement(ctx) return BlockBuild.append( MY_QUERY_REF, Expressions.constant(ctx.implParms1), Expressions.constant(ctx.implParms2) … EnumerableRel ConvertorImpl <<create on match >> MyAdapterProject MyAdapterFilter MyAdapterXXX RelOptRule MyAdapterProjectRu MyAdapterFilterRule MyAdapterXXXRule <<create on match >> Recursively call the implement on each MyAdapter Relation Expression Encode the myQuery(params) call as Expressions MY_QUERY_REF = Types.lookupMethod( MyAdapterQueryable.class, ”myQuery”, String.class String.class); 1 3 4 5 2 6 7 8 9 Calcite Framework MyAdapter components
  • 34. Calcite with Geode - Without Implementation 34 SELECT b."totalPrice", c."firstName" FROM "BookOrder" as b INNER JOIN "Customer" as c ON b."customerNumber" = c."customerNumber" WHERE b."totalPrice" > 0;
  • 35. Calcite with Geode - With Implementation 35 SELECT b."totalPrice", c."firstName" FROM "BookOrder" as b INNER JOIN "Customer" as c ON b."customerNumber" = c."customerNumber" WHERE b."totalPrice" > 0;
  • 38. Future work 38 •  Improve nested data structures support •  Push down Join for collocated data sets •  Push down the COUNT expression •  Push down the ORDER BY expression (requires adding a DISTINCT aggregate expression to the query) •  Use new Geode OQL aggregation operations (http://bit.ly/2eKApd0) to push down MIN, MAX, SUM, AVG aggregations •  Beyond OQL (e.g. implement Join, aggregations with custom functions) •  Leverage Calcite Streaming with Geode
  • 39. References 39 •  Apache Geode Adapter for Apache Calcite: https://github.com/tzolov/calcite •  Introduction to Apache Calcite (2016) : http://bit.ly/2fB1iBz •  Apache Calcite Overview (2014) : http://bit.ly/2fMJgbS •  Introduction to Apache Geode (2016) : http://bit.ly/1Rfztbd •  Apache Calcite Project (2016) : https://calcite.apache.org •  Apache Geode Project (2016) : http://geode.apache.org •  Geode Object Query Language (OQL) : http://bit.ly/2eKywgp •  Expression Tree Basic: http://bit.ly/2flBiXH