Upload
jerome
View
68
Download
0
Tags:
Embed Size (px)
DESCRIPTION
Jesse Yates Salesforce.com. Secondary Indexing. t he discussion so far…. 9/11/12 HBase Pow -wow. What is it?. Problem. HBase rows are multi-dimensional Only sorted on the row key How do you efficiently lookup deeper into the row key?. Example. - PowerPoint PPT Presentation
Citation preview
Secondary Indexing
the discussion so far….
9/11/12 HBase Pow-wow
Jesse YatesSalesforce.com
What is it?
Problem
• HBase rows are multi-dimensional– Only sorted on the row key
• How do you efficiently lookup deeper into the row key?
ExampleRow Family Qualifier Timestamp value
1 Name First 0 Babe
1 Name Last 0 Ruth
How do we find all people with the last name ‘Ruth’?
Full table scan!
Indexing!Row Family Qualifier Timestamp Value
Ruth Name Last 0 1
Store the property we need to search for as the primary key• pointer back to the primary row • fast lookup - O(lg(n))
Use Cases
• Point lookups– Volume of data influences usefulness of index• Let user decide if they need to use an index
• Scan lookup– WHERE age > 16
Implementations
Omid
Full transactional supportCentralized oracle
Lily
WAL implementation on top of HBase100-500 writes/sec
Percolator
Full transactionsDistributed, optimistic locking
~10 sec latencies possible
Culvert
AsyncDead project, incomplete
http://jyates.github.com/2012/07/09/consistent-enough-secondary-indexes.html
Client-side coordinated indexUse timestamps to coordinate
Not yet implemented
Trend Micro Implementation
Still just POC???
Solr/Lucene
Standard Lucene library bolted on HBaseNot commonly used
Lots of formats/codecs already written
Considerations for HBase
What do we need to do?
Built-in vs. external library vs.
semi-supported (e.g. security)
Which should I use??
• HBase experts write a single ‘right’ impl• Officially endorse a ‘correct’ version• What changes do we need to make• How close to the core is the project– Written in everywhere– hbase-index module– External library
Async vs. Synchronous vs.
Transactional
Key Observation
“Secondary indexing is inherently an easier problem than full transactions… secondary index updates are idempotent.”
- Lars Hofhansl
Async vs. Synchronous vs.Transactional
• We don’t need full transactions– Transactions are slow – Transactions fail with increasing probability as
number of servers increases• Optionally async or sync– Async• Inherently ‘dirty’ index
• How does index cleanup work?– Inherently different for each type
Locality
Where’s my data?
• Extra columns vs. index table• HBase Region-pinning– Has to be best-effort or will decrease availability – Helps minimize RPC overhead– Cross-table region-pinning– Needs a coprocessor hook to be useful
• HDFS block allocation– Keep index and data blocks on same HDFS node
Index Cardinality
How much data are we talking?“Seems like there are 3 categories of sparseness:1. sparse indexes (like ipAddress) where a per-table approach is
more efficient for reads
2. dense indexes (like eventType) where there are likely values of every index key on each region
3. very dense indexes (like male/female) where you should just be doing a table scan anyway”
- Matt Corgan (9/10/12)
Impact on implementation
• Need a lot of knowledge of data to pick the right kind of index– User knows their data, let them do the hard work
of picking indexes
Pluggability
Everyone’s got an impl already
• We need to make HBase flexible enough to support (most) current indexing formats with minimal overhead for switching– Lucene style Codec/CodecProvider?
Client-interface
What should it look like?
• Minimal changes to the top-level interfaces– Add a single new flag?– Configuration based?
• Enough that the user gets to be smart about what should be used– We can’t get all cases right – just provide building
blocks• Automatically use an index?• Scanner/Filter style use?
Properties for the client
• Should the user even see the index lookups?
• ACID?• Ordering of results?– Support the current sorted order?– Batch lookup?
• Implications on current features– Replication– splitting
Schema(less)
• Schema enforced?– Rigid usage of index matching an expected schema?– Schema table? Reserved schema columns? .META.?
• Schema-less– Let the user apply whatever they think and use only
what actually works• Best-effort– Use client-hinted schema and try to apply all the
known indexes
My random thoughts….
• Client-side managed indexes are efficient– Minimal RPC overhead• Cleanup is async to client and rarely misses
– Solves the cross-region/server problem• Region-pinning is a nice-to-have optimization
– Scales without concern for locality– Flexible enough to support custom codecs– Can be built to provide server-side optimizations• Locality aware indexes to minimize RPCs
Discussion!