Presentation is loading. Please wait.

Presentation is loading. Please wait.

Secondary Indexing in Phoenix Jesse Yates HBase Committer Software Engineer SF HBase User Group – September 26, 2013 James Taylor Phoenix Lead Software.

Similar presentations


Presentation on theme: "Secondary Indexing in Phoenix Jesse Yates HBase Committer Software Engineer SF HBase User Group – September 26, 2013 James Taylor Phoenix Lead Software."— Presentation transcript:

1 Secondary Indexing in Phoenix Jesse Yates HBase Committer Software Engineer SF HBase User Group – September 26, 2013 James Taylor Phoenix Lead Software Engineer

2 Agenda About Indexes In Phoenix Immutable Indexes Mutable Indexes Demo! Roadmap 2SF HUG – Sept 2013 https://www.madison.k12.wi.us/calendars

3 Phoenix Open Source – https://github.com/forcedotcom/phoenix “SQL-skin” on HBase – Everyone knows SQL! JDBC Driver – Plug-and-play Faster than HBase – in some cases 3SF HUG – Sept 2013

4 Secondary Indexes Sort on ‘orthogonal’ axis Save full-table scan Expected database feature Hard in HBase b/c of ACID considerations SF HUG – Sept 20134

5 About Indexes In Phoenix Immutable Indexes Mutable Indexes Demo! Roadmap Agenda 5SF HUG – Sept 2013

6 Indexes In Phoenix Creating an index – DDL statement – Creates another HBase table behind the scenes Deciding when an index is used – Transparent to the user – (but user can override through hint) – No stats yet Knowing which table was used – EXPLAIN SF HUG – Sept 20136

7 Creating Indexes In Phoenix CREATE INDEX ON ( …) INCLUDE ( …); Optionally add IMMUTABLE_ROWS=true property to CREATE TABLE statement SF HUG – Sept 20137

8 Creating Indexes In Phoenix CREATE TABLE baby_names ( name VARCHAR PRIMARY KEY, occurrences BIGINT); CREATE INDEX baby_names_idx ON baby_names(occurrences DESC, name); SF HUG – Sept 20138

9 Deciding When To Use Transparent to the user Query optimizer does the following: – Compiles query against data and index tables – Chooses “best” one (not yet stats driven) Can index even be used? – Active, Using columns contained in index (no join back to data table) Can ORDER BY be removed? Which plan forms the longest start/stop scan key? SF HUG – Sept 20139

10 Deciding When To Use SELECT name, occurrences FROM baby_names ORDER BY occurrences DESC LIMIT 10; SELECT name, occurrences FROM baby_names_idx LIMIT 10 SF HUG – Sept ORDER BY not necessary since rows in index table are already ordered this way

11 Deciding When To Use SELECT name, occurrences FROM baby_names WHERE occurrences > 100; SELECT name, occurrences FROM baby_names_idx WHERE occurrences > 100; SF HUG – Sept Uses index, since we can form start row for scan based on filter of occurrences

12 Deciding When To Use SELECT /* NO_INDEX */ name FROM baby_names WHERE occurrences > 100; SELECT /*+ INDEX (baby_names baby_names_idx other_baby_names_idx) */ name,occurrences FROM baby_names WHERE occurrences > 100; SF HUG – Sept Override optimizer by telling it not to use any indexes Tell optimizer priority in which it should consider using indexes`

13 Knowing which table was used EXPLAIN SELECT name, occurrences FROM baby_names ORDER BY occurrences DESC LIMIT 10; CLIENT PARALLEL 1-WAY FULL SCAN OVER BABY_NAMES_IDX SERVER FILTER BY PageFilter 10 CLIENT 10 ROW LIMIT SF HUG – Sept

14 About Indexes In Phoenix Immutable Indexes Mutable Indexes Demo! Roadmap Agenda 14SF HUG – Sept 2013

15 Immutable Indexes Immutable Rows Much easier to implement Client-managed Bulk-loadable 15SF HUG – Sept 2013

16 About Indexes In Phoenix Immutable Indexes Mutable Indexes Demo! Roadmap Agenda 16SF HUG – Sept 2013

17 Mutable Indexes Global Index Change row state – Common use-case – “expected” implementation Covered Columns/Join Index 17SF HUG – Sept 2013

18 1.5 years* 18SF HUG – Sept 2013

19 Internals Index Management – Build index updates – Ensures index is ‘cleaned up’ Recovery Mechanism – Ensures index updates are “ACID” 19SF HUG – Sept 2013

20 “There is no magic” - Every programming hipster (chipster) SF HUG – Sept

21 Mutable Indexing: Standard Write Path 21 Client HRegion RegionCoprocessorHost WAL RegionCoprocessorHost MemStore SF HUG – Sept 2013

22 Mutable Indexing: Standard Write Path 22 Client HRegion RegionCoprocessorHost WAL RegionCoprocessorHost MemStore SF HUG – Sept 2013

23 Mutable Indexing 23 Region Coprocessor Host Region Coprocessor Host WAL Region Coprocessor Host Region Coprocessor Host Indexer Builder WAL Updater Durable! Indexer Index Table Codec SF HUG – Sept 2013

24 Index Management 24 Lives within a RegionCoprocesorObserver Access to the local HRegion Specifies the mutations to apply to the index tables public interface IndexBuilder { public void setup(RegionCoprocessorEnvironment env); public Map getIndexUpdate(Put put); public Map getIndexUpdate(Delete delete); } public interface IndexBuilder { public void setup(RegionCoprocessorEnvironment env); public Map getIndexUpdate(Put put); public Map getIndexUpdate(Delete delete); } SF HUG – Sept 2013

25 Why not write my own? Managing Cleanup – Efficient point-in-time correctness – Performance tricks Abstract access to HRegion – Minimal network hops Sorting correctness – Phoenix typing ensures correct index sorting SF HUG – Sept

26 Example: Managing Cleanup Updates can arrive out of order – Client-managed timestamps SF HUG – Sept ROWFAMILYQUALIFIER TSVALUE Row1FamQual10val1 Row1Fam2Qual212val2 Row1FamQual13val3

27 Example: Managing Cleanup Index Table SF HUG – Sept ROWFAMILYQUALIFIER TS Val1|Row1IndexFam:Qual10 Val1|Val2|Row1IndexFam:Qual Fam2:Qual2 12 Val3|Val2|Row1IndexFam:Qual Fam2:Qual2 13

28 Example: Managing Cleanup SF HUG – Sept ROWFAMILYQUALIFIER TSVALUE Row1FamQual10val1 Row1Fam2Qual212val2 Row1FamQual13val3 Row1FamQual11val4

29 Example: Managing Cleanup SF HUG – Sept ROWFAMILYQUALIFIER TSVALUE Row1FamQual10val1 Row1FamQual11val4 Row1Fam2Qual212val2 Row1FamQual13val3

30 Example: Managing Cleanup SF HUG – Sept ROWFAMILYQUALIFIER TS Va1|Row1IndexFam:Qual10 Val4|Row1IndexFam:Qual11 Val4|Val2|Row1IndexFam:Qual Fam2:Qual2 12 Va1l|Val2|Row1IndexFam:Qual Fam2:Qual2 12 Val3|Val2|Row1IndexFam:Qual Fam2:Qual2 13

31 Example: Managing Cleanup SF HUG – Sept ROWFAMILYQUALIFIER TS Va1|Row1IndexFam:Qual10 Val4|Row1IndexFam:Qual11 Val4|Val2|Row1IndexFam:Qual Fam2:Qual2 12 Va1l|Val2|Row1IndexFam:Qual Fam2:Qual2 12 Val3|Val2|Row1IndexFam:Qual Fam2:Qual2 13

32 Managing Cleanup History “roll up” Out-of-order Updates Point-in-time correctness Multiple Timestamps per Mutation Delete vs. DeleteColumn vs. DeleteFamily Surprisingly hard! SF HUG – Sept

33 Phoenix Index Builder Much simpler than full index management Hides cleanup considerations Abstracted access to local state SF HUG – Sept public interface IndexCodec{ public void initialize(RegionCoprocessorEnvironment env); public Iterable getIndexDeletes(TableState state); public Iterable getIndexUpserts(TableState state); } public interface IndexCodec{ public void initialize(RegionCoprocessorEnvironment env); public Iterable getIndexDeletes(TableState state); public Iterable getIndexUpserts(TableState state); }

34 Phoenix Index Codec SF HUG – Sept

35 Dude, where’s my data? 35SF HUG – Sept 2013 Ensuring Correctness

36 HBase ACID Does NOT give you: – Cross-row consistency – Cross-table consistency Does give you: – Durable data on success – Visibility on success without partial rows 36SF HUG – Sept 2013

37 Key Observation “Secondary indexing is inherently an easier problem than full transactions… secondary index updates are idempotent.” - Lars Hofhansl 37 SF HUG – Sept 2013

38 Idempotent Index Updates Doesn’t need full transactions Replay as many times as needed Can tolerate a little lag – As long as we get the order right 38SF HUG – Sept 2013

39 Failure Recovery Custom WALEditCodec – Encodes index updates – Supports compressed WAL Custom WAL Reader – Replay index updates from WAL SF HUG – Sept hbase.regionserver.wal.codec o.a.h.hbase.regionserver.wal.IndexedWALEditCodec hbase.regionserver.hlog.reader.impl o.a.h.hbase.regionserver.wal.IndexedHLogReader

40 Failure Situations Any time before WAL, client replay Any time after WAL, HBase replay All-or-nothing SF HUG – Sept

41 Failure #1: Before WAL 41 Client HRegion RegionCoprocessorHost WAL RegionCoprocessorHost MemStore SF HUG – Sept 2013

42 Failure #1: Before WAL 42 Client HRegion RegionCoprocessorHost WAL RegionCoprocessorHost MemStore No problem! No data is stored in the WAL, client just retries entire update. SF HUG – Sept 2013

43 Failure #2: After WAL 43 Client HRegion RegionCoprocessorHost WAL RegionCoprocessorHost MemStore SF HUG – Sept 2013

44 Failure #2: After WAL 44 Client HRegion RegionCoprocessorHost WAL RegionCoprocessorHost MemStore WAL replayed via usual replay mechanisms SF HUG – Sept 2013

45 “Magic” Server-short circuit Lazy load columns Skip-scan for cache Parallel Writing Custom MemStore in Indexer Caching HTables Pluggable Index Writing/Failure Policy Minimize byte[] copy (ImmutableBytesPtr) SF HUG – Sept

46 About Indexes In Phoenix Immutable Indexes Mutable Indexes Demo! Roadmap Agenda 46SF HUG – Sept 2013

47 Demo 47SF HUG – Sept 2013

48 About Indexes In Phoenix Immutable Indexes Mutable Indexes Demo! Roadmap Agenda 48SF HUG – Sept 2013

49 Roadmap Next release of Phoenix Performance improvements Functional Indexes Other indexing approaches (Huawei, SEP) 49SF HUG – Sept 2013

50 Open Source! Main: https://github.com/forcedotcom/phoenix Indexing: https://github.com/forcedotcom/phoenix/tree/mutable-si 50SF HUG – Sept 2013

51 (obligatory hiring slide) We’re Hiring!

52

53 Appendix AsyncHBaseWriter – github.com/jyates/phoenix/tree/async-hbase – 2x+ slower* * Written in 2hrs, not 100% correct either SF HUG – Sept


Download ppt "Secondary Indexing in Phoenix Jesse Yates HBase Committer Software Engineer SF HBase User Group – September 26, 2013 James Taylor Phoenix Lead Software."

Similar presentations


Ads by Google