Henning, Jesse Yates wrote the back-end of our global secondary indexing system in Phoenix. He designed it as a separate, pluggable module with no Phoenix dependencies. Here's an overview of the feature: https://github.com/forcedotcom/phoenix/wiki/Secondary-Indexing. The section that discusses the data guarantees and failure management might be of interest to you: https://github.com/forcedotcom/phoenix/wiki/Secondary-Indexing#data-guarantees-and-failure-management
This presentation also gives a good overview of the pluggability of his implementation: http://files.meetup.com/1350427/PhoenixIndexing-SF-HUG_09-26-13.pptx Thanks, James On Mon, Dec 23, 2013 at 3:47 AM, Henning Blohm <henning.bl...@zfabrik.de>wrote: > Lars, that is exactly why I am hesitant to use one the core level generic > approaches (apart from having difficulties to identify the still active > projects): I have doubts I can sufficiently explain to myself when and > where they fail. > > With "toolbox approach" I meant to say that turning entity data into index > data is not done generically but rather involving domain specific > application code that > > - indicates what makes an index key given an entity > - indicates whether an index entry is still valid given an entity > > That code is also used during the index rebuild and trimming (an M/R Job) > > So validating whether an index entry is valid means to load the entity > pointed to and - before considering it a valid result - validating whether > values of the entity still match with the index. > > The entity is written last, hence when the client dies halfway through the > update you may get stale index entries but nothing else should break. > > For scanning along the index, we are using a chunk iterator that is, we > read n index entries ahead and then do point look ups for the entities. How > would you avoid point-gets when scanning via an index (as most likely, > entities are ordered independently from the index - hence the index)? > > Something really important to note is that there is no intention to build > a completely generic solution, in particular not (this time - unlike the > other post of mine you responded to) taking row versioning into account. > Instead, row time stamps are used to delete stale entries (old entries > after an index rebuild). > > Thanks a lot for your blog pointers. Haven't had time to study in depth > but at first glance there is lot of overlap of what you are proposing and > what I ended up doing considering the first post. > > On the second post: Indeed I have not worried too much about transactional > isolation of updates. If index update and entity update use the same HBase > time stamp, the result should at least be consistent, right? > > Btw. in no way am I claiming originality of my thoughts - in particular I > read http://jyates.github.io/2012/07/09/consistent-enough- > secondary-indexes.html a while back. > > Thanks, > Henning > > Ps.: I might write about this discussion later in my blog > > > On 22.12.2013 23:37, lars hofhansl wrote: > >> The devil is often in the details. On the surface it looks simple. >> >> How specifically are the stale indexes ignored? Are the guaranteed to be >> no races? >> Is deletion handled correctly?Does it work with multiple versions? >> What happens when the client dies 1/2 way through an update? >> It's easy to do eventually consistent indexes. Truly consistent indexes >> without transactions are tricky. >> >> >> Also, scanning an index and then doing point-gets against a main table is >> slow (unless the index is very selective. The Phoenix team measured that >> there is only an advantage if the index filters out 98-99% of the data). >> So then one would revert to covered indexes and suddenly is not so easy >> to detect stale index entries. >> >> I blogged about these issues here: >> http://hadoop-hbase.blogspot.com/2012/10/musings-on- >> secondary-indexes.html >> http://hadoop-hbase.blogspot.com/2012/10/secondary-indexes-part-ii.html >> >> Phoenix has a (pretty involved) solution now that works around the fact >> that HBase has no transactions. >> >> >> -- Lars >> >> >> >> ________________________________ >> From: Henning Blohm <henning.bl...@zfabrik.de> >> To: user <user@hbase.apache.org> >> Sent: Sunday, December 22, 2013 2:11 AM >> Subject: secondary index feature >> >> Lately we have added a secondary index feature to a persistence tier >> over HBASE. Essentially we implemented what is described as "Dual-Write >> Secondary Index" in http://hbase.apache.org/book/secondary.indexes.html. >> I.e. while updating an entity, actually before writing the actual >> update, indexes are updated. Lookup via the index ignores stale entries. >> A recurring rebuild and clean out of stale entries takes care the >> indexes are trimmed and accurate. >> >> None of this was terribly complex to implement. In fact, it seemed like >> something you could do generically, maybe not on the HBASE level itself, >> but as a toolbox / utility style library. >> >> Is anybody on the list aware of anything useful already existing in that >> space? >> >> Thanks, >> Henning Blohm >> >> *ZFabrik Software KG* >> >> T: +49 6227 3984255 >> F: +49 6227 3984254 >> M: +49 1781891820 >> >> Lammstrasse 2 69190 Walldorf >> >> henning.bl...@zfabrik.de <mailto:henning.bl...@zfabrik.de> >> Linkedin <http://www.linkedin.com/pub/henning-blohm/0/7b5/628> >> ZFabrik <http://www.zfabrik.de> >> Blog <http://www.z2-environment.net/blog> >> Z2-Environment <http://www.z2-environment.eu> >> Z2 Wiki <http://redmine.z2-environment.net> >> > > > -- > Henning Blohm > > *ZFabrik Software KG* > > T: +49 6227 3984255 > F: +49 6227 3984254 > M: +49 1781891820 > > Lammstrasse 2 69190 Walldorf > > henning.bl...@zfabrik.de <mailto:henning.bl...@zfabrik.de> > Linkedin <http://www.linkedin.com/pub/henning-blohm/0/7b5/628> > ZFabrik <http://www.zfabrik.de> > Blog <http://www.z2-environment.net/blog> > Z2-Environment <http://www.z2-environment.eu> > Z2 Wiki <http://redmine.z2-environment.net> > >