<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:i18n="http://apache.org/cocoon/i18n/2.1" xmlns:p="http://outerx.org/daisy/1.0#publisher" xmlns:d="http://outerx.org/daisy/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" xml:lang="nl-BE"><title>OUTERTHOUGHT.BLOG</title><subtitle type="html">Musings on Open Source Java and XML</subtitle><id>tag:blog.outerthought.org,2008:Daisy</id><generator uri="http://www.daisycms.org" version="2.1">Daisy</generator><link type="text/html" rel="alternate" href="http://outerthought.org/blog/" /><updated>2012-04-19T12:06:10.000Z</updated><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/Outerthought" /><feedburner:info uri="outerthought" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry><author><name>Outerthought</name></author><published /><updated>2012-04-19T12:06:10.000Z</updated><title>Lily 1.2 is out!</title><link type="text/html" rel="alternate" hreflang="en" href="http://feedproxy.google.com/~r/Outerthought/~3/Y_k8ilkPyA8/493-ot" /><id>tag:blog.outerthought.org,2008:Daisy493-ot</id><content xml:base="http://outerthought.org" type="html">

&lt;p xmlns:jx="http://apache.org/cocoon/templates/jx/1.0" xmlns:ns="http://outerx.org/daisy/1.0"&gt;We&amp;rsquo;re very happy to announce the release of Lily 1.2. It contains a number of
improvements and exciting new features, both on the open source and the
enterprise side of things.&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;Lily Core 1.2&lt;/strong&gt;
&lt;/p&gt;

&lt;p&gt;First of all, Lily has been upgraded and verified to be CDH3u3 compatible.
We&amp;rsquo;re also closely tracking CDH4 evolutions and are confident to be among the
first to ship a CDH4-compliant version later this year.&lt;/p&gt;

&lt;p&gt;The most important two new features of Lily Core 1.2 are along improved
support for HBase-style operations, more importantly Scanners and Map/Reduce
support.&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;Lily Scanners&lt;/strong&gt;
&lt;/p&gt;

&lt;p&gt;Similar to HBase Scanners, Lily Scanners allow you to
&lt;a xmlns:d="http://outerx.org/daisy/1.0" xmlns:urlencoder="xalan://java.net.URLEncoder" xmlns:einclude="http://outerx.org/daisy/1.0#externalinclude" xmlns:p="http://outerx.org/daisy/1.0#publisher" xmlns:ie="http://outerx.org/daisy/1.0#inlineeditor" xmlns:i18n="http://apache.org/cocoon/i18n/2.1" xmlns:lt="http://outerx.org/daisy/1.0#linktransformer" href="http://docs.outerthought.org/lily-docs-current/g4/573-lily.html"&gt;scan
over records&lt;/a&gt;, making use of the natural ordering of records using their row
key or record ID. As you might know, Lily supports both system-generated as well
as user-specified IDs, and experience taught us the latter are commonly used.
Using user-specified IDs, Lily Scanners allow you to influence the storage order
of records in Lily, and iterate over them based on ID, range of IDs
(start/stop), in an indexed fashion, i.e. fast.&lt;/p&gt;

&lt;p&gt;Even better, Scanners support the use of filters to select records based on
filter expressions, which means if you&amp;rsquo;re smart about key design, you might no
longer need other search indexes to Lily content (such as Solr) for simple
search and retrieval operations.&lt;/p&gt;

&lt;p&gt;You can selectively return only a subset of records fields while scanning,
and filter based on RecordType and record ID prefix. Also, using filters, this
allows for (Solr) index rebuilds of partial data sets.&lt;/p&gt;

&lt;p&gt;Lily 1.2 ships with a
&lt;a href="http://docs.outerthought.org/lily-docs-current/g4/573-lily.html#UsingtheCLItoollilyscanrecords"&gt;CLI
tool&lt;/a&gt; allowing to do simple command line Scans.&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;Lily Map/Reduce&lt;/strong&gt;
&lt;/p&gt;

&lt;p&gt;Even though Map/Reduce was already being used for scalable batch rebuilding
of search indexes, it wasn&amp;rsquo;t generally available for people that wanted to
process Lily data in map-reduce style for other purposes.&lt;/p&gt;

&lt;p&gt;With the 1.2 release, Lily supports a LilyScanInputFormat which allows you to
use Scanners (and filters) to specify the input to a Lily-based map/reduce job.
Lily ships with
&lt;a href="http://docs.outerthought.org/lily-docs-current/g4/570-lily.html"&gt;Maven
artefacts for generating&lt;/a&gt; a skeleton M/R job, too.&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;Lily testing framework&lt;/strong&gt;
&lt;/p&gt;

&lt;p&gt;For those of you using the Lily test framework to develop Lily client
applications, you will find startup and tear-down times of the &amp;lsquo;Lily Embed&amp;rsquo; tool
to be much shorter. Being software engineers ourselves for a long time, we care
a lot about the engineer&amp;rsquo;s experience when developing against Lily. With this
improvement, running a Lily development workbench on a laptop or workstation,
building and testing has become much more efficient.&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;Lily Enterprise 1.2&lt;/strong&gt;
&lt;/p&gt;

&lt;p&gt;The 1.2 release of Lily Enterprise contains two major improvements: a better,
more stable cluster installer, and support for Pentaho Kettle for ETL
operations.&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;Pentaho Data Integration support&lt;/strong&gt;
&lt;/p&gt;

&lt;p&gt;Lily is often used as the central data aggregation tier in enterprise
deployments, and we want to make the task of bringing data into Lily as easy as
possible.&lt;/p&gt;

&lt;p&gt;Lily Enterprise 1.2 contains a
&lt;a href="http://docs.outerthought.org/lilyenterprise-docs-current/539-lily/581-lily.html"&gt;Kettle
LilyOutput plugin&lt;/a&gt;. Kettle, or Pentaho Data Integration, is a powerful ETL
tool that connects to many different data sources. Using a simple, UI-based
configuration, the Lily Kettle integration allows you to effortlessly, and most
importantly without any coding, set up a transformation and loading pipeline to
inject data into the Lily Data Repository from a variety of sources, such as
relational databases, static files, and even enterprise back-end systems.&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;Roadmap&lt;/strong&gt;
&lt;/p&gt;

&lt;p&gt;Starting with this release, we are now committed to regular releases of Lily
Core and Enterprise. We will have three major releases per year &amp;ndash; with Lily
Enterprise customers having access to schedule and planned features.&lt;/p&gt;

&lt;p&gt;Thanks for reading this far, and we hope you will enjoy using Lily 1.2 as
much as we enjoyed building it.&lt;/p&gt;

&lt;img src="http://feeds.feedburner.com/~r/Outerthought/~4/Y_k8ilkPyA8" height="1" width="1"/&gt;</content><feedburner:origLink>http://outerthought.org/blog/493-ot</feedburner:origLink></entry><entry xmlns:s="http://outerx.org/daisywiki/1.0#serializer"><author><name>Outerthought</name></author><published /><updated>2012-02-17T08:32:38.000Z</updated><title>Outerthought joins NGDATA</title><link type="text/html" rel="alternate" hreflang="en" href="http://feedproxy.google.com/~r/Outerthought/~3/x_ZpNB7bn2Y/492-ot" /><id>tag:blog.outerthought.org,2008:Daisy492-ot</id><content xml:base="http://outerthought.org" type="html">

&lt;p xmlns:jx="http://apache.org/cocoon/templates/jx/1.0" xmlns:ns="http://outerx.org/daisy/1.0"&gt;I have some really exciting news to share with you today: Outerthought is now
part of a larger company that is committed to bringing Lily to the next level.&amp;nbsp;
&lt;/p&gt;

&lt;p&gt;As interest in Lily was growing at an increasingly fast pace, it became clear
that it deserved a strong, growth-targeted and globally-oriented company with a
world-class management team.&lt;/p&gt;

&lt;p&gt;I'm therefore extremely excited to announce that Outerthought is now part of
&lt;a xmlns:d="http://outerx.org/daisy/1.0" xmlns:urlencoder="xalan://java.net.URLEncoder" xmlns:einclude="http://outerx.org/daisy/1.0#externalinclude" xmlns:p="http://outerx.org/daisy/1.0#publisher" xmlns:ie="http://outerx.org/daisy/1.0#inlineeditor" xmlns:i18n="http://apache.org/cocoon/i18n/2.1" xmlns:lt="http://outerx.org/daisy/1.0#linktransformer" href="http://www.ngdata.com/"&gt;NGDATA&lt;/a&gt;, a Big Data software company that
makes sense of your data. NGDATA is planning to secure additional capital to
accelerate the development and roll-out of Lily&amp;rsquo;s roadmap and to support
business development activities in the United States. We will make Lily into the
best Big Data management platform out there, with a special focus on large-scale
machine learning and recommendations in real-time.&lt;/p&gt;

&lt;p&gt;My role will be VP Product of NGDATA, listening to and working with customers
and partners, market research and analysts, and generally making sure Lily has
an awesome roadmap. I welcome Luc Burgelman (CEO), Frank Hamerlinck (COO) and
J&amp;uuml;rgen Ingels as co-founders and private investors of NGDATA, and Anne-Mie Poot
as our VP HR.&lt;/p&gt;

&lt;p&gt;I'm really proud of what Outerthought has achieved in the Big Data space so
far, and the future is looking really promising. I'd also like to thank the
Outerthought team for their effort and contribution in getting us where we are
today! Thanks to anyone who helped us along the way - you won't be disappointed
with what comes next.&lt;/p&gt;

&lt;p&gt;The official announcement can be read on the NGDATA website -
&lt;a href="http://ngdata.com/site/news/96-ng.html"&gt;http://ngdata.com/site/news/96-ng.html&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;Steven Noels&lt;br&gt;
CEO Outerthought,&lt;br&gt;
VP Product NGDATA.&lt;/p&gt;

&lt;img src="http://feeds.feedburner.com/~r/Outerthought/~4/x_ZpNB7bn2Y" height="1" width="1"/&gt;</content><feedburner:origLink>http://outerthought.org/blog/492-ot</feedburner:origLink></entry><entry xmlns:s="http://outerx.org/daisywiki/1.0#serializer"><author><name>Outerthought</name></author><published /><updated>2012-02-08T15:54:05.000Z</updated><title>A First Exploration Of SolrCloud</title><link type="text/html" rel="alternate" hreflang="en" href="http://feedproxy.google.com/~r/Outerthought/~3/ze2j8OiWXBE/491-ot" /><id>tag:blog.outerthought.org,2008:Daisy491-ot</id><content xml:base="http://outerthought.org" type="html">

&lt;p xmlns:jx="http://apache.org/cocoon/templates/jx/1.0" xmlns:ns="http://outerx.org/daisy/1.0"&gt;SolrCloud has recently been in
&lt;a xmlns:d="http://outerx.org/daisy/1.0" xmlns:urlencoder="xalan://java.net.URLEncoder" xmlns:einclude="http://outerx.org/daisy/1.0#externalinclude" xmlns:p="http://outerx.org/daisy/1.0#publisher" xmlns:ie="http://outerx.org/daisy/1.0#inlineeditor" xmlns:i18n="http://apache.org/cocoon/i18n/2.1" xmlns:lt="http://outerx.org/daisy/1.0#linktransformer" href="http://www.lucidimagination.com/blog/2012/01/23/solrcloud-is-coming-and-looking-to-mix-in-even-more-nosql/"&gt;the&lt;/a&gt;
&lt;a href="http://blog.sematext.com/2012/02/01/solrcloud-distributed-realtime-search/"&gt;news&lt;/a&gt;
and was merged into Solr trunk, so it was high time to have a fresh look at it.
&lt;/p&gt;

&lt;p&gt;The &lt;a href="http://wiki.apache.org/solr/SolrCloud"&gt;SolrCloud wiki page&lt;/a&gt;
gives various examples but left a few things unclear for me. The examples only
show Solr instances which host one core/shard, and it doesn&amp;rsquo;t go deep on the
relation between cores, collections and shards, or how to manage configurations.
&lt;/p&gt;

&lt;p&gt;In this blog, we will have a look at an example where we host multiple shards
per instance, and explain some details along the way.&lt;/p&gt;

&lt;p&gt;The setup we are going to create is shown in this diagram.&lt;/p&gt;

&lt;p align="center"&gt;
&lt;img alt="solrcloud sample setup" title="solrcloud sample setup" src="/blog/490-ot/version/default/part/ImageData/data/solrcloud sample setup.png"&gt;&lt;/p&gt;

&lt;h3&gt;SolrCloud terminology&lt;/h3&gt;

&lt;p&gt;In SolrCloud you can have multiple collections. Collections can be divided
into partitions, these partitions are called slices. Each slice can exist in
multiple copies, these copies of the same slice are called shards. So the word
shard has a bit of a confusing meaning in SolrCloud, it is rather a replica than
a partition. One of the shards within a slice is the leader, though this is not
fixed: any shard can become the leader through a leader-election process.&lt;/p&gt;

&lt;p&gt;Each shard is a physical index, so one shard corresponds to one Solr core.
&lt;/p&gt;

&lt;p&gt;If you look at the SolrCloud wiki page, you won&amp;rsquo;t find the word slice
[anymore]. It seems like the idea is to hide the use of this word, though once
you start looking a bit deeper you will encounter it anyway so it&amp;rsquo;s good to know
about it. It&amp;rsquo;s also good to know that the words shard and slice are often used
in ambiguous ways, switching one for the other (even in the sources). Once you
know this, things become more comprehensible. An interesting
&lt;a href="http://markmail.org/message/gu3nauvtljb5w6av"&gt;quote&lt;/a&gt; in this regard:
&amp;ldquo;removing that ambiguity by introducing another term seemed to add more
perceived complexity&amp;rdquo;. In this article I'll use the words slice and shard as
defined above, so that we can distinguish the two concepts.&lt;/p&gt;

&lt;p&gt;In SolrCloud, the Solr configuration files like schema.xml and solrconfig.xml
are stored in ZooKeeper. You can upload multiple configurations to ZooKeeper,
each collection can be associated with one configuration. The Solr instances
hence don&amp;rsquo;t need the configuration files to be on the file system, they will
read them from ZooKeeper.&lt;/p&gt;

&lt;h3&gt;Running ZooKeeper&lt;/h3&gt;

&lt;p&gt;Let&amp;rsquo;s start by launching a ZooKeeper instance. While Solr allows to run an
embedded ZooKeeper instance, I find that this rather complicates things.
ZooKeeper is responsible for storing coordination and configuration information
for the cluster, and should be highly available. By running it separately, we
can start and stop Solr instances without having to think about which one(s)
embed ZooKeeper.&lt;/p&gt;

&lt;p&gt;For the purpose of this article, you can get it running like this:&lt;/p&gt;

&lt;ul&gt;

&lt;li&gt;
&lt;a href="http://www.apache.org/dyn/closer.cgi/zookeeper/"&gt;download ZooKeeper
3.3&lt;/a&gt;. Don&amp;rsquo;t take version 3.4, as it&amp;rsquo;s not recommended for production yet.
&lt;/li&gt;

&lt;li&gt;extract the download&lt;/li&gt;

&lt;li&gt;copy conf/zoo_sample.cfg to conf/zoo.cfg&lt;/li&gt;

&lt;li&gt;mkdir /tmp/zookeeper (path can be changed in zoo.cfg)&lt;/li&gt;

&lt;li&gt;./bin/zkServer.sh start&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;And that&amp;rsquo;s it, you have ZooKeeper running.&lt;/p&gt;

&lt;h3&gt;Setting up Solr instance directories&lt;/h3&gt;

&lt;p&gt;We are going to run two Solr instances, thus we&amp;rsquo;ll need two Solr instance
directories.&lt;/p&gt;

&lt;p&gt;Let&amp;rsquo;s create two directories like this:&lt;/p&gt;

&lt;pre&gt;mkdir -p ~/solrcloudtest/sc_server_1
mkdir -p ~/solrcloudtest/sc_server_2&lt;/pre&gt;

&lt;p&gt;Create the file ~/solrcloudtest/sc_server_1/solr.xml containing:&lt;/p&gt;

&lt;pre&gt;&amp;lt;solr persistent="true"&amp;gt;
&amp;nbsp; &amp;lt;cores adminPath="/admin/cores" hostPort=&amp;rdquo;8501&amp;rdquo;&amp;gt;
&amp;nbsp; &amp;lt;/cores&amp;gt;
&amp;lt;/solr&amp;gt;&lt;/pre&gt;

&lt;p&gt;Create the file ~/solrcloudtest/sc_server_2/solr.xml containing (note the
different hostPort value):&lt;/p&gt;

&lt;pre&gt;&amp;lt;solr persistent="true"&amp;gt;
 &amp;nbsp;&amp;lt;cores adminPath="/admin/cores" hostPort=&amp;rdquo;8502&amp;rdquo;&amp;gt;
 &amp;nbsp;&amp;lt;/cores&amp;gt;
&amp;lt;/solr&amp;gt;&lt;/pre&gt;

&lt;p&gt;We need to specify the hostPort attribute since Solr can&amp;rsquo;t detect the port,
it falls back to the default 8983 when not specified.&lt;/p&gt;

&lt;p&gt;This is all we need: the actual core configuration will be uploaded to
ZooKeeper in the next section.&lt;/p&gt;

&lt;h3&gt;Creating a Solr configuration in ZooKeeper&lt;/h3&gt;

&lt;p&gt;As explained before, the Solr configuration needs to be available in
ZooKeeper rather than on the file system.&lt;/p&gt;

&lt;p&gt;Currently, you can upload a configuration directory from the file system to
ZooKeeper as part of the Solr startup. It is also possible to run ZkController&amp;rsquo;s
main method for this purpose
(&lt;a href="https://issues.apache.org/jira/browse/SOLR-2805"&gt;SOLR-2805&lt;/a&gt;), but
as there&amp;rsquo;s no script to launch it, the easiest way right now to upload a
configuration is by starting Solr:&lt;/p&gt;

&lt;pre&gt;export SOLR_HOME=/path/to/solr-trunk/solr

# important: move into one the instance directory!
# (otherwise Solr will start up with defaults and create a core etc.)
cd sc_server_1

java \
&amp;nbsp;-Djetty.port=8501 \
&amp;nbsp;-Djetty.home=$SOLR_HOME/example/ \
&amp;nbsp;-Dsolr.solr.home=. \
&amp;nbsp;&lt;strong&gt;-Dbootstrap_confdir=$SOLR_HOME/example/solr/conf &lt;/strong&gt;\
&amp;nbsp;&lt;strong&gt;-Dcollection.configName=config1&lt;/strong&gt; \
&amp;nbsp;-DzkHost=localhost:2181 \
&amp;nbsp;-jar $SOLR_HOME/example/start.jar&lt;/pre&gt;

&lt;p&gt;Now that the configuration is uploaded, you can stop this Solr instance again
(ctrl+c).&lt;/p&gt;

&lt;p&gt;We can now check in ZooKeeper that the configuration has been uploaded, and
that no collections have been created yet.&lt;/p&gt;

&lt;p&gt;For this, go to the ZooKeeper directory, and run &lt;tt&gt;./bin/zkCli.sh&lt;/tt&gt;, and
do the following commands:&lt;/p&gt;

&lt;pre&gt;[zk: localhost:2181(CONNECTED) 1] ls /configs
[config1]

[zk: localhost:2181(CONNECTED) 2] ls /collections
[]&lt;/pre&gt;

&lt;p&gt;You could repeat this process to upload more configurations.&lt;/p&gt;

&lt;p&gt;If you would like to change a configuration later on, you essentially have to
upload it again in the same way. The various Solr cores that make use of that
configuration won&amp;rsquo;t be reloaded automatically however
(&lt;a href="https://issues.apache.org/jira/browse/SOLR-3071"&gt;SOLR-3071&lt;/a&gt;).&lt;/p&gt;

&lt;h3&gt;Starting the Solr servers&lt;/h3&gt;

&lt;p&gt;All SolrCloud magic is activated by specifying the zkHost parameter. Without
this parameter, you run Solr &amp;lsquo;classic&amp;rsquo;, with the parameter, you run SolrCloud.
If you look into the source code, you will see that this parameter causes the
creation of a ZkController, and at various places checks of the kind
&amp;lsquo;zkController != null&amp;rsquo; are done to change behavior when in cloud mode.&lt;/p&gt;

&lt;p&gt;Open two shells, and start the two Solr instances:&lt;/p&gt;

&lt;pre&gt;export SOLR_HOME=/path/to/solr-trunk/solr
cd sc_server_1
java \
&amp;nbsp;-Djetty.port=8501 \
&amp;nbsp;-Djetty.home=$SOLR_HOME/example/ \
&amp;nbsp;-Dsolr.solr.home=. \
&amp;nbsp;-DzkHost=localhost:2181 \
&amp;nbsp;-jar $SOLR_HOME/example/start.jar&lt;/pre&gt;

&lt;p&gt;and (note: different instance dir &amp;amp; jetty port)&lt;/p&gt;

&lt;pre&gt;export SOLR_HOME=/path/to/solr-trunk/solr
cd sc_server_2
java \
&amp;nbsp;-Djetty.port=8502 \
&amp;nbsp;-Djetty.home=$SOLR_HOME/example/ \
&amp;nbsp;-Dsolr.solr.home=. \
&amp;nbsp;-DzkHost=localhost:2181 \
&amp;nbsp;-jar $SOLR_HOME/example/start.jar&lt;/pre&gt;

&lt;p&gt;Note that now, we don&amp;rsquo;t have to specify the boostrap_confdir and
collection.configName properties anymore (though that last one can still be
useful as default sometimes, but not with the way we will create collections
&amp;amp; shards below).&lt;/p&gt;

&lt;p&gt;We have neither added the -Dnumshards parameter, which you might have
encountered elsewhere. When you manually assign cores to shards as we will do
below, I don&amp;rsquo;t think it serves any purpose.&lt;/p&gt;

&lt;p&gt;So the situation now is that we have two Solr instances running, both with 0
cores.&lt;/p&gt;

&lt;h3&gt;Define the cores, collections, slices, shards&lt;/h3&gt;

&lt;p&gt;We are now going to create cores, and assign each core to a specific
collection and slice. It is not necessary to define collections &amp;amp; shards
anywhere, they are implicit by the fact that there are cores that refer them.
&lt;/p&gt;

&lt;p&gt;In our example, the collection is called 'collectionOne' and the slices are
called 'slice1' and 'slice2'.&lt;/p&gt;

&lt;p&gt;Let&amp;rsquo;s start with creating a core on the first server:&lt;/p&gt;

&lt;pre&gt;curl 'http://localhost:8501/solr/admin/cores?action=CREATE&amp;amp;name=core_collectionOne_slice1_shard1&amp;amp;collection=collectionOne&amp;amp;shard=slice1&amp;amp;collection.configName=config1'&lt;/pre&gt;

&lt;p&gt;(in the URL above, and the solr.xml snippet below, the word 'shard' is used
for 'slice')&lt;/p&gt;

&lt;p&gt;If you have a look now at sc_server_1/solr.xml, you will see the core was
added:&lt;/p&gt;

&lt;pre&gt;&amp;lt;?xml version="1.0" encoding="UTF-8" ?&amp;gt;
&amp;lt;solr persistent="true"&amp;gt;
  &amp;lt;cores adminPath="/admin/cores" zkClientTimeout="10000" hostPort="8501"
hostContext="solr"&amp;gt;
&amp;nbsp;   &amp;lt;core
       name="core_collectionOne_slice1_shard1"
       collection="collectionOne"
       shard="slice1"
       instanceDir="core_collectionOne_slice1_shard1/"/&amp;gt;
  &amp;lt;/cores&amp;gt;
&amp;lt;/solr&amp;gt;&lt;/pre&gt;

&lt;p&gt;AFAIU the information in ZooKeeper takes precedence, so the attributes
collection and shard on the core above serve more as documentation, or they are
of course also relevant if you would create cores by listing them in solr.xml
rather than using the cores-admin API. Actually listing them in solr.xml might
be simpler than doing a bunch of API calls, but there is currently one
limitation: you can&amp;rsquo;t specify the configName this way.&lt;/p&gt;

&lt;p&gt;In ZooKeeper, you can verify this collection is associated with the config1
configuration:&lt;/p&gt;

&lt;pre&gt;[zk: localhost:2181(CONNECTED) 5] get /collections/collectionOne
{"configName":"config1"}&lt;/pre&gt;

&lt;p&gt;And you can also get an overview of all collections, slices and shards like
this:&lt;/p&gt;

&lt;pre&gt;[zk: localhost:2181(CONNECTED) 0] get /clusterstate.json
{
  "collectionOne": {
    "slice1": {
      "fietsbel:8501_solr_core_collectionOne_slice1_shard1": {
        "shard_id":"slice1",
        "leader":"true",
        "state":"active",
        "core":"core_collectionOne_slice1_shard1",
        "collection":"collectionOne",
        "node_name":"fietsbel:8501_solr",
        "base_url":"http://fietsbel:8501/solr"
      }
    }
  }
}&lt;/pre&gt;

&lt;p&gt;(the somewhat strange "shard_id":"slice1" is just a back-pointer from the
shard to the slice to which it belongs)&lt;/p&gt;

&lt;p&gt;Now let&amp;rsquo;s create the remaining cores: one more on server 1, and two on server
2 (notice the different port numbers to which we send these requests).&lt;/p&gt;

&lt;pre&gt;curl 'http://localhost:8502/solr/admin/cores?action=CREATE&amp;amp;name=core_collectionOne_slice2_shard1&amp;amp;collection=collectionOne&amp;amp;shard=slice2&amp;amp;collection.configName=config1'

curl 'http://localhost:8501/solr/admin/cores?action=CREATE&amp;amp;name=core_collectionOne_slice2_shard2&amp;amp;collection=collectionOne&amp;amp;shard=slice2&amp;amp;collection.configName=config1'

curl 'http://localhost:8502/solr/admin/cores?action=CREATE&amp;amp;name=core_collectionOne_slice1_shard2&amp;amp;collection=collectionOne&amp;amp;shard=slice1&amp;amp;collection.configName=config1'&lt;/pre&gt;

&lt;p&gt;Let&amp;rsquo;s have a look in ZooKeeper at the current state of the clusterstate.json:
&lt;/p&gt;

&lt;pre&gt;[zk: localhost:2181(CONNECTED) 0] get /clusterstate.json
{
  "collectionOne": {
    "slice1": {
      "fietsbel:8501_solr_core_collectionOne_slice1_shard1": {
        "shard_id":"slice1",
        "leader":"true",
        "state":"active",
        "core":"core_collectionOne_slice1_shard1",
        "collection":"collectionOne",
        "node_name":"fietsbel:8501_solr",
        "base_url":"http://fietsbel:8501/solr"
      },
      "fietsbel:8502_solr_core_collectionOne_slice1_shard2": {
        "shard_id":"slice1",
        "state":"active",
        "core":"core_collectionOne_slice1_shard2",
        "collection":"collectionOne",
        "node_name":"fietsbel:8502_solr",
        "base_url":"http://fietsbel:8502/solr"
      }
    },
    "slice2": {
      "fietsbel:8502_solr_core_collectionOne_slice2_shard1": {
        "shard_id":"slice2",
        "leader":"true",
        "state":"active",
        "core":"core_collectionOne_slice2_shard1",
        "collection":"collectionOne",
        "node_name":"fietsbel:8502_solr",
        "base_url":"http://fietsbel:8502/solr"
      },
      "fietsbel:8501_solr_core_collectionOne_slice2_shard2": {
        "shard_id":"slice2",
        "state":"active",
        "core":"core_collectionOne_slice2_shard2",
        "collection":"collectionOne",
        "node_name":"fietsbel:8501_solr",
        "base_url":"http://fietsbel:8501/solr"
      }
    }
  }
}&lt;/pre&gt;

&lt;p&gt;We see we have:&lt;/p&gt;

&lt;ul&gt;

&lt;li&gt;one collection named collectionOne&lt;/li&gt;

&lt;li&gt;two slices named slice1 and slice2&lt;/li&gt;

&lt;li&gt;each slice has two shards. Within each slice, one shard is the leader (see
"leader":"true"), the other(s) are replicas. Of each slice, one shard is hosted
in each Solr instance.&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;Adding some documents&lt;/h3&gt;

&lt;p&gt;Now let&amp;rsquo;s try our setup works by adding some documents:&lt;/p&gt;

&lt;pre&gt;cd $SOLR_HOME/example/exampledocs
java -Durl=http://localhost:8501/solr/&lt;strong&gt;core_collectionOne_slice1_shard1&lt;/strong&gt;/update -jar post.jar *.xml&lt;/pre&gt;

&lt;p&gt;We sent the request to one specific core, but you could have picked any other
core and the end result would be the same. The request will be forwarded
automatically to the leader shard of the appropriate slice. The slice is
selected based on the hash of the id of the document.&lt;/p&gt;

&lt;p&gt;Use the admin stats page to see documents got added to all cores:&lt;/p&gt;

&lt;p&gt;

&lt;a href="http://localhost:8501/solr/core_collectionOne_slice1_shard1/admin/stats.jsp"&gt;http://localhost:8501/solr/core_collectionOne_slice1_shard1/admin/stats.jsp&lt;/a&gt;

&lt;br&gt;

&lt;a href="http://localhost:8502/solr/core_collectionOne_slice1_shard2/admin/stats.jsp"&gt;http://localhost:8502/solr/core_collectionOne_slice1_shard2/admin/stats.jsp&lt;/a&gt;

&lt;/p&gt;

&lt;p&gt;

&lt;a href="http://localhost:8502/solr/core_collectionOne_slice2_shard1/admin/stats.jsp"&gt;http://localhost:8502/solr/core_collectionOne_slice2_shard1/admin/stats.jsp&lt;/a&gt;

&lt;br&gt;

&lt;a href="http://localhost:8501/solr/core_collectionOne_slice2_shard2/admin/stats.jsp"&gt;http://localhost:8501/solr/core_collectionOne_slice2_shard2/admin/stats.jsp&lt;/a&gt;

&lt;/p&gt;

&lt;p&gt;In my case, the cores for slice1 got 16 documents, those for slice2, 12.
Unlike the traditional Solr replication, with SolrCloud updates are sent
directly to the replica's.&lt;/p&gt;

&lt;h3&gt;Querying&lt;/h3&gt;

&lt;p&gt;Let&amp;rsquo;s just query all documents. Again, we send the request to one particular
shard:&lt;/p&gt;

&lt;p&gt;

&lt;a href="http://localhost:8501/solr/core_collectionOne_slice1_shard1/select?q=*:*"&gt;http://localhost:8501/solr/core_collectionOne_slice1_shard1/select?q=*:*&lt;/a&gt;

&lt;/p&gt;

&lt;p&gt;You will see the numFound=&amp;rdquo;28&amp;rdquo;, the sum of 16 and 12.&lt;/p&gt;

&lt;p&gt;What happens internally is that when you sent a request to a core, when in
SolrCloud mode, Solr will look up what collection the core is associated with,
and do a distributed query across all slices (it will pick one shard for each
slice).&lt;/p&gt;

&lt;p&gt;The SolrCloud wiki page gives the suggestion that you can use the collection
name in the URL (like /solr/collection1/select). In our example, this would then
be /solr/collectionOne/select. This is however not the case, but rather a
particularity of that example. As long as you don&amp;rsquo;t host more than one slice and
shard of the same collection in one Solr server, it can make sense to use such a
core naming strategy.&lt;/p&gt;

&lt;h3&gt;Starting from scratch&lt;/h3&gt;

&lt;p&gt;When playing around with this stuff, you might want to start from scratch
sometimes. In such case, don&amp;rsquo;t forget you have to remove data in three places:
(1) the state stored in ZooKeeper (2) the cores defined in solr.xml and (3) the
instance directories of these cores.&lt;/p&gt;

&lt;p&gt;When writing the first draft of this article, I was using just one Solr
instance and tried to have all the 4 cores (including replica's) in one Solr
instance. Turns out there was a bug that prevents this from working correctly
(&lt;a href="https://issues.apache.org/jira/browse/SOLR-3108"&gt;SOLR-3108&lt;/a&gt;).&lt;/p&gt;

&lt;h3&gt;Managing slices &amp;amp; shards&lt;/h3&gt;

&lt;p&gt;Once you have defined a collection, you can not (or rather should not) add
new slices to it, since documents won&amp;rsquo;t be automatically moved to the new slice
to fit with the hash-based partitioning
(&lt;a href="https://issues.apache.org/jira/browse/SOLR-2595"&gt;SOLR-2595&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Adding more replica shards should be no problem though. While above we have
used a very explicit way of assigning each core to a particular slice, you can
actually leave that parameter off and Solr will automatically assign it to some
slice within the collection. (I guess here the -Dnumshards parameter kicks in to
decide whether the new core should be a slice or a shard)&lt;/p&gt;

&lt;p&gt;How about removing replicas? It can be done, but manually. You have to unload
the core and remove the related state in ZooKeeper. This is an area that will be
improved upon later.
(&lt;a href="https://issues.apache.org/jira/browse/SOLR-3080"&gt;SOLR-3080&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Another interesting thing to note is that when your run in SolrCloud mode,
all cores will automatically take part in the cloud thing. If you add a core
without specifying the collection, a collection named after that core will be
created. You can&amp;rsquo;t mix &amp;lsquo;classic&amp;rsquo; cores and &amp;lsquo;cloud&amp;rsquo; cores in one Solr instance.
&lt;/p&gt;

&lt;h3&gt;Conclusion&lt;/h3&gt;

&lt;p&gt;In this article we have barely touched the surface of everything SolrCloud
is: there&amp;rsquo;s the update log for durability and recovery, the sync&amp;rsquo;ing between
replica&amp;rsquo;s, the details of distributed querying and updating, the special
_version_ field to help with some of the these points, the coordination
(election of overseer &amp;amp; shard leaders), &amp;hellip; Much interesting stuff to explore!
&lt;/p&gt;

&lt;p&gt;As becomes clear from this article, SolrCloud isn't as easy to use yet as
ElasticSearch. It still needs polishing and there's more manual work involved in
setting it up. To some extent this has its advantages, as long as it's clear
what you can expect from the system, and what you have to take care of yourself.
Anyway, it's great to see that the Solr developers were able to catch up with
the cloud world.&lt;/p&gt;

&lt;img src="http://feeds.feedburner.com/~r/Outerthought/~4/ze2j8OiWXBE" height="1" width="1"/&gt;</content><feedburner:origLink>http://outerthought.org/blog/491-ot</feedburner:origLink></entry><entry xmlns:s="http://outerx.org/daisywiki/1.0#serializer"><author><name>Outerthought</name></author><published /><updated>2011-12-14T14:18:53.000Z</updated><title>Lily 1.1 is out: what's new?</title><link type="text/html" rel="alternate" hreflang="en" href="http://feedproxy.google.com/~r/Outerthought/~3/yqMNxbd6vL4/488-ot" /><id>tag:blog.outerthought.org,2008:Daisy488-ot</id><content xml:base="http://outerthought.org" type="html">

&lt;p xmlns:jx="http://apache.org/cocoon/templates/jx/1.0" xmlns:ns="http://outerx.org/daisy/1.0"&gt;We have a nice Christmas present for you:
&lt;a xmlns:d="http://outerx.org/daisy/1.0" xmlns:urlencoder="xalan://java.net.URLEncoder" xmlns:einclude="http://outerx.org/daisy/1.0#externalinclude" xmlns:p="http://outerx.org/daisy/1.0#publisher" xmlns:ie="http://outerx.org/daisy/1.0#inlineeditor" xmlns:i18n="http://apache.org/cocoon/i18n/2.1" xmlns:lt="http://outerx.org/daisy/1.0#linktransformer" href="http://www.lilyproject.org/"&gt;Lily 1.1 is out&lt;/a&gt;, and there's
improvements for everyone: developers, administrators and Lily hackers. Read
more about the exciting new stuff in Lily 1.1 below!&lt;/p&gt;

&lt;h3&gt;Complex Field Types&lt;/h3&gt;

&lt;p&gt;Lily adds a high-level data model on top of HBase. Originally, the model was
a simple list of fields stored within records, but we added some field types
making that model a whole lot more interesting. A first addition is the RECORD
value type. You can now store records inside records, which is useful to store
structured data in fields. For indexing purposes, you can address sub-record
data as if it are linked records, using dereferencing.&lt;/p&gt;

&lt;p&gt;Two other cool new value types are LIST and PATH, which allow for far more
flexible&amp;nbsp;modeling&amp;nbsp;than the previous multi-value and hierarchy field properties.
At the schema level, we adopted a generics style of defining value types, for
instance LIST&amp;lt;LIST&amp;lt;STRING&amp;gt;&amp;gt; defines a field that will contain a list
of lists of strings. Finally, we also added a BYTEARRAY value type for raw data
storage.&lt;/p&gt;

&lt;h3&gt;Conditional updates&lt;/h3&gt;

&lt;p&gt;If you're familiar with multi-user environments you sure know about the
problem of concurrent updates. For these situations, Lily now provides a
lock-free, optimistic concurrency control feature we call conditional updates.
The update and delete methods allow one to add a list of mutation conditions
that need to be satisfied before the the update or delete will be applied.&amp;nbsp;&lt;/p&gt;

&lt;p&gt;For concurrency control, you can require that the value of a field needs to
be the same as when the record was read before the update.&lt;/p&gt;

&lt;h3&gt;Test framework&lt;/h3&gt;

&lt;p&gt;Lily 1.1 ships with a toolchest for Java developers that want to run unit
tests against an HBase/Lily application stack. The stack can be launched
embedded or externally, with simple scripts straight out of the Lily
distribution. You can also request a 'state reset', clearing a single node
instance of Lily for subsequent test runs. Yes, you can now run Lily, HBase,
Zookeeper, HDFS, Map/Reduce and Solr in a single VM, with a single command.&lt;/p&gt;

&lt;h3&gt;Server-side plugins&lt;/h3&gt;

&lt;p&gt;For the fearless Lily repository hacker, we offer two hooks to expand
functionality of the Lily server process. There's decorators which can intercept
any CRUD operation for pre- or post-execution of side-effect operations (like
modifying a field value before actually committing it).&lt;/p&gt;

&lt;h3&gt;Rowlog sharding&lt;/h3&gt;

&lt;p&gt;The global rowlog queue is now distributed across a pre-split table, with
inserts and deletes going to several region servers. This will lead to superior
performance on write-or update-heavy multi-node cluster setups.&lt;/p&gt;

&lt;h3&gt;API improvements&lt;/h3&gt;

&lt;p&gt;Our first customers (*waves to our French friends*) found our API to be a tad
too verbose and suggested a Builder pattern approach. We listened and unveil a
totally new (but optional) method-chaining Builder API for the Java API users.
&lt;/p&gt;

&lt;h3&gt;Whirr-based cluster installer&lt;/h3&gt;

&lt;p&gt;For Lily Enterprise customers, we rewrote our cluster installer using Apache
Whirr, being one of the first serious adopters of this exciting Cloud- and
cluster management tool. Using this, installing Lily on many nodes becomes a
breeze. Here's a short movie &amp;nbsp;showing off the new installer.&lt;/p&gt;

&lt;iframe src="http://player.vimeo.com/video/33665673?byline=0" width="600" height="375" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""&gt;&lt;/iframe&gt;

&lt;h3&gt;Performance&lt;/h3&gt;

&lt;p&gt;Thanks to better parallelization, Lily has become considerably faster. You
can now comfortably throw more clients at one Lily cluster and see combined
throughput scale fast.&lt;/p&gt;

&lt;p&gt;All in all, Lily 1.1 was a great release to prepare. We hope you have as much
fun using Lily 1.1 as we had building it. Check it out here:
&lt;a href="http://www.lilyproject.org/"&gt;www.lilyproject.org&lt;/a&gt;.&lt;/p&gt;

&lt;img src="http://feeds.feedburner.com/~r/Outerthought/~4/yqMNxbd6vL4" height="1" width="1"/&gt;</content><feedburner:origLink>http://outerthought.org/blog/488-ot</feedburner:origLink></entry><entry xmlns:s="http://outerx.org/daisywiki/1.0#serializer"><author><name>Outerthought</name></author><published /><updated>2011-10-31T15:08:11.000Z</updated><title>Innovation and collaboration on Big Data recommendations</title><link type="text/html" rel="alternate" hreflang="en" href="http://feedproxy.google.com/~r/Outerthought/~3/SbIlfn_GmUk/487-ot" /><id>tag:blog.outerthought.org,2008:Daisy487-ot</id><content xml:base="http://outerthought.org" type="html">

&lt;p xmlns:jx="http://apache.org/cocoon/templates/jx/1.0" xmlns:ns="http://outerx.org/daisy/1.0"&gt;(press release)&lt;/p&gt;

&lt;p&gt;Outerthought and &lt;a xmlns:d="http://outerx.org/daisy/1.0" xmlns:urlencoder="xalan://java.net.URLEncoder" xmlns:einclude="http://outerx.org/daisy/1.0#externalinclude" xmlns:p="http://outerx.org/daisy/1.0#publisher" xmlns:ie="http://outerx.org/daisy/1.0#inlineeditor" xmlns:i18n="http://apache.org/cocoon/i18n/2.1" xmlns:lt="http://outerx.org/daisy/1.0#linktransformer" href="http://www.oxynade.com/"&gt;Oxynade&lt;/a&gt;, two software
companies from the Belgian Ghent area, are collaborating in the context of the
TWIRL project, a European research project on open platforms able to process,
mine, interlink and fuse data originating from real world applications and
on-line data sources. The research groups
&lt;a href="http://www.ibcn.intec.ugent.be/"&gt;IBBT/Ghent University (IBCN)&lt;/a&gt; and
&lt;a href="http://www.sirris.be/"&gt;Sirris&lt;/a&gt; join their effort.&lt;/p&gt;

&lt;p&gt;The research project sits at the root of new developments in Lily, the Big
Data content repository from Outerthought, that will combine storage, indexing
search with profile management, analytics and content recommendations in its
next versions. The Lily platform is based on Apache Hadoop and HBase and is the
world's first NOSQL/Big Data content repository.&lt;/p&gt;

&lt;p&gt;Hadoop and HBase are being used in large organizations such as TomTom,
Netlog, Twitter, Facebook and Yahoo!, but the technology is still regarded as
complex and finicky to use. Lily makes this technology easy to adopt and use for
every organization with large-scale data management needs.&lt;/p&gt;

&lt;p&gt;"Research without field validation has no purpose", says Steven Noels,
Outerthought CEO, "so we are very happy to be able to collaborate with Oxynade
on the TWIRL project. They provide us with a lot of practical experience and
knowledge about event recommendations, and they possess an immense set of
practical trial data. Also, due to their international growth ambitions, they
are in need of a data platform that can scale widely, which means Lily is a
great fit for them."&lt;/p&gt;

&lt;p&gt;The TWIRL project also got the
&lt;a href="http://www.itea2.org/project/index/view/?project=10098"&gt;EU ITEA
label&lt;/a&gt;, which guarantees high-quality industry research.&lt;/p&gt;

&lt;p&gt;Outerthought and Oxynade receive a Flemish research grant for their
collaboration to the amount of 550.000 EUR for a 100 manmonth project. The
tangible collaboration plans between the industry group and Sirris and IBBT as
research partners had a positive impact on the grant approval.&lt;/p&gt;

&lt;p&gt;Contact:&lt;/p&gt;

&lt;p&gt;Steven Noels - Outerthought - +32 9 338 82 20&lt;br&gt;
Niko Nelissen - Oxynade - &amp;nbsp;+32 9 233 40 09&lt;/p&gt;

&lt;img src="http://feeds.feedburner.com/~r/Outerthought/~4/SbIlfn_GmUk" height="1" width="1"/&gt;</content><feedburner:origLink>http://outerthought.org/blog/487-ot</feedburner:origLink></entry><entry xmlns:s="http://outerx.org/daisywiki/1.0#serializer"><author><name>Outerthought</name></author><published /><updated>2011-08-16T09:39:46.000Z</updated><title>Cloudera partnership and Accenture Innovation Awards</title><link type="text/html" rel="alternate" hreflang="en" href="http://feedproxy.google.com/~r/Outerthought/~3/N8fgfc06KW0/486-ot" /><id>tag:blog.outerthought.org,2008:Daisy486-ot</id><content xml:base="http://outerthought.org" type="html">

&lt;p xmlns:jx="http://apache.org/cocoon/templates/jx/1.0" xmlns:ns="http://outerx.org/daisy/1.0"&gt;As mentioned in our previous newsletter, this Summer is Hot in Lily-land. We
have some more exciting announcements to make:&lt;/p&gt;

&lt;h3&gt;Cloudera Connect&lt;sup&gt;TM&lt;/sup&gt; Partnership&lt;/h3&gt;

&lt;p&gt;We're very happy and proud to be included in the initial list of
&lt;a xmlns:d="http://outerx.org/daisy/1.0" xmlns:urlencoder="xalan://java.net.URLEncoder" xmlns:einclude="http://outerx.org/daisy/1.0#externalinclude" xmlns:p="http://outerx.org/daisy/1.0#publisher" xmlns:ie="http://outerx.org/daisy/1.0#inlineeditor" xmlns:i18n="http://apache.org/cocoon/i18n/2.1" xmlns:lt="http://outerx.org/daisy/1.0#linktransformer" href="http://www.cloudera.com/partners/"&gt;Cloudera Connect&lt;sup&gt;TM&lt;/sup&gt;
Partners&lt;/a&gt;, announced just a couple of days ago. Lily is also being
prominently featured in a Solution Spotlight, explaining the value-add of Lily
on top of the Cloudera Distribution of Hadoop. We're excited to work together
with Cloudera on making Big Data and HBase easier to use for enterprise
developers in retail, media and news.&lt;/p&gt;

&lt;p&gt;

&lt;a href="http://www.cloudera.com/partners/spotlight/outerthought/"&gt;&lt;img alt="Outerthought | Apache Hadoop for the Enterprise | Cloudera" title="Outerthought | Apache Hadoop for the Enterprise | Cloudera" src="/blog/484-ot/version/default/part/ImageData/data/Outerthought | Apache Hadoop for the Enterprise | Cloudera.jpg"&gt;&lt;/a&gt;

&lt;/p&gt;

&lt;p&gt;If you want to learn more about how Lily fits well with Cloudera, a
&lt;a title="Outerthought-Solution-Brief" href="/blog/485-ot/version/default/part/AttachmentData/data/Outerthought-Solution-Brief.pdf"&gt;solution brief is available as well&lt;/a&gt; (application/pdf, 160.9 kB, &lt;a href="/blog/485-ot.html"&gt;info&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;
&lt;img align="right" alt="banner120x60_tulp" title="banner120x60_tulp" src="/blog/483-ot/version/default/part/ImageData/data/banner120x60_tulp.gif"&gt;&lt;/p&gt;

&lt;h3&gt;Accenture Innovation Awards&lt;/h3&gt;

&lt;p&gt;Also, we're
&lt;a href="http://www.innovation-awards.nl/2011/deelnemers/mcht/concept.php?view=VXuIXX8DtZvmBSdAfRIl62pOwtdpBMZZ"&gt;participating
with the Accenture Innovation Awards&lt;/a&gt;, a yearly contest for novel business
and technology ideas.&lt;/p&gt;

&lt;img src="http://feeds.feedburner.com/~r/Outerthought/~4/N8fgfc06KW0" height="1" width="1"/&gt;</content><feedburner:origLink>http://outerthought.org/blog/486-ot</feedburner:origLink></entry><entry xmlns:s="http://outerx.org/daisywiki/1.0#serializer"><author><name>Outerthought</name></author><published /><updated>2011-07-22T06:48:18.000Z</updated><title>Lily Summer season</title><link type="text/html" rel="alternate" hreflang="en" href="http://feedproxy.google.com/~r/Outerthought/~3/l124FzcG6Gc/478-ot" /><id>tag:blog.outerthought.org,2008:Daisy478-ot</id><content xml:base="http://outerthought.org" type="html">

&lt;p xmlns:jx="http://apache.org/cocoon/templates/jx/1.0" xmlns:ns="http://outerx.org/daisy/1.0"&gt;This Summer, we&amp;rsquo;re hard at work on some exciting new features of Lily, while
helping some customers to kick off their new Lily-based projects. It&amp;rsquo;s great to
see our product being used in practice, a truly educational experience for
ourselves as well. Let&amp;rsquo;s have a look at the new stuff.&amp;nbsp;&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;1. Lily Test Framework&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;We&amp;rsquo;ve always said Lily is about developer conveniencing: making the hard bits
easy. At the core of Lily, we&amp;rsquo;re solving the really hard problem of consistent
index maintenance in between HBase and Solr. On the outside however, we also
wanted to make it easy for enterprise devs to Get Things Done with Lily - as if
it is just another database component they already know.&lt;/p&gt;

&lt;p&gt;That means it should be easy to call Lily from inside unit tests, and that
you don&amp;rsquo;t need half-a-cluster per developer to just use Lily and its API to
program against. We wanted something that allows you to launch Lily and all of
its constituents with a single call, embedable, &amp;ldquo;laptop-class&amp;rdquo;-compatible (i.e.
not relying on virtualization tools to launch pre-made Linux images with Lily,
just to run Lily on a developer workstation).&amp;nbsp;&lt;/p&gt;

&lt;p&gt;So we went off and created a
&lt;a xmlns:d="http://outerx.org/daisy/1.0" xmlns:urlencoder="xalan://java.net.URLEncoder" xmlns:einclude="http://outerx.org/daisy/1.0#externalinclude" xmlns:p="http://outerx.org/daisy/1.0#publisher" xmlns:ie="http://outerx.org/daisy/1.0#inlineeditor" xmlns:i18n="http://apache.org/cocoon/i18n/2.1" xmlns:lt="http://outerx.org/daisy/1.0#linktransformer" href="http://docs.outerthought.org/lily-docs-trunk/g4/515-lily.html"&gt;Lily
test framework&lt;/a&gt;, that launches Lily, HBase, Hadoop, Solr and friends quickly,
easily and efficiently, with sane single-node preconfigurations and some hooks
to cycle data initialization as well. It&amp;rsquo;s available from trunk since a couple
of days. Some people will be really happy to learn that this&amp;nbsp;&lt;strong&gt;Lily test
framework supports Windows&lt;/strong&gt; (except currently for map/reduce operations)
as well.&amp;nbsp;The Lily Test Framework allows you to call Lily from inside unit tests,
either standalone or embedded. The standalone mode can also be used to quickly
set up a single-node, single-process instance of Lily to play around with.&lt;/p&gt;

&lt;p&gt;Adding onto that, there&amp;rsquo;s a Maven goal
&lt;a href="http://docs.outerthought.org/lily-docs-trunk/g4/517-lily.html"&gt;available
now&lt;/a&gt; to quickly set up a fresh, empty Lily project.&lt;/p&gt;

&lt;p&gt;All this might sound pretty mundane, and to some extend it is, but it's one
of the babysteps we see necessary to emphasize that we're really serious about
bringing Lily to the enterprise, &lt;strong&gt;not&lt;/strong&gt; requiring PhD-level
hackers to get started with Big Data.&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;2. Lily cluster
installs&lt;img align="right" alt="whirr-logo" title="whirr-logo" src="/blog/481-ot/version/default/part/ImageData/data/whirr-logo.jpg"&gt;&lt;/strong&gt;
&lt;/p&gt;

&lt;p&gt;For Lily Enterprise customers, we&amp;rsquo;re currently preparing a
&lt;a href="http://incubator.apache.org/whirr"&gt;Whirr&lt;/a&gt;-based cluster installation
that supports both cloud-based installs (e.g. Amazon EC2) and "bring your own
nodes" installations - on your own cluster. Whirr is an Apache project under
incubation for installing, setting up and running cloud services in a
platform-neutral way. We&amp;rsquo;ve been happily contributing a slew of patches and
issue reports
(&lt;a href="https://issues.apache.org/jira/browse/WHIRR-221"&gt;221&lt;/a&gt;,
&lt;a href="https://issues.apache.org/jira/browse/WHIRR-338"&gt;338&lt;/a&gt;,
&lt;a href="https://issues.apache.org/jira/browse/WHIRR-339"&gt;339&lt;/a&gt;,
&lt;a href="https://issues.apache.org/jira/browse/WHIRR-240"&gt;240&lt;/a&gt; and
&lt;a href="https://issues.apache.org/jira/browse/WHIRR-342"&gt;342&lt;/a&gt;) while working
on Lily support for Whirr.&lt;/p&gt;

&lt;p&gt;Using Whirr and our
&lt;a href="http://www.lilyproject.org/lily/about/enterprise.html"&gt;Lily
Enterprise&lt;/a&gt; installation packages, setting up complex multi-node installs of
Lily will be a breeze.&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;3. The Lily Adoption Program&lt;/strong&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;&lt;img alt="lily-webinar-062011" title="lily-webinar-062011" src="/blog/479-ot/version/default/part/ImageData/data/lily-webinar-062011.jpg"&gt;&lt;/strong&gt;
&lt;/p&gt;

&lt;p&gt;As mentioned during our well-attended first
&lt;a href="http://vimeo.com/26113694"&gt;Lily webinar&lt;/a&gt;, we've set up a Lily
adoption roadmap helping enterprises to easily discover, explore, adopt, deploy
and support Lily inside their organization. It's a multi-step, facilitated
process with workshops, proof-of-concept support, training and implementation
assistance based on our many years of project experience. The 2-day workshop is
still available at a discounted rate (-20%) until end of September, so don't
hesitate to get in touch with us.&lt;/p&gt;

&lt;p&gt;It&amp;rsquo;s a long (temperature-wise not so hot unfortunately) Summer over here in
Lily-land, and we&amp;rsquo;re making great progress whipping up some exciting new
features. Stay tuned for more!&lt;/p&gt;

&lt;img src="http://feeds.feedburner.com/~r/Outerthought/~4/l124FzcG6Gc" height="1" width="1"/&gt;</content><feedburner:origLink>http://outerthought.org/blog/478-ot</feedburner:origLink></entry><entry xmlns:s="http://outerx.org/daisywiki/1.0#serializer"><author><name>Outerthought</name></author><published /><updated>2011-05-16T07:19:09.000Z</updated><title>AppsForGhent in review.</title><link type="text/html" rel="alternate" hreflang="en" href="http://feedproxy.google.com/~r/Outerthought/~3/eYwITJpPIiA/474-ot" /><id>tag:blog.outerthought.org,2008:Daisy474-ot</id><content xml:base="http://outerthought.org" type="html">

&lt;p xmlns:jx="http://apache.org/cocoon/templates/jx/1.0" xmlns:ns="http://outerx.org/daisy/1.0"&gt;The AppsForGhent hacking event and contest last Saturday was a success on the
many scales you can measure.&amp;nbsp; For me the most important one in any case was the
participation both in quality and quantity of the various teams, kuddos to all
participating and giving it their best shot.&lt;/p&gt;

&lt;p&gt;Also nice to see is that more and more stuff
(&lt;a xmlns:d="http://outerx.org/daisy/1.0" xmlns:urlencoder="xalan://java.net.URLEncoder" xmlns:einclude="http://outerx.org/daisy/1.0#externalinclude" xmlns:p="http://outerx.org/daisy/1.0#publisher" xmlns:ie="http://outerx.org/daisy/1.0#inlineeditor" xmlns:i18n="http://apache.org/cocoon/i18n/2.1" xmlns:lt="http://outerx.org/daisy/1.0#linktransformer" href="https://github.com/search?q=appsforghent&amp;type=Everything"&gt;code&lt;/a&gt;
and
&lt;a href="http://www.slideshare.net/search/slideshow?searchfrom=header&amp;q=appsforghent"&gt;ideas&lt;/a&gt;)
is being shared out there. Here is our
&lt;a href="http://www.slideshare.net/outerthought/20110514-appsforghent"&gt;presentation&lt;/a&gt;
by the way:&lt;/p&gt;

&lt;div style="width:425px" id="dsy473-ot___ss_7977055"&gt;
&lt;strong style="display:block;margin:12px 0 4px"&gt;&lt;a href="http://www.slideshare.net/outerthought/20110514-appsforghent" title="20110514 appsforghent"&gt;20110514 appsforghent&lt;/a&gt;&lt;/strong&gt;&lt;object id="dsy473-ot___sse7977055" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=20110514appsforghent-110516020139-phpapp02&amp;amp;stripped_title=20110514-appsforghent&amp;amp;userName=outerthought"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowScriptAccess" value="always"&gt;
&lt;embed name="__sse7977055" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=20110514appsforghent-110516020139-phpapp02&amp;amp;stripped_title=20110514-appsforghent&amp;amp;userName=outerthought" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;
&lt;/object&gt;&lt;div style="padding:5px 0 12px"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/outerthought"&gt;Outerthought&lt;/a&gt;.&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;I'm looking forward to seeing the teams (and the city) showing a prolonged
commitment in the 2nd challenge of the event: creating a working application
during the next two weeks and will be keeping an eye on twitter
&lt;a href="http://twitter.com/AppsForGhent"&gt;@AppsForGhent&lt;/a&gt; to track progress.
&lt;/p&gt;

&lt;img src="http://feeds.feedburner.com/~r/Outerthought/~4/eYwITJpPIiA" height="1" width="1"/&gt;</content><feedburner:origLink>http://outerthought.org/blog/474-ot</feedburner:origLink></entry><entry xmlns:s="http://outerx.org/daisywiki/1.0#serializer"><author><name>Outerthought</name></author><published /><updated>2011-05-14T08:19:29.000Z</updated><title>Lily Hacking @AppsForGhent</title><link type="text/html" rel="alternate" hreflang="en" href="http://feedproxy.google.com/~r/Outerthought/~3/2hXnYSz8Dz0/472-ot" /><id>tag:blog.outerthought.org,2008:Daisy472-ot</id><content xml:base="http://outerthought.org" type="html">

&lt;p xmlns:jx="http://apache.org/cocoon/templates/jx/1.0" xmlns:ns="http://outerx.org/daisy/1.0"&gt;Today a genuine '&lt;a xmlns:d="http://outerx.org/daisy/1.0" xmlns:urlencoder="xalan://java.net.URLEncoder" xmlns:einclude="http://outerx.org/daisy/1.0#externalinclude" xmlns:p="http://outerx.org/daisy/1.0#publisher" xmlns:ie="http://outerx.org/daisy/1.0#inlineeditor" xmlns:i18n="http://apache.org/cocoon/i18n/2.1" xmlns:lt="http://outerx.org/daisy/1.0#linktransformer" href="http://www.appsforghent.be"&gt;hack the goverment (of
Ghent)&lt;/a&gt;' event is taking place in the offices of
&lt;a href="http://"&gt;ibbt&lt;/a&gt;.&amp;nbsp; We got invited to sponsor the event and decided to
throw in some more then just the typical goodies too share, and what better to
way too show off some relevance by just delivering some hacker infrastructure?
&lt;/p&gt;

&lt;p&gt;So we set-up a full
&lt;a href="http://docs.outerthought.org/lilyenterprise-docs-current/ext/toc/"&gt;enterprise&lt;/a&gt;
seven node cluster for the event on virtual servers in the ibbt demo network
(not public though) and preloaded it with the KML files we received from the
&lt;a href="http://www.gent.be/open"&gt;city&lt;/a&gt;.&lt;br&gt;
Being about geospatial data, the nice side-effect is some first experience with
the &lt;a href="http://wiki.apache.org/solr/SpatialSearch"&gt;spatial queries in
SOLR&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;The setup is rather straightforward, and involved:&lt;/p&gt;

&lt;ol&gt;

&lt;li&gt;Installing the cluster through the lily-provisioning (see
&lt;a href="http://docs.outerthought.org/lilyenterprise-docs-current/ext/toc/"&gt;enterpise
documentation&lt;/a&gt;)&lt;/li&gt;

&lt;li&gt;Parsing the placemarks from the KML files and producing lily-import-json
through a naive
&lt;a href="https://github.com/marc-portier/appsforghent-kml2json"&gt;convertor&lt;/a&gt;

&lt;/li&gt;

&lt;li&gt;Creating a simple lily schema describing those records&lt;br&gt;


&lt;pre&gt;{
  namespaces: {    "be.appsforghent.kml": "k"  },
  fieldTypes: [
    {      name: "k$name",             valueType: { primitive: "STRING" },      scope: "versioned"    },
    {      name: "k$kind",             valueType: { primitive: "STRING" },      scope: "versioned"    },
    {      name: "k$description",      valueType: { primitive: "STRING" },      scope: "versioned"    },
    {      name: "k$coordinate",       valueType: { primitive: "STRING" },      scope: "versioned"    },
    {      name: "k$address",          valueType: { primitive: "STRING" },      scope: "versioned"    }
  ],
  recordTypes: [
    {
      name: "k$Placemark",
      fields: [
        {name: "k$name"       , mandatory: true  },
        {name: "k$kind"       , mandatory: true  },
        {name: "k$description", mandatory: false },
        {name: "k$coordinate" , mandatory: false },
        {name: "k$address"    , mandatory: false }
      ]
    }
  ]
}&lt;/pre&gt;

&lt;/li&gt;

&lt;li&gt;Create the needed solr schema. (listing only relevant parts)&lt;br&gt;


&lt;pre&gt;&amp;lt;schema name="example" version="1.3"&amp;gt;
 &amp;lt;types&amp;gt;
...
    &amp;lt;!-- A specialized field for geospatial search. If indexed, this fieldType must not be multivalued. --&amp;gt;
    &amp;lt;fieldType name="location" class="solr.LatLonType" subFieldType="double"/&amp;gt;
...
 &amp;lt;/types&amp;gt;
 &amp;lt;fields&amp;gt;
   &amp;lt;!-- Fields which are required by Lily --&amp;gt;
   &amp;lt;field name="lily.key" type="string" indexed="true" stored="true" required="true"/&amp;gt;
   &amp;lt;field name="lily.id" type="string" indexed="true" stored="true" required="true"/&amp;gt;
   &amp;lt;field name="lily.vtagId" type="string" indexed="true" stored="true"/&amp;gt;
   &amp;lt;field name="lily.vtag" type="string" indexed="true" stored="true"/&amp;gt;
   &amp;lt;field name="lily.version" type="long" indexed="true" stored="true"/&amp;gt;
 &amp;lt;!-- Your own fields --&amp;gt;
   &amp;lt;field name="name" type="text" indexed="true" stored="true" required="false"/&amp;gt;
   &amp;lt;field name="kind" type="text" indexed="true" stored="true" required="false"/&amp;gt;
   &amp;lt;field name="coord" type="location" indexed="true" stored="true"/&amp;gt;
   &amp;lt;field name="addr" type="text" indexed="true" stored="true" required="false"/&amp;gt;
 &amp;lt;/fields&amp;gt;
&amp;lt;/schema&amp;gt;&lt;/pre&gt;

&lt;/li&gt;

&lt;li&gt;Creating an index-configuration and add that to lily&lt;br&gt;


&lt;pre&gt;&amp;lt;?xml version="1.0"?&amp;gt;
&amp;lt;indexer xmlns:k="be.appsforghent.kml"&amp;gt;
  &amp;lt;records&amp;gt;
    &amp;lt;record matchNamespace="k" matchName="Placemark" matchVariant="*" vtags="last"/&amp;gt;
  &amp;lt;/records&amp;gt;
  &amp;lt;fields&amp;gt;
    &amp;lt;field name="name"  value="k:name"/&amp;gt;
    &amp;lt;field name="kind"  value="k:kind"/&amp;gt;
    &amp;lt;field name="coord" value="k:coordinate"/&amp;gt;
    &amp;lt;field name="addr"  value="k:address"/&amp;gt;
  &amp;lt;/fields&amp;gt;
&amp;lt;/indexer&amp;gt;&lt;/pre&gt;

&lt;/li&gt;

&lt;li&gt;Upload the records&lt;/li&gt;

&lt;li&gt;Enjoy the SOLR geo filtering results&lt;/li&gt;

&lt;/ol&gt;

&lt;p align="center"&gt;
&lt;table class="plainTable"&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a style="border: 1px" href="/blog/471-ot/version/default/part/ImageData/data/solr-spatial.png"&gt;&lt;img alt="solr-spatial" title="solr-spatial" src="/blog/471-ot/version/default/part/ImagePreview/data"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;a style="font-style: italic" href="/blog/471-ot/version/default/part/ImageData/data/solr-spatial.png"&gt;Klik om te vergroten&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/p&gt;

&lt;img src="http://feeds.feedburner.com/~r/Outerthought/~4/2hXnYSz8Dz0" height="1" width="1"/&gt;</content><feedburner:origLink>http://outerthought.org/blog/472-ot</feedburner:origLink></entry><entry xmlns:s="http://outerx.org/daisywiki/1.0#serializer"><author><name>Outerthought</name></author><published /><updated>2011-04-23T21:38:23.000Z</updated><title>Lily 1.0: Smart Data, at Scale, made Easy</title><link type="text/html" rel="alternate" hreflang="en" href="http://feedproxy.google.com/~r/Outerthought/~3/1JrcS-zz-RE/468-ot" /><id>tag:blog.outerthought.org,2008:Daisy468-ot</id><content xml:base="http://outerthought.org" type="html">

&lt;p xmlns:jx="http://apache.org/cocoon/templates/jx/1.0" xmlns:ns="http://outerx.org/daisy/1.0"&gt;
&lt;em&gt;We&amp;rsquo;re really proud to release the first official major release of Lily -
our flagship repository for scalable data and content management, after 18
months of intense engineering work. Along this event, we are also launching our
commercial Lily services, and announcing some early-stage customers and
partners. We&amp;rsquo;re thrilled being first to launch the first open source,
general-purpose, highly-scalable yet flexible data repository based on
NOSQL/BigData technology: read all about it below.&lt;/em&gt;
&lt;/p&gt;

&lt;h3&gt;What&lt;/h3&gt;

&lt;p&gt;Lily is Smart Data, at Scale, made Easy. Lily is a data and content
repository made for the Age of Data: it allows you to store and manage vast
amounts of data, and in the future will allow you to monetize user interactions
by tracking and analyzing audience data.&lt;/p&gt;

&lt;p&gt;Lily makes Big Data easy with a high-level, developer-friendly data model
with rich types, versioning and schema management. Lily offers simple Java and
REST APIs for creating, reading and managing data.&amp;nbsp;Its flexible indexing
mechanism supports interactive and batch-oriented index maintenance.&lt;/p&gt;

&lt;p&gt;Lily is the foundation for any large-scale data-centric application: social
media, e-commerce, large content management applications, product catalogs,
archiving, media asset management: any data-centric application with an ambition
to scale beyond a single-server setup. Don't focus on scale and infrastructure:
we'll do that for you while you can focus on real differentiators.&lt;/p&gt;

&lt;p&gt;Lily is dead serious about Scale. The Lily repository has been tested to
scale beyond any common content repository technology out there, due to its
inherently distributed architecture, providing economically affordable, robust,
and high-performing data management services for any kind of enterprise
application.&lt;/p&gt;

&lt;h3&gt;For whom&lt;/h3&gt;

&lt;p&gt;Lily puts BigData technology within reach of enterprise and corporate
developers, wrapping high-care leading-edge technology in a developer-and
administrator-friendly package. Lily offers the flexibility and scalability of
Apache HBase, the de-facto leading Google BigTable implementation, and the
sophistication and robustness of Apache SOLR, the market leader of open source
enterprise and internet search. Lily sits on the shoulders of these Big Data
revolution leaders, but provides additional ease of use strongly needed for
corporate adoption.&lt;/p&gt;

&lt;h3&gt;Lily Enterprise&lt;/h3&gt;

&lt;p&gt;Lily Enterprise makes easy &lt;em&gt;easier&lt;/em&gt;. Start using Lily with a turn-key
technology adoption process featuring training, proof-of-concept consulting,
mentoring, enterprise support and a host of enterprise add-on tools, such as
cluster deployment tools, administrative user interface, and easy installation
packages. &lt;a xmlns:d="http://outerx.org/daisy/1.0" xmlns:urlencoder="xalan://java.net.URLEncoder" xmlns:einclude="http://outerx.org/daisy/1.0#externalinclude" xmlns:p="http://outerx.org/daisy/1.0#publisher" xmlns:ie="http://outerx.org/daisy/1.0#inlineeditor" xmlns:i18n="http://apache.org/cocoon/i18n/2.1" xmlns:lt="http://outerx.org/daisy/1.0#linktransformer" href="http://outerthought.org/site/services/lily.html"&gt;Lily
Enterprise&lt;/a&gt; is a subscription-based software and services offer available
worldwide.&lt;/p&gt;

&lt;h3&gt;What&amp;rsquo;s next&lt;/h3&gt;

&lt;p&gt;Beyond scalable data management, Lily will evolve into an all-in-one
database/data warehouse/business intelligence platform, providing its users with
insights on all aspects of data usage and audience data. Lily 1.5 will have
built-in attention data collection and analytics. Lily 2.0 will do real-time
content recommendations based on attention data and user-provided domain
knowledge. A Lily SaaS offer is also planned.&lt;/p&gt;

&lt;h3&gt;Early adopters and partners&lt;/h3&gt;

&lt;p&gt;Join the ranks of ADEO, the world's 4th DIY retail group that adopted Lily as
the foundation of its next-generation e-commerce platform. Explore Lily together
with Bonnier, a leading multinational publishing group. Lily runs great on the
&lt;a href="http://www.cloudera.com/hadoop/"&gt;Cloudera Distribution for Hadoop&lt;/a&gt;
(CDH) and even better on Cloudera Enterprise. Lily is certified CDH-compatible.
Early implementation partners are Cronos Group (BE), SFEIR (F) and Infosys.&lt;/p&gt;

&lt;h3&gt;Thanks&lt;/h3&gt;

&lt;p&gt;Lily builds further upon the best data and search technology out there:
Apache HBase and SOLR. HBase is in use at some of the largest data properties
out there: Facebook, StumbleUpon and Yahoo! SOLR is rapidly replacing all
proprietary enterprise search solutions and is one of the most popular open
source projects at the &lt;a href="http://www.apache.org/"&gt;Apache Software
Foundation&lt;/a&gt;. We're thankful for the developer communities working hard on
these projects, and strive hard to contribute back where possible. We're also
appreciative of the commercial service suppliers backing these projects: Lucid
Imagination and Cloudera.&lt;/p&gt;

&lt;h3&gt;Where&lt;/h3&gt;

&lt;p&gt;Everything Lily can be found at
&lt;a href="http://www.lilyproject.org/"&gt;www.lilyproject.org&lt;/a&gt;. Enjoy!&lt;/p&gt;

&lt;img src="http://feeds.feedburner.com/~r/Outerthought/~4/1JrcS-zz-RE" height="1" width="1"/&gt;</content><feedburner:origLink>http://outerthought.org/blog/468-ot</feedburner:origLink></entry><entry xmlns:s="http://outerx.org/daisywiki/1.0#serializer"><author><name>Outerthought</name></author><published /><updated>2011-02-21T10:01:10.000Z</updated><title>Visualizing HBase Flushes And Compactions</title><link type="text/html" rel="alternate" hreflang="en" href="http://feedproxy.google.com/~r/Outerthought/~3/TgkY6T5w5UY/465-ot" /><id>tag:blog.outerthought.org,2008:Daisy465-ot</id><content xml:base="http://outerthought.org" type="html">

&lt;p xmlns:jx="http://apache.org/cocoon/templates/jx/1.0" xmlns:ns="http://outerx.org/daisy/1.0"&gt;I was looking into more detail at how HBase compactions work, and given my
experience collecting metrics for
&lt;a xmlns:d="http://outerx.org/daisy/1.0" xmlns:urlencoder="xalan://java.net.URLEncoder" xmlns:einclude="http://outerx.org/daisy/1.0#externalinclude" xmlns:p="http://outerx.org/daisy/1.0#publisher" xmlns:ie="http://outerx.org/daisy/1.0#inlineeditor" xmlns:i18n="http://apache.org/cocoon/i18n/2.1" xmlns:lt="http://outerx.org/daisy/1.0#linktransformer" href="http://www.lilyproject.org/"&gt;Lily&lt;/a&gt;, and also inspired by
&lt;a href="http://blog.mikemccandless.com/2011/02/visualizing-lucenes-segment-merges.html"&gt;this
blog post&lt;/a&gt; on Lucene, I thought it would be nice to do some tests and make
some graphs of the HBase flush and compact process.&lt;/p&gt;

&lt;h2&gt;Background&lt;/h2&gt;

&lt;p&gt;When something is written to HBase, it is first written to an in-memory store
(&lt;em&gt;memstore&lt;/em&gt;), once this memstore reaches a certain size, it is flushed to
disk into a &lt;em&gt;store file&lt;/em&gt;&amp;nbsp;(everything is also written immediately to a log
file for durability). The store files created on disk are immutable. Sometimes
the store files are merged together, this is done by a process called
&lt;em&gt;compaction&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;This buffer-flush-merge strategy is a common pattern, for example also used
by Lucene, and is described in a paper called the
&lt;a href="http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.44.2782"&gt;Log-Structured
Merge-Tree&lt;/a&gt; (never read it though). In contrast to Lucene though, were one
usually has only one IndexWriter, HBase typically has hundreds of regions open.
&lt;/p&gt;

&lt;p&gt;There are two kinds of compactions:&lt;/p&gt;

&lt;ul&gt;

&lt;li&gt;

&lt;p&gt;the &lt;em&gt;minor compactions&lt;/em&gt;: these are triggered each time a memstore is
flushed, and will merge some of the store files, determined by an algorithm
described below.&lt;/p&gt;

&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;the &lt;em&gt;major compactions&lt;/em&gt;: these run about every 24 hours (after the
currently oldest store file was written), and merge together all store files
into one. The 24 hours is adjusted with a random margin of up to 20% to avoid
many major compactions happening at the same time. Major compactions can also be
triggered manually, via the API or the shell.&lt;/p&gt;

&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;There is another difference between minor and major compactions: major
compactions process delete markers, max versions, etc, while minor compactions
don't. This is because delete markers might also affect data in the non-merged
files, so it is only possible to do this when merging all files.&lt;/p&gt;

&lt;p&gt;If, after a compaction, a newly written store file is greater than a certain
size (default 256 MB, see property hbase.hregion.max.filesize), the region will
be split into two new regions.&lt;/p&gt;

&lt;h2&gt;The basic compaction process&lt;/h2&gt;

&lt;p&gt;The illustration below shows a simple scenario: in a loop we perform a put of
a row with a single 1k value. The table has one column family and only one
region. The flush size size of the memstore has been set to 100MB
(hbase.hregion.memstore.flush.size), the maximum file size
(hbase.hregion.max.filesize) has been set high enough to avoid splits from
happening. All tests in this blog have been done on a single node (my laptop).
&lt;/p&gt;

&lt;p&gt;The main goal here is to illustrate how the minor compaction process decides
when and what to merge.&lt;/p&gt;

&lt;p align="center"&gt;
&lt;img alt="Flush &amp;amp; compactions: default scenario" title="Flush &amp;amp; compactions: default scenario" src="/blog/458-ot/version/default/part/ImageData/data/threshold3.png"&gt;&lt;/p&gt;

&lt;p&gt;We see that the memstore grows gradually until it reaches its flush size of
100MB, when this happens it is flushed to disk in a new store file. This process
repeats itself until we have 3 store files. At this point, a compaction is
performed which merges the files together into one file.&lt;/p&gt;

&lt;p&gt;The second compaction is only performed after 4 store files are written. How
does HBase decide this?&lt;/p&gt;

&lt;p&gt;The algorithm is basically as follows:&lt;/p&gt;

&lt;ol&gt;

&lt;li&gt;

&lt;p&gt;Run over the set of all store files, from oldest to youngest&lt;/p&gt;

&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;If there are more than 3 (hbase.hstore.compactionThreshold) store files left
and the current store file is 20% larger then the sum of all younger store
files, and it is larger than the memstore flush size, then we go on to the next,
younger, store file and repeat step 2.&lt;/p&gt;

&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Once one of the conditions in step two is not valid anymore, the store files
from the current one to the youngest one are the ones that will be merged
together. If there are less than the compactionThreshold, no merge will be
performed. There is also a limit which prevents more than 10
(hbase.hstore.compaction.max) store files to be merged in one compaction.&lt;/p&gt;

&lt;/li&gt;

&lt;/ol&gt;

&lt;p&gt;If you need more detail, have a look at the source of the Store.compact()
method.&lt;/p&gt;

&lt;p&gt;Now, with this knowledge, we can see why the second compaction does not run
after flush 5: the oldest file was about ~240MB, the two younger ones together
~160MB, 240 &amp;gt; 160 * 1.2&lt;/p&gt;

&lt;p&gt;When the second compaction runs after flush 6, it does merge all the files
together, instead of just the 3 youngest, since ~240 &amp;gt; 3*80*1.2 is not true.
After flush 9, we have ~480 &amp;gt; 3*80*1.2, so the oldest store file is not
included in the merge.&lt;/p&gt;

&lt;p&gt;With the default configuration of HBase, if a store file would be 480MB, the
region will be split. I have on purpose augmented the limit to illustrate what
happens if there are more store files, though I could also have lowered the
memstore flush size.&lt;/p&gt;

&lt;p&gt;If you wonder how the store file merging behaves over longer time, below is
the result of a longer run with 157 flushes of 10 MB. Click on the image below
to see it bigger (10000px by 800px).&lt;/p&gt;

&lt;p align="center"&gt;

&lt;a href="463-ot/version/1/part/ImageData/data"&gt;&lt;img alt="Compactions: long scenario preview" title="Compactions: long scenario preview" src="/blog/464-ot/version/default/part/ImageData/data/compactions_long_scenario_preview.png"&gt;&lt;/a&gt;

&lt;/p&gt;

&lt;p&gt;The largest number of store files at any time is 7 (see number 143 in the
chart), though the oldest (biggest) one is only merged occasionally. It is a
good thing that the number of store files stays small, because when you read a
row from HBase it needs to check all the store files and the memstore (this can
be optimized through
&lt;a href="http://www.quora.com/How-are-bloom-filters-used-in-HBase"&gt;bloomfilters&lt;/a&gt;
or by specifying
&lt;a href="https://issues.apache.org/jira/browse/HBASE-2265"&gt;timestamp
ranges&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;The number 7 might make you think of the property
hbase.hstore.blockingStoreFiles, which has a default value of 7, but I augmented
it for this test to be sure it did not have any influence.&lt;/p&gt;

&lt;h2&gt;Compactions and deletes&lt;/h2&gt;

&lt;p&gt;When you perform a delete in HBase, nothing gets deleted immediately, rather
a delete marker (a.k.a. thombstone) is written. This is because HBase does not
modify files once they are written.&lt;/p&gt;

&lt;p&gt;The deletes are processed during the major compaction process, at which point
the data they hide and the delete marker itself will not be present in the
merged file.&lt;/p&gt;

&lt;p&gt;Lets illustrate this with an extreme scenario. The following graphs are from
a scenario where, in a loop, we put a row and then immediately delete the row.
So conceptually, if we look at the table during the test, it will contain at
most one row. Nevertheless, the store files will only grow.&lt;/p&gt;

&lt;p align="center"&gt;
&lt;img alt="Flush &amp;amp; compactions: put and delete scenario" title="Flush &amp;amp; compactions: put and delete scenario" src="/blog/459-ot/version/default/part/ImageData/data/puts_and_deletes.png"&gt;&lt;/p&gt;

&lt;p&gt;What we see is:&lt;/p&gt;

&lt;ul&gt;

&lt;li&gt;

&lt;p&gt;the memstore grows and flushes three times, three store files are created&lt;/p&gt;

&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;after the third store file is written, a compaction is performed&lt;/p&gt;

&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;the result of the compaction is a new store file of size 0.&lt;/p&gt;

&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;This is a surprising result: only major compactions process deletes, and
major compactions supposedly only run every 24 hours.&lt;/p&gt;

&lt;p&gt;What happens is that if the set of store files selected for compaction is the
set of all store files, then HBase decides to do a major compaction. In fact, it
should, otherwise the 24H check, which looks at the time of the oldest store
file, would mistakenly assume that this one file was the result of a major
compaction.&lt;/p&gt;

&lt;p&gt;Besides explicit deletes, there are other cases where store files will shrink
after a major compaction: cells that are removed because there are more than
max-versions versions of it, or when using the TTL feature.&lt;/p&gt;

&lt;h2&gt;Multiple column families&lt;/h2&gt;

&lt;p&gt;Each column family has its own memstore and its own set of store files. But
all the column families within a table stick together. They will all flush their
memstore at the same time (this
&lt;a href="https://issues.apache.org/jira/browse/HBASE-3149"&gt;might change&lt;/a&gt;).
They are also splitted in the same regions, so when one of the column families
grows to large, the other ones, how small they might be, will also split.&lt;/p&gt;

&lt;p&gt;The illustration below shows a scenario where a table with two column
families is used. In family 2, we only do a put for every 10 puts we do in
family 1. So family 1 will grow much faster than family 2 (family 2 is sparse
family).&lt;/p&gt;

&lt;p align="center"&gt;
&lt;img alt="Flush &amp;amp; compactions: two column families" title="Flush &amp;amp; compactions: two column families" src="/blog/460-ot/version/default/part/ImageData/data/two_families.png"&gt;&lt;/p&gt;

&lt;p&gt;The memstore and storefile count graphs show the data for both families
counted together. Note how at each memstore flush, the number of store files
increases with two.&lt;/p&gt;

&lt;p&gt;You can also see how a second compaction is performed for family 2 but not
for family 1. This is because all store files in family 2 are smaller than the
memstore flush size of 100 MB.&lt;/p&gt;

&lt;h2&gt;Multiple regions&lt;/h2&gt;

&lt;p&gt;Now lets do a scenario with a table that has multiple regions.&lt;/p&gt;

&lt;p&gt;For this test, a table was created with 10 initials regions, divided so that
random UUIDs would be evenly spread over these regions. This time the memstore
flush size was set to 30 MB.&lt;/p&gt;

&lt;p&gt;As the puts are performed, the memstores of each region should fill up
evenly, and so we expect them to all reach the flush size at about the same
time, and thus to flush at about the same time. However, in the HBase region
server there is only one thread which performs flushes, so they happen in
sequence. This means that the memstores of some regions will keep growing above
their limit. The property hbase.hregion.memstore.block.multiplier controls how
many times a memstore can grow above its limit before HBase blocks updates. The
default is 2, in our example here this means the memstore would be allowed to
grow to 2*30=60MB maximum.&lt;/p&gt;

&lt;p&gt;Similarly, there is one thread for doing the compactions and splits, so these
are performed in sequence too. Still, it is a period where resources are used
which would otherwise have been usable to serve client requests. If you would
run a similar scenario a cluster, the different nodes could still run there
compactions in parallel. In such a scenario, were all regions are filled very
evenly and decide to do compactions at about the same time, you can see some
negative spikes when observing the hbaseRequestCount metric. In the chart here
you can notice that memstore grows a bit less steep during the compactions.&lt;/p&gt;

&lt;p align="center"&gt;
&lt;img alt="Flushes &amp;amp; compactions: multiple regions" title="Flushes &amp;amp; compactions: multiple regions" src="/blog/461-ot/version/default/part/ImageData/data/10regions.png"&gt;&lt;/p&gt;

&lt;h2&gt;Memstore upperLimit&lt;/h2&gt;

&lt;p&gt;All the above illustrations were quite synthetic. On a real system, there
will often be much more regions, and more than one table, and there will often
not be enough memory to let memory stores grow to their configured flush size.
&lt;/p&gt;

&lt;p&gt;HBase uses by default 40% of the heap (see property
hbase.regionserver.global.memstore.upperLimit) for all memstores of all regions
of all column families of all tables. If this limit is reached, it starts
flushing some memstores until the memory used by memstores is below at least 35%
of heap (lowerLimit property).&lt;/p&gt;

&lt;p&gt;Let's simulate this scenario by again using 10 regions, but now with an upper
limit of 100 MB. The regionserver in this test has only 1GB of memory, so 400MB
available for the memstores. Given that we have 10 memstores (1 table, 1 column
family, 10 regions), and that we will fill them evenly, we expect the first
flushes to happen when the memstores reach 400/10=40MB (instead of going on to
their 100MB flush size).&lt;/p&gt;

&lt;p&gt;And, hurary huray, the theory is confirmed by the plot below.&lt;/p&gt;

&lt;p align="center"&gt;
&lt;img alt="Flushes: upperLimit reached first" title="Flushes: upperLimit reached first" src="/blog/462-ot/version/default/part/ImageData/data/upperlimitfirst.png"&gt;&lt;/p&gt;

&lt;p&gt;Some final notes:&lt;/p&gt;

&lt;ul&gt;

&lt;li&gt;during flushes &amp;amp; compactions, HBase keeps processing put and get
requests, always giving a consistent view of the data&lt;/li&gt;

&lt;li&gt;certain properties, like the flush size, can be configured on the level of
the table&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;The charts were made with gnuplot, afterwards annotated with Inkscape. The
metrics were collected through HBaseAdmin's ClusterStatus and JMX. The store
file sizes were read directly from HDFS. I set hbase.regionserver.msginterval to
1000 to get fine-grained data from ClusterStatus. Lily's clientmetrics package
was used to collect &amp;amp; output the metrics, and to generate the necessary
input files for gnuplot.&lt;/p&gt;

&lt;img src="http://feeds.feedburner.com/~r/Outerthought/~4/TgkY6T5w5UY" height="1" width="1"/&gt;</content><feedburner:origLink>http://outerthought.org/blog/465-ot</feedburner:origLink></entry><entry xmlns:s="http://outerx.org/daisywiki/1.0#serializer"><author><name>Outerthought</name></author><published /><updated>2011-02-14T15:43:17.000Z</updated><title>Lily 0.3 - the Valentine release!</title><link type="text/html" rel="alternate" hreflang="en" href="http://feedproxy.google.com/~r/Outerthought/~3/ubJgns-ihEg/457-ot" /><id>tag:blog.outerthought.org,2008:Daisy457-ot</id><content xml:base="http://outerthought.org" type="html">

&lt;p xmlns:jx="http://apache.org/cocoon/templates/jx/1.0" xmlns:ns="http://outerx.org/daisy/1.0"&gt;What better fitting way to celebrate Valentine than with a nice flower?
Here's a new and beautiful Lily for you!&lt;/p&gt;

&lt;p&gt;This release is the result of 3 months of hard work since Lily 0.2 last
October. Our focus was stabilization, performance and robustness, providing a
platform we can continue building upon. More than 50 tickets were resolved
during this development sprint, and we're slowly readying ourselves for the 1.0
release.&amp;nbsp;Lily 0.3 brings many gradual improvements over Lily 0.2. It has various
important performance improvements, a more solid implementation of the blob
fields, automatic retry of operations that fail due to IO exceptions (between
Lily client and Lily server), and other miscellaneous improvements.&lt;/p&gt;

&lt;p&gt;Lily 0.3 also is the result of a lengthy proof-of-concept project for our
first paying Lily customer, who stressed the importance of performance,
robustness and flexibility. The resulting, large improvements on the tester tool
are all part of the Lily source tree now, for everybody's benefit.&lt;/p&gt;

&lt;p&gt;In the mean time, we're plugging Lily everywhere, and with great success.
We're also slowly
&lt;a xmlns:d="http://outerx.org/daisy/1.0" xmlns:urlencoder="xalan://java.net.URLEncoder" xmlns:einclude="http://outerx.org/daisy/1.0#externalinclude" xmlns:p="http://outerx.org/daisy/1.0#publisher" xmlns:ie="http://outerx.org/daisy/1.0#inlineeditor" xmlns:i18n="http://apache.org/cocoon/i18n/2.1" xmlns:lt="http://outerx.org/daisy/1.0#linktransformer" href="http://www.slideshare.net/outerthought/lily-at-hug-uk"&gt;disclosing&lt;/a&gt;
the Lily future roadmap - Smart Data at Scale - where Lily will be the first
(and only) data repository tightly integrating scalable storage, robust
indexing, flexible searching, real-time usage analytics and built-in Data
Insights, all from a single open source product to be installed on your
infrastructure or hosted in the cloud.&lt;/p&gt;

&lt;p&gt;Everything Lily can be found at
&lt;a href="http://www.lilyproject.org/"&gt;www.lilyproject.org&lt;/a&gt;. We're also
sharing the details of our commercial software subscription service with select
prospects, let us know if you're interested!&lt;/p&gt;

&lt;p&gt;Here's a concise list of improvements since Lily 0.2:&lt;/p&gt;

&lt;h4&gt;Repository&lt;/h4&gt;

&lt;ul id="dsy457-ot_internal-source-marker_0.842651566490531"&gt;

&lt;ul&gt;

&lt;li&gt;Performance / space improvements&lt;/li&gt;

&lt;ul&gt;

&lt;li&gt;Shorter column key encoding (field id's)&lt;/li&gt;

&lt;li&gt;Reduction of number of column families used&lt;/li&gt;

&lt;li&gt;Avoid duplicate values in the table: make use of sparseness of the table
&lt;/li&gt;

&lt;li&gt;Drop the use of HBase rowlocks, which do not survive region splits/moves.
&lt;/li&gt;

&lt;li&gt;Use byte[] as keys in RecordType FieldType cache&lt;/li&gt;

&lt;/ul&gt;


&lt;li&gt;API&lt;/li&gt;

&lt;ul&gt;

&lt;li&gt;Added a new method createOrUpdate which creates or updates a record
depending on whether it already exists. This new method has the advantage over
the create method that it can be retried in case of IO exceptions, i.e. it is
idempotent, similar to PUT in HTTP/REST.&lt;/li&gt;

&lt;li&gt;Allow updating versioned-mutable fields without specifying the record type.
&lt;/li&gt;

&lt;li&gt;Throw a RecordLockedException instead of generic exception when a record is
locked, this allows Lily clients to retry the operation in that case.&lt;/li&gt;

&lt;/ul&gt;


&lt;li&gt;Clear historical data when deleting a record and remove any referenced
blobs.&lt;/li&gt;

&lt;li&gt;The link index stores record IDs and field IDs as bytes instead of strings.
&lt;/li&gt;

&lt;li&gt;The record ID string representation was changed to use comma instead of
semicolon to separate variant properties, since the use of semicolons was
problematic in the JAX-RS based REST interface implementation.&lt;/li&gt;

&lt;/ul&gt;


&lt;/ul&gt;

&lt;h4&gt;Upgrade to Apache HBase 0.90&lt;/h4&gt;

&lt;h4&gt;Blobs&lt;/h4&gt;

&lt;ul&gt;

&lt;ul&gt;

&lt;li&gt;Rework blobstore functionality&lt;/li&gt;

&lt;ul&gt;

&lt;li&gt;Blobs can only be accessed through the record they are used in, not directly
by using their blob key. This is to allow for future record-level access
control.&lt;/li&gt;

&lt;li&gt;Introduce a Repository.getBlob() method, which returns a BlobAccess object,
which provides access to the blob meta data (Blob object) and the blob input
stream. This avoids the need to read the record in case you need the blob
metadata.&lt;/li&gt;

&lt;li&gt;Uploaded blobs which are never used in a record are cleaned up.&lt;/li&gt;

&lt;/ul&gt;


&lt;li&gt;The HDFS-stored blobs are stored in a hierarchical structure.&lt;/li&gt;

&lt;/ul&gt;


&lt;/ul&gt;

&lt;h4&gt;RowLog improvements&lt;/h4&gt;

&lt;ul&gt;

&lt;ul&gt;

&lt;li&gt;Performance improvements&lt;/li&gt;

&lt;ul&gt;

&lt;li&gt;the RowLog processor uses a Zookeeper based notification system instead of
Netty based.&lt;/li&gt;

&lt;li&gt;Optimize queue scanning: avoid scanning over deleted rows in the table, fix
too-frequent scanning, fix endless scanning loop on startup in case of no
repository activity.&lt;/li&gt;

&lt;li&gt;The RowLog processor only processes messages of a minimal age (avoid
conflicts with direct processing of wal messages).&lt;/li&gt;

&lt;/ul&gt;


&lt;li&gt;Extended RowLogConfigurationManager to add/update rowlog configuration
information.&lt;/li&gt;

&lt;li&gt;Avoid and remove stale messages in the queue.&lt;/li&gt;

&lt;li&gt;Allow the rowlog to either use row-level locks (wal use case) or
executionstate-level locks per subscription (mq use case) when processing
messages.&lt;/li&gt;

&lt;li&gt;Added a WAL processor which handles open WAL messages.&lt;/li&gt;

&lt;/ul&gt;


&lt;/ul&gt;

&lt;h4&gt;REST interface&lt;/h4&gt;

&lt;ul&gt;

&lt;ul&gt;

&lt;li&gt;Adapted blob-support to new blobstore functionality. Content-Length header
is now set when downloading blobs. Multi-value or hierarchical blobs are now
accessible.&lt;/li&gt;

&lt;li&gt;Support updating versioned-mutable fields.&lt;/li&gt;

&lt;li&gt;Fixed various smaller bugs reported by users.&lt;/li&gt;

&lt;/ul&gt;


&lt;/ul&gt;

&lt;h4&gt;HBase index library&lt;/h4&gt;

&lt;ul&gt;

&lt;ul&gt;

&lt;li&gt;Allow to add/remove multiple entries in one call.&lt;/li&gt;

&lt;li&gt;Performance&lt;/li&gt;

&lt;ul&gt;

&lt;li&gt;Fixed important performance issue whereby row scanning always ran to the end
of the index table.&lt;/li&gt;

&lt;li&gt;Enable scan caching.&lt;/li&gt;

&lt;li&gt;Added a performance testing tool.&lt;/li&gt;

&lt;/ul&gt;


&lt;/ul&gt;


&lt;/ul&gt;

&lt;h4&gt;Indexer&lt;/h4&gt;

&lt;ul&gt;

&lt;ul&gt;

&lt;li&gt;Upgrade to Tika 0.8&lt;/li&gt;

&lt;li&gt;Performance&lt;/li&gt;

&lt;ul&gt;

&lt;li&gt;Avoid FieldNotFoundException when evaluating field values&lt;/li&gt;

&lt;/ul&gt;


&lt;li&gt;the SOLR request-writer and response-parser implementation configurable.
This allows to use the XML format instead of the javabin format.&lt;/li&gt;

&lt;/ul&gt;


&lt;/ul&gt;

&lt;h4&gt;LilyClient&lt;/h4&gt;

&lt;ul&gt;

&lt;ul&gt;

&lt;li&gt;Automatically retry operations on IOExceptions, this allows operations to
survive node failures.&lt;/li&gt;

&lt;li&gt;Automatic balancing over all Lily nodes. Each method called on the
Repository object will automatically be performed on an arbitrarily selected
Lily node.&lt;/li&gt;

&lt;li&gt;Avro: switch from HTTP to Netty transport. For this, upgraded to an Avro 1.5
snapshot with patch AVRO-747.&lt;/li&gt;

&lt;/ul&gt;


&lt;/ul&gt;

&lt;h4&gt;Tester tool&lt;/h4&gt;

&lt;ul&gt;

&lt;ul&gt;

&lt;li&gt;Allows to configure test scenarios and indexer and solr configuration.&lt;/li&gt;

&lt;li&gt;Has extended logging, metrics and metrics plotting (gnuplot integration)
capabilities allowing for performance evaluations.&lt;/li&gt;

&lt;li&gt;Introduces general performance testing library.&lt;/li&gt;

&lt;/ul&gt;


&lt;/ul&gt;

&lt;h4&gt;Lily server process&lt;/h4&gt;

&lt;ul&gt;

&lt;ul&gt;

&lt;li&gt;Abilitly to create tables with multiple initial regions at first cluster
startup (record table, linkindex, blobincubator, ...). Also allows to set the
max file size and the memstore flush size.&lt;/li&gt;

&lt;li&gt;The initial Lily startup can now be performed on multiple nodes
concurrently, previously this failed because the table creation code did not
handle failures in case of concurrent table creation.&lt;/li&gt;

&lt;li&gt;Configuration files changed so that they allow for inheritance (= fallback
from one conf dir to another, to the built-in conf). Include default
configuration in Kauri-module jars. All this will help in maintaining Lily
configuration across Lily versions.&lt;/li&gt;

&lt;/ul&gt;


&lt;/ul&gt;

&lt;p&gt;We hope you'll enjoy this new Lily as much as we did making it. Let us know
how we're doing!&lt;/p&gt;

&lt;img src="http://feeds.feedburner.com/~r/Outerthought/~4/ubJgns-ihEg" height="1" width="1"/&gt;</content><feedburner:origLink>http://outerthought.org/blog/457-ot</feedburner:origLink></entry><entry xmlns:s="http://outerx.org/daisywiki/1.0#serializer"><author><name>Outerthought</name></author><published /><updated>2010-12-22T17:20:27.000Z</updated><title>What's in store for 2011?</title><link type="text/html" rel="alternate" hreflang="en" href="http://feedproxy.google.com/~r/Outerthought/~3/B4fySIVGE6Y/456-ot" /><id>tag:blog.outerthought.org,2008:Daisy456-ot</id><content xml:base="http://outerthought.org" type="html">

&lt;p xmlns:jx="http://apache.org/cocoon/templates/jx/1.0" xmlns:ns="http://outerx.org/daisy/1.0"&gt;As we're gently spinning down for Christmas and Year's End parties, it's time
to take a quick peek at what we have in store for next year.&lt;/p&gt;

&lt;p&gt;But first some fun off-topic news: we've been hosting a benefit for the Red
Cross / Studio Brussel action to support orphans of AIDS victims this week,
basically doing some live DJing and music streaming during lunch. It was called
"lunchmusic4life" and the result can be seen at
&lt;a xmlns:d="http://outerx.org/daisy/1.0" xmlns:urlencoder="xalan://java.net.URLEncoder" xmlns:einclude="http://outerx.org/daisy/1.0#externalinclude" xmlns:p="http://outerx.org/daisy/1.0#publisher" xmlns:ie="http://outerx.org/daisy/1.0#inlineeditor" xmlns:i18n="http://apache.org/cocoon/i18n/2.1" xmlns:lt="http://outerx.org/daisy/1.0#linktransformer" href="http://www.ustream.tv/channel/lunchmusic4life"&gt;our UStream show
page&lt;/a&gt;. We aren't done yet, if you have some time tomorrow tune in between
12AM and 1PM Belgian Time.&lt;/p&gt;

&lt;p&gt;We're planning to release a new beta of Lily somewhere end of January
introducing a number of performance enhancements we're currently researching
with the nice (hardware) assistance of the
&lt;a href="http://www.sizingservers.be/"&gt;Sizing Servers lab of HOWEST&lt;/a&gt;. I'll be
giving a NOSQL intro presentation during
&lt;a href="http://www.yajug.org/confluence/display/Public/Future+Events#FutureEvents-25January2011"&gt;YaJUG's
inaugural NOSQL User Group&lt;/a&gt; meeting that month as well.&lt;/p&gt;

&lt;p&gt;We're still on target to have our 'final' 1.0 release end of March, which
means we're planning for 2.0 already. The idea for 2.0 is simple: at first,
you'll use Lily to 'just' store and index your data, but next, with 2.0, we'll
give you some tools to play with your data, basically the plumbing to provide
Data Insights around your information collection.&lt;/p&gt;

&lt;p&gt;We'll do this together with partners, but on the low-level technical side of
things, we'll provide a processing framework that will allow you to easily have
recommendations, patterns, semantic augmentation and other advanced (meta)data
processing exposed as part of the Lily data model. During the process, we'll
also take 'audience data', basically usage data into account, as these will
provide data insights as well.&lt;/p&gt;

&lt;p&gt;In the mean time, we're working on some proof-of-concept Lily projects for
customers, putting Lily through its paces and see how well it performs. Needless
to say, we're thankful and thrilled to have these early adopters on board.&lt;/p&gt;

&lt;p&gt;On the Daisy side, projects are doing well, we just signed up a new customer
who's going to manage medico-operational care procedures for a Dutch oncology
center.&lt;/p&gt;

&lt;p&gt;We'll be merrily continuing our open source product activities in 2011, with
some other exciting announcements ahead of us. The entire Outerthought team
wishes you a great Christmas season, and see you on the other side!&lt;/p&gt;

&lt;img src="http://feeds.feedburner.com/~r/Outerthought/~4/B4fySIVGE6Y" height="1" width="1"/&gt;</content><feedburner:origLink>http://outerthought.org/blog/456-ot</feedburner:origLink></entry><entry xmlns:s="http://outerx.org/daisywiki/1.0#serializer"><author><name>Outerthought</name></author><published /><updated>2010-11-25T15:17:44.000Z</updated><title>@ Devoxx 2010</title><link type="text/html" rel="alternate" hreflang="en" href="http://feedproxy.google.com/~r/Outerthought/~3/FCCYb0AePOw/454-ot" /><id>tag:blog.outerthought.org,2008:Daisy454-ot</id><content xml:base="http://outerthought.org" type="html">

&lt;p xmlns:jx="http://apache.org/cocoon/templates/jx/1.0" xmlns:ns="http://outerx.org/daisy/1.0"&gt;Last week Antwerp (&lt;a xmlns:d="http://outerx.org/daisy/1.0" xmlns:urlencoder="xalan://java.net.URLEncoder" xmlns:einclude="http://outerx.org/daisy/1.0#externalinclude" xmlns:p="http://outerx.org/daisy/1.0#publisher" xmlns:ie="http://outerx.org/daisy/1.0#inlineeditor" xmlns:i18n="http://apache.org/cocoon/i18n/2.1" xmlns:lt="http://outerx.org/daisy/1.0#linktransformer" href="http://www.devoxx.com"&gt;devoxx&lt;/a&gt;)&amp;nbsp; was the place
to be for sensing the pulse of the Java community. The annual great European
Java-developers-feast was again a joyful get-together of Java-enthusiasts, great
speakers, and other smart people.&amp;nbsp; The formula and the venue (great speakers,
even greater screens) has proven itself over time, but the organizers keep
having an eye for trying out new and innovative ways (sure enough tweets, but
loads of whiteboards as well!) to foster the thought exchange and hackerish
tinkering.&lt;/p&gt;

&lt;p&gt;Sure enough there is side-tracks and comments on how Oracle is translating
its "ownership" into "stewardship", but mostly the conference is just about the
techy stuff, some showing off, and quite some well-deserved awe.&lt;/p&gt;

&lt;p&gt;We got the floor for two sessions during the conference focussing more on the
REST (&lt;a href="http://www.kauriproject.org"&gt;kauri&lt;/a&gt;) side of our activities.&amp;nbsp;
For those who missed the slides or want to rehash them, see below. &lt;br&gt;
The first slides on the "wonderful web machine" are there to invite the audience
into thinking about "the web" as a single-person-invention. An enormous design
and clever architecture of a vast successfully interoperating massively
distributed computing system.&amp;nbsp; No less! :)&amp;nbsp; In my mind mankind really has
surpassed himself on this one.&amp;nbsp; Getting carried away in my enthusiasm I even
encouraged people to
&lt;a href="https://twitter.com/#!/LostInBrittany/statuses/4602141155008512"&gt;contemplate
about this wonder at least once a week&lt;/a&gt;.&amp;nbsp; Joking aside, "the wonder view"
serves as my motivation for advocating REST as in "going with the web grain":
follow the techniques for making your web application an integral part of this
link-in wonder, rather then a stand-alone island in this digital universe.&lt;/p&gt;

&lt;p&gt;Overall it was great to see how much air-time (too much
&lt;a href="https://twitter.com/#%21/rmarpozo/statuses/5201404037693441"&gt;according
to some&lt;/a&gt;) this conference has been giving to REST. Mostly thanks to the great
presentations of &lt;a href="http://blogs.sun.com/sandoz/"&gt;Paul Sandoz&lt;/a&gt; on
Jax-RS and &lt;a href="http://bit.ly/bkXtay"&gt;the plans for 2.0&lt;/a&gt;. Other important
'trend' to watch was the obvious attention to the BigData/Cloud/NoSQL track.
Credits to the fine line-up of speakers there of course.&lt;/p&gt;

&lt;p&gt;My two biggest takeaways of the week finally: "Java Modules" and "CDI" (and
how they relate to the future of kauri) deserve their own blogposts. (promise!)
&lt;/p&gt;

&lt;p&gt;Here are the slides from the talks we gave:&lt;/p&gt;

&lt;ul&gt;

&lt;li&gt;"Lab" Session (3h) on restfull programming in Java&lt;/li&gt;

&lt;/ul&gt;

&lt;div style="width:425px" id="dsy452-ot___ss_5899588"&gt;
&lt;strong style="display:block;margin:12px 0 4px"&gt;&lt;a href="http://www.slideshare.net/outerthought/devoxx-2010-lab-rest-in-java" title="Devoxx 2010 | LAB : ReST in Java"&gt;Devoxx 2010 | LAB : ReST in Java&lt;/a&gt;&lt;/strong&gt;&lt;object id="dsy452-ot___sse5899588" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=20101116devoxxrestlab-101125002913-phpapp01&amp;amp;stripped_title=devoxx-2010-lab-rest-in-java&amp;amp;userName=outerthought"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowScriptAccess" value="always"&gt;
&lt;embed name="__sse5899588" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=20101116devoxxrestlab-101125002913-phpapp01&amp;amp;stripped_title=devoxx-2010-lab-rest-in-java&amp;amp;userName=outerthought" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;
&lt;/object&gt;&lt;div style="padding:5px 0 12px"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/outerthought"&gt;Outerthought&lt;/a&gt;.&lt;/div&gt;
&lt;/div&gt;

&lt;ul&gt;

&lt;li&gt;"Tools in Action" Session (30') on Kauri and Lily as the groundwork for
web-scale applications&lt;/li&gt;

&lt;/ul&gt;

&lt;div style="width:425px" id="dsy453-ot___ss_5902665"&gt;
&lt;strong style="display:block;margin:12px 0 4px"&gt;&lt;a href="http://www.slideshare.net/outerthought/devoxx-2010-tools-in-action-kauri-and-lily" title="Devoxx 2010 | Tools In Action : Kauri and Lily"&gt;Devoxx 2010 | Tools In Action : Kauri and Lily&lt;/a&gt;&lt;/strong&gt;&lt;object id="dsy453-ot___sse5902665" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=20101116devoxxkauritalk-101125042721-phpapp02&amp;amp;stripped_title=devoxx-2010-tools-in-action-kauri-and-lily&amp;amp;userName=outerthought"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowScriptAccess" value="always"&gt;
&lt;embed name="__sse5902665" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=20101116devoxxkauritalk-101125042721-phpapp02&amp;amp;stripped_title=devoxx-2010-tools-in-action-kauri-and-lily&amp;amp;userName=outerthought" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;
&lt;/object&gt;&lt;div style="padding:5px 0 12px"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/outerthought"&gt;Outerthought&lt;/a&gt;.&lt;/div&gt;
&lt;/div&gt;

&lt;img src="http://feeds.feedburner.com/~r/Outerthought/~4/FCCYb0AePOw" height="1" width="1"/&gt;</content><feedburner:origLink>http://outerthought.org/blog/454-ot</feedburner:origLink></entry><entry xmlns:s="http://outerx.org/daisywiki/1.0#serializer"><author><name>Outerthought</name></author><published /><updated>2010-11-24T08:14:45.000Z</updated><title>Rowlog : A message queue system on top of HBase</title><link type="text/html" rel="alternate" hreflang="en" href="http://feedproxy.google.com/~r/Outerthought/~3/Ebo8MJxTue0/449-ot" /><id>tag:blog.outerthought.org,2008:Daisy449-ot</id><content xml:base="http://outerthought.org" type="html">

&lt;h1 xmlns:jx="http://apache.org/cocoon/templates/jx/1.0" xmlns:ns="http://outerx.org/daisy/1.0" id="dsy449-ot_internal-source-marker_0.8338012670515079"&gt;
&lt;strong&gt;Rowlog : A message
queue system on top of HBase&lt;/strong&gt;
&lt;/h1&gt;

&lt;h2&gt;
&lt;strong&gt;The need for a MQ&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;In our Lily content repository project (cfr
&lt;a xmlns:d="http://outerx.org/daisy/1.0" xmlns:urlencoder="xalan://java.net.URLEncoder" xmlns:einclude="http://outerx.org/daisy/1.0#externalinclude" xmlns:p="http://outerx.org/daisy/1.0#publisher" xmlns:ie="http://outerx.org/daisy/1.0#inlineeditor" xmlns:i18n="http://apache.org/cocoon/i18n/2.1" xmlns:lt="http://outerx.org/daisy/1.0#linktransformer" href="http://www.lilyproject.org/lily/index.html"&gt;www.lilyproject.org&lt;/a&gt;),
each time we update (create, update, delete) a record we want to update a
SOLR-based index. To accomplish this we need a message queue system (MQ) that
delivers messages about updates on records to an indexer component which updates
the SOLR index.&lt;br&gt;
The MQ needs to comply to a few requirements:&lt;/p&gt;

&lt;ul&gt;

&lt;li&gt;The context of the messages are events that happen on Lily records&lt;/li&gt;

&lt;li&gt;Messages can be delivered in an asynchronous way to the indexing component
&lt;/li&gt;

&lt;li&gt;Messages about a specific record should be delivered in-order&lt;/li&gt;

&lt;li&gt;No two messages of a same record can be consumed by the indexer component at
the same time&lt;/li&gt;

&lt;li&gt;A message consumer should be able to retrieve all oustanding messages
related to a record&lt;/li&gt;

&lt;li&gt;There can be no message loss&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
&lt;strong&gt;Why build our own?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;MQ systems already exist in many flavors and implementations like for
instance RabbitMQ, ActiveMQ, etc. Still we decided to build our own system on
top of HBase. &lt;br&gt;
First of all we want to keep the amount of different components and storage
technologies (e.g. MySQL) co-existing in the Lily space as low as possible since
each new technology adds an extra level of complexity with respect to
configuration, administration, deployment etc. &lt;br&gt;
Secondly we want all components of Lily to behave the same with respect to
scalability (partitioning), failover, reliablity (replication). Since we were
already using HBase that has our desired scalabiliy properties we decided to use
the same technology to build a MQ system.&lt;/p&gt;

&lt;h2&gt;
&lt;strong&gt;A MQ on HBase named 'Rowlog'&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Until now this blog has been talking about updates and events that apply to
Lily records. But in fact we have built an MQ system that is usable outside the
context of Lily. The context of the messages are events that happen on a HBase
row. That is also where the name "Rowlog" comes from.&lt;/p&gt;

&lt;h3&gt;
&lt;strong&gt;Subscriptions&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Each client interested in processing or consuming messages should register a
subscription on the rowlog. In case of Lily this is the indexer updating the
SOLR index, but this could just as well be an e-mail notification client or
anything else. &lt;br&gt;
A message will then be offered to each registered subscription for consumption
by one of its listeners.&lt;/p&gt;

&lt;h3&gt;
&lt;strong&gt;Message Queue Table&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Each message is stored in a message table (which is stored in a HBase table).
The key of the message contains a subscription id, a timestamp of when the event
happened and the rowkey of the row the message is about. &lt;br&gt;
A Rowlog processor will regularly scan the message table and process the
messages. The messages are sorted based on their timestamp. They will therefore
be processed in the order the events happened, even across different rows.&lt;/p&gt;

&lt;p align="center"&gt;
&lt;img alt="MessageQueueTable" title="MessageQueueTable" src="/blog/450-ot/version/default/part/ImageData/data/MessageQueueTable.png"&gt;&lt;/p&gt;

&lt;h3&gt;
&lt;strong&gt;Row-local Queue&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Next to the message queue table, there is also the concept of a row-local
queue. In a row-local queue we keep information about events on a row in
messages that are stored on the same row where the message is about, but in a
column family separate from the actual data. &lt;br&gt;
Doing this gives us a few advantages:&lt;/p&gt;

&lt;ul&gt;

&lt;li&gt;Adding a message can happen in the same atomic put operation as updating the
data itself (thereby avoiding the need for transactions).&lt;/li&gt;

&lt;li&gt;All outstanding messages of a row can easily be retrieved. In the message
queue table the messages of one row are interleaved with the messages of other
rows.&lt;/li&gt;

&lt;li&gt;All message information is available next to the data. If the message queue
table would be lost it can be rebuild based on the row-local queue. (This is
more a hypothetical advantage since we don't expect to be loosing the message
queue table.)&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;The information stored in the row-local queue is an execution state for each
subscription (executed or not) and a payload (extra information about the event
that happened). By storing this information here, the messages stored in the
message queue table can be kept very light-weight.&lt;/p&gt;

&lt;p align="center"&gt;
&lt;img alt="RowLocalQueue" title="RowLocalQueue" src="/blog/451-ot/version/default/part/ImageData/data/RowLocalQueue.png"&gt;&lt;/p&gt;

&lt;h2&gt;
&lt;strong&gt;Write-Ahead Log (WAL)&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The message queue is not the only reason why we came up with the rowlog
solution. &lt;br&gt;
At the same time we also needed a solution to be able to execute actions as a
consequence of an update on a record, i.e. 'secondary actions'. The requirements
for these actions were :&lt;/p&gt;

&lt;ul&gt;

&lt;li&gt;Guaranteed, eventual execution (cfr no message loss)&lt;/li&gt;

&lt;li&gt;Preferably synchronous execution (can't be fulfilled in case of
failures)ability to resume in case of failures (e.g. a node crash after an
update but before a secondary action got executed)&lt;/li&gt;

&lt;li&gt;Secondary actions should be able to see the state of the record
corresponding to the update. Therefore, secondary actions should be executed
before the next update on the record happens.&lt;/li&gt;

&lt;li&gt;Ordered execution of multiple secondary actions following the same update
&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;The above requirements don't completely apply to what is usually understood
under a write-ahead log. For instance, we don't need are transactions across
multiple updates on multiple rows. But we stick with the name.&lt;/p&gt;

&lt;h3&gt;
&lt;strong&gt;Rowlog as a solution for the WAL&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;While designing a solution for the WAL we noticed that we ended up with
something that was very similar to our MQ solution and that in fact we could
distill the same solution for both use cases : the "Rowlog".&lt;/p&gt;

&lt;p&gt;For a more technical explanation of the Rowlog, it's architecture and how to
use it, take a look
&lt;a href="http://www.lilyproject.org/lily/about/playground/hbaserowlog.html"&gt;here&lt;/a&gt;.
&lt;/p&gt;

&lt;img src="http://feeds.feedburner.com/~r/Outerthought/~4/Ebo8MJxTue0" height="1" width="1"/&gt;</content><feedburner:origLink>http://outerthought.org/blog/449-ot</feedburner:origLink></entry><entry xmlns:s="http://outerx.org/daisywiki/1.0#serializer"><author><name>Outerthought</name></author><published /><updated>2010-10-29T14:26:21.000Z</updated><title>Something for the weekend: Lily 0.2 is OUT !</title><link type="text/html" rel="alternate" hreflang="en" href="http://feedproxy.google.com/~r/Outerthought/~3/9ORqHgH3Nuo/446-ot" /><id>tag:blog.outerthought.org,2008:Daisy446-ot</id><content xml:base="http://outerthought.org" type="html">

&lt;p xmlns:jx="http://apache.org/cocoon/templates/jx/1.0" xmlns:ns="http://outerx.org/daisy/1.0"&gt;Three months after the highly anticipated proof of architecture release,
we're living up to our own promises, and are releasing Lily 'CR' 0.2 today - a
fully-distributed, highly scalable and highly available content repository,
marrying best-of-breed database and search technology into a powerful,
productive and easy-to-use solution for contemporary internet-scale content
applications.&lt;/p&gt;

&lt;h3&gt;For whom&lt;/h3&gt;

&lt;p&gt;You're building content applications (content management, archiving, asset
management, DMS, WCMS, portals, ...) that scale well, either as a product, a
project or in the cloud. You need a trustworthy underlying content repository
that provides a flexible and easy-to-use content model you can adapt to your own
requirements. You have a keen interest in non-relational/HBase technology but
need a higher-level API, and scalable indexing and search as well.&lt;/p&gt;

&lt;h3&gt;Foundations&lt;/h3&gt;

&lt;p&gt;Lily builds further upon &lt;a xmlns:d="http://outerx.org/daisy/1.0" xmlns:urlencoder="xalan://java.net.URLEncoder" xmlns:einclude="http://outerx.org/daisy/1.0#externalinclude" xmlns:p="http://outerx.org/daisy/1.0#publisher" xmlns:ie="http://outerx.org/daisy/1.0#inlineeditor" xmlns:i18n="http://apache.org/cocoon/i18n/2.1" xmlns:lt="http://outerx.org/daisy/1.0#linktransformer" href="http://hbase.apache.org/"&gt;Apache HBase&lt;/a&gt;
and &lt;a href="http://lucene.apache.org/solr/"&gt;Apache SOLR&lt;/a&gt;. HBase is a
faithful implementation of the
&lt;a href="http://labs.google.com/papers/bigtable.html"&gt;Google BigTable&lt;/a&gt;
database, and provides infinite elastic scaling and high-performance access to
huge amounts of data. SOLR is the server version of Lucene, the
industry-standard search library. Lily joins HBase and SOLR in a single, solidly
packaged content repository product, with automated sharding (making use of
multiple hardware nodes to provide scaling of volume and performance), high
availability and automated index maintenance. Lily adds a sophisticated, yet
flexible and surprisingly practical content schema on top of this, providing the
structuredness of more classic databases, versioning, secondary indexing,
queuing: all the stuff developers care for when fixing real-world problems. All
this is made accessible through a powerful Java/AVRO API and a platform-neutral
REST interface.&lt;/p&gt;

&lt;h3&gt;Key features of this release&lt;/h3&gt;

&lt;ul&gt;

&lt;li&gt;Fully distributed: Lily has a fully-distributed architecture making maximum
use of all available hardware for scalability and availability. ZooKeeper is
used for distributed process coordination, configuration and locking. Index
maintenance is based on an HBase-backed RowLog mechanism allowing fast but
reliable updating of SOLR indexes.&lt;/li&gt;

&lt;li&gt;Index maintenance: Lily offers all the features and functionality of SOLR,
but makes index maintenance a breeze, both for interactive as-you-go updating
and MapReduce-based full index rebuilds&lt;/li&gt;

&lt;li&gt;Multi-indexers: for high-load situations, multiple indexers can work in
parallel and talk to a sharded SOLR setup&lt;/li&gt;

&lt;li&gt;REST interface: a flexible and platform-neutral access method for all Lily
operations using HTTP and JSON&lt;/li&gt;

&lt;li&gt;Improved content model: we added URI as a base Lily type as a (small)
indication of our interest in semantic technology&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;More importantly, we commit ourselves to API and data format
layout&amp;nbsp;compatibility&amp;nbsp;from this release onwards. Lily offers the final API we
want to support in the final release. Lily 0.2 is our contract for content
application developers, upgrading to Lily final should require them to do as
little code changes as possible.&lt;/p&gt;

&lt;h3&gt;From where&lt;/h3&gt;

&lt;p&gt;Download Lily from
&lt;a href="http://www.lilyproject.org/"&gt;www.lilyproject.org&lt;/a&gt;. Open source,
Apache license, no strings attached.&lt;/p&gt;

&lt;h3&gt;Enterprise support&lt;/h3&gt;

&lt;p&gt;Together with this release, we're rolling out our
&lt;a href="http://outerthought.org/site/services/lily.html"&gt;commercial support
services&lt;/a&gt; (and signed up a first customer, yay!) that allows you to use Lily
with peace of mind. Also, this release has been fully tested and depends on the
latest &lt;a href="http://www.cloudera.com/hadoop/"&gt;Cloudera Distribution for
Hadoop&lt;/a&gt; (CDH3 beta3) - Cloudera being the leading Hadoop enterprise services
provider. We're proud to collaborate with a true market leader here.&lt;/p&gt;

&lt;h3&gt;Next up&lt;/h3&gt;

&lt;p&gt;Lily 1.0 is planned for March 2011, with an interim release candidate in
January. We'll be working on performance enhancements, feature additions, and
are happily - eagerly - awaiting your feedback and comments. We'll post a
roadmap for Lily 0.3 and onwards by mid November.&lt;/p&gt;

&lt;h3&gt;Follow us&lt;/h3&gt;

&lt;p&gt;If you want to keep track of Lily's on-going development, join the Lily
discussion list or follow our company Twitter
&lt;a href="http://twitter.com/#!/outerthought"&gt;@outerthought&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;Thank you&lt;/h3&gt;

&lt;p&gt;I'd like to thank Bruno and Evert for their hard work so far, the Flemish IWT
government fund for their partial financial support, and all of our early Lily
adopters and enthusiasts for their much valued feedback. You guys rock!&lt;/p&gt;

&lt;img src="http://feeds.feedburner.com/~r/Outerthought/~4/9ORqHgH3Nuo" height="1" width="1"/&gt;</content><feedburner:origLink>http://outerthought.org/blog/446-ot</feedburner:origLink></entry><entry xmlns:s="http://outerx.org/daisywiki/1.0#serializer"><author><name>Outerthought</name></author><published /><updated>2010-10-26T14:58:48.000Z</updated><title>Devoxx is coming! Come and see us!</title><link type="text/html" rel="alternate" hreflang="en" href="http://feedproxy.google.com/~r/Outerthought/~3/RdREVpO3wlY/443-ot" /><id>tag:blog.outerthought.org,2008:Daisy443-ot</id><content xml:base="http://outerthought.org" type="html">

&lt;p xmlns:jx="http://apache.org/cocoon/templates/jx/1.0" xmlns:ns="http://outerx.org/daisy/1.0"&gt;In just under three weeks from now,
&lt;a xmlns:d="http://outerx.org/daisy/1.0" xmlns:urlencoder="xalan://java.net.URLEncoder" xmlns:einclude="http://outerx.org/daisy/1.0#externalinclude" xmlns:p="http://outerx.org/daisy/1.0#publisher" xmlns:ie="http://outerx.org/daisy/1.0#inlineeditor" xmlns:i18n="http://apache.org/cocoon/i18n/2.1" xmlns:lt="http://outerx.org/daisy/1.0#linktransformer" href="http://www.devoxx.com/"&gt;Europe's largest Java-fest&lt;/a&gt; is happening
again, with &lt;em&gt;loads&lt;/em&gt; of cool things happening in or around Metropolis in
Antwerp. We've been helping with organizing this year's edition, we'll be there,
in full force, and we'd love to meet you in Belgium's second nicest city (Ghent
coming first of course ;-) November 15-19. Here's what we contributed to Devoxx'
ninth edition!&lt;/p&gt;

&lt;h3&gt;The NoSQL/Cloud track&lt;/h3&gt;

&lt;a href="http://www.flickr.com/photos/52029823@N02/4994012228/" title="IMG_5991 by Jos&amp;eacute;Paumard, on Flickr"&gt;&lt;img src="http://farm5.static.flickr.com/4088/4994012228_5fd42b464a.jpg" width="500" height="333" alt="IMG_5991"&gt;&lt;/a&gt;

&lt;p&gt;It's no secret that NoSQL and Cloud technology, with a good dash of Devops
tactics, is this year's Devoxx key theme. As a matter of fact, I've been asked
to join
&lt;a href="http://www.devoxx.com/display/Devoxx2K10/Program+Committee"&gt;the Devoxx
steering group&lt;/a&gt; specifically for this purpose, reaching out to some great
BigData speakers all around the globe, and have been plugging this
'conference-inside-the-conference' at various other events, like in the picture
above from &lt;a href="http://www.parisjug.org/"&gt;ParisJUG&lt;/a&gt; in September.&lt;/p&gt;

&lt;a href="http://www.flickr.com/photos/stevenn/5117126317/" title="My Devoxx Schedule by stevenn, on Flickr"&gt;&lt;img src="http://farm2.static.flickr.com/1180/5117126317_10e9187eae.jpg" width="500" height="303" alt="My Devoxx Schedule"&gt;&lt;/a&gt;

&lt;p&gt;As you can see from my own personal agenda, Devoxx will be &lt;em&gt;very busy&lt;/em&gt;
- attending all sessions related to NoSQL, Cloud and Devops will already be a
full-time task on its own. We have 3h university sessions on Cassandra, HBase,
MongoDB and Hadoop, and 45' conference sessions on both these products plus
Voldemort (from LinkedIn) and Mahout, and great case-studies from Twitter,
Facebook and Adobe. That's &lt;strong&gt;Big&lt;/strong&gt;Data Adobe, not Flex/AIR. ;)&lt;/p&gt;

&lt;p&gt;To top this all off, I'll be co-hosting
&lt;a href="http://www.devoxx.com/display/Devoxx2K10/The+NoSQL+BOF"&gt;a NoSQL BOF&lt;/a&gt;
meeting Thursday night between 9 and 10PM (yes, sessions run &lt;em&gt;that&lt;/em&gt; late
during Devoxx).&lt;/p&gt;

&lt;h3&gt;RESTy stuff&lt;/h3&gt;

&lt;p&gt;On the Kauri/REST/Java side of things, we haven't been sitting around idle as
well. Marc will be presenting
&lt;a href="http://www.devoxx.com/display/Devoxx2K10/Scalable+and+RESTful+web+applications++at+the+crossroads+of+Kauri+and+Lily"&gt;a
'Tools In Action' talk on Kauri and Lily&lt;/a&gt; Tuesday afternoon, before
co-hosting the REST BOF that evening. But the most important news is that Marc
will be presenting
&lt;a href="http://www.devoxx.com/display/Devoxx2K10/RESTful+development+with+Java"&gt;a
Hands-on Lab on RESTful, Kauri-based development&lt;/a&gt; Tuesday morning. People
who've been subject to Marc's tutoring in the past know that this kind of
hands-on sessions are his favorite pet peeve, so I can only strongly advise you
to join that Lab: it will be great!&lt;/p&gt;

&lt;h3&gt;Be there!&lt;/h3&gt;

&lt;p&gt;Devoxx &lt;em&gt;will&lt;/em&gt; be selling out, this week if not sooner. So if you
haven't booked your passes yet, better now than sorry. See you in Antwerp!&lt;/p&gt;

&lt;img src="http://feeds.feedburner.com/~r/Outerthought/~4/RdREVpO3wlY" height="1" width="1"/&gt;</content><feedburner:origLink>http://outerthought.org/blog/443-ot</feedburner:origLink></entry><entry xmlns:s="http://outerx.org/daisywiki/1.0#serializer"><author><name>Outerthought</name></author><published /><updated>2010-10-23T12:18:03.000Z</updated><title>Final countdown for Lily 0.2</title><link type="text/html" rel="alternate" hreflang="en" href="http://feedproxy.google.com/~r/Outerthought/~3/5CdeHWOEwOU/440-ot" /><id>tag:blog.outerthought.org,2008:Daisy440-ot</id><content xml:base="http://outerthought.org" type="html">

&lt;p xmlns:jx="http://apache.org/cocoon/templates/jx/1.0" xmlns:ns="http://outerx.org/daisy/1.0"&gt;Next week, it's final countdown for Lily 0.2, which for all imaginable
reasons is a pre-qualifier for 1.0 soon after that. Our primary focus for this
important 0.2 release is two-fold: full distributability and developer
contracts. That means we're trying to stabilize APIs and data/disk formats so
that devs can safely start playing with Lily with the assurance that upgrading
to 1.0-final will be as easy as possible. In the mean time, it's crunch time
around Lily, tying up various loose bits, testing the robustness in case of node
failures, some performance and load testing (tweaking of which will be the
primary focus for 1.0), and making sure everything is well documented.&lt;/p&gt;

&lt;p&gt;There's a small sample application showing loading and indexing of mail
archives (mbox) into Lily which you'll find in the Lily source tree, and I made
a little screencast of that.&lt;/p&gt;

&lt;embed src="http://blip.tv/play/AYKEo20C" type="application/x-shockwave-flash" width="480" height="330" allowscriptaccess="always" allowfullscreen="true"&gt;&lt;/embed&gt;

&lt;p&gt;Overall, Lily is in good shape for this next release, and we are really
excited of the reactions we got so far. So keep your browsers ready, we're
shooting for 0.2 next week on Friday, or the Monday after that (because that's
how it goes, no?)&lt;/p&gt;

&lt;img src="http://feeds.feedburner.com/~r/Outerthought/~4/5CdeHWOEwOU" height="1" width="1"/&gt;</content><feedburner:origLink>http://outerthought.org/blog/440-ot</feedburner:origLink></entry><entry xmlns:s="http://outerx.org/daisywiki/1.0#serializer"><author><name>Outerthought</name></author><published /><updated>2010-10-19T16:02:51.000Z</updated><title>Daisy 2.4 is out, and it's worth the wait!</title><link type="text/html" rel="alternate" hreflang="en" href="http://feedproxy.google.com/~r/Outerthought/~3/BreCj97ddVc/439-ot" /><id>tag:blog.outerthought.org,2008:Daisy439-ot</id><content xml:base="http://outerthought.org" type="html">

&lt;p xmlns:jx="http://apache.org/cocoon/templates/jx/1.0" xmlns:ns="http://outerx.org/daisy/1.0"&gt;This is bound to end up being the largest product release announcement we've
ever written, as it's the result of both fortunate and unfortunate
circumstances. First, the good news: we've been &lt;em&gt;very&lt;/em&gt; busy in the last
15 months, working both on our new product Lily, but also adding new features
and improving the already rich feature set of Daisy.&lt;/p&gt;

&lt;p&gt;People who have been in touch with us during trade shows or events over the
past year heard the story already: we're focusing Daisy onto the wonderful world
of techdoc, internal collaborative document/book authoring and legal/QDoc
publishing, with sophisticated document models and a feature set to match that.
&lt;/p&gt;

&lt;p&gt;The bad news is that it took us 15 months to release this new version, but I
can honestly testify that it's entirely worth the wait. Daisy 2.4 is better than
ever, with a new build system, new features and new developer conveniencing, and
we're very proud to release it today. So without further ado, I'll pass the mic
to Karel, who has been shepherding this new Daisy release for a long time now,
and who will introduce you to &lt;em&gt;all things new&lt;/em&gt; in Daisy 2.4.&lt;/p&gt;

&lt;p&gt;Thanks for all the hard work that went into this release!&lt;/p&gt;

&lt;p&gt;Steven.&lt;/p&gt;

&lt;h2&gt;Main features&lt;/h2&gt;

&lt;h3&gt;Point in time (&lt;a xmlns:d="http://outerx.org/daisy/1.0" xmlns:urlencoder="xalan://java.net.URLEncoder" xmlns:einclude="http://outerx.org/daisy/1.0#externalinclude" xmlns:p="http://outerx.org/daisy/1.0#publisher" xmlns:ie="http://outerx.org/daisy/1.0#inlineeditor" xmlns:i18n="http://apache.org/cocoon/i18n/2.1" xmlns:lt="http://outerx.org/daisy/1.0#linktransformer" href="/daisy-docs-current/650-daisy"&gt;docs&lt;/a&gt;)&lt;/h3&gt;

&lt;p&gt;Go back in time and pick an arbitrary date: we'll show you the matching
versions of your content and even better: We allow you to search and navigate
facets in the complete corpus back into time. This is a feature you can't find
elsewhere in the open source CMS market.&lt;/p&gt;

&lt;h3&gt;Replication service (&lt;a href="/daisy-docs-current/652-daisy"&gt;docs&lt;/a&gt;)&lt;/h3&gt;

&lt;p&gt;Handle higher loads and fail-safe setups through replication between multiple
repository instances in master-slave mode.&lt;/p&gt;

&lt;h3&gt;Simpler repository installation&lt;/h3&gt;

&lt;p&gt;
&lt;em&gt;Keep enjoying that next installation of Daisy. &amp;nbsp;&lt;/em&gt;
&lt;/p&gt;

&lt;p&gt;Up to Daisy 2.3, the installation script would ask you a lot of questions
without giving the possibility to change your answers without starting over. Now
the installation process is driven by a configuration file: you start with a
template installation file. Easy!&lt;/p&gt;

&lt;h3&gt;Inline editing (&lt;a href="/daisy-docs-current/623-daisy"&gt;docs&lt;/a&gt;)&lt;/h3&gt;

&lt;p&gt;Customize the editing environment to match the presentation layout.&lt;/p&gt;

&lt;p&gt;Your users can now edit the content in the familiar layout of your site. The
tabbed paradigm is still the default, but can easily be modified into a true
inline editing environment.&lt;/p&gt;

&lt;h3&gt;Single sign-on (&lt;a href="/daisy-docs-current/636-daisy"&gt;docs&lt;/a&gt;) and
account manager support
(&lt;a href="http://www.mozilla.com/en-US/firefox/accountmanager/"&gt;link&lt;/a&gt;)&lt;/h3&gt;

&lt;p&gt;Skip the login page! Yay! Finally!&lt;/p&gt;

&lt;ul&gt;

&lt;li&gt;Use Kerberos authentication (Windows or other ), or&lt;/li&gt;

&lt;li&gt;Plug in your own authentication scheme, or&lt;/li&gt;

&lt;li&gt;Use "Account Manager", an Online Identity project by the Mozilla Labs people
- for now, only an Firefox add-on with a
&lt;a href="http://www.mozilla.com/en-US/firefox/accountmanager/"&gt;prototype
implementation&lt;/a&gt; exists, but as the spec gains attention, more implementations
should arise.&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;Updating authentication schemes
(&lt;a href="/daisy-docs-current/639-daisy"&gt;docs&lt;/a&gt;)&lt;/h3&gt;

&lt;p&gt;Keep your Daisy user data in sync with your own backend (e.g. LDAP or your
own)&lt;/p&gt;

&lt;h3&gt;Document task improvements&lt;/h3&gt;

&lt;p&gt;Better leverage your document handling batch processes&lt;/p&gt;

&lt;ul&gt;

&lt;li&gt;We've added a 'retry count' to tasks. This overcomes failed tasks due to
document locks or other temporary situations, and gives them possibly another
run later on.&lt;/li&gt;

&lt;li&gt;Document tasks now survive server restarts&lt;/li&gt;

&lt;li&gt;Restarting document tasks is made much easier&lt;/li&gt;

&lt;li&gt;Adding custom document tasks (Java) as part of your customization-project is
made a lot easier.&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;Developer features&lt;/h2&gt;

&lt;p&gt;
&lt;em&gt;Because happy developers are effective developers.&lt;/em&gt;
&lt;/p&gt;

&lt;h3&gt;Maven 2 build system&lt;/h3&gt;

&lt;p&gt;We switched from maven to Maven 2 for building Daisy.&lt;/p&gt;

&lt;h3&gt;Maven 2 plugin &amp;amp; sample-project
archetype&amp;nbsp;(&lt;a href="/daisy-docs-current/654-daisy"&gt;docs&lt;/a&gt;)&lt;/h3&gt;

&lt;p&gt;We don't just use Maven 2 for building Daisy, but for
projects&amp;nbsp;&lt;strong&gt;using&lt;/strong&gt;&amp;nbsp;Daisy. The daisy-maven-plugin allows this to be
done in a very efficient and professional manner.&lt;/p&gt;

&lt;p&gt;Using the sample-project archetype, you can give your Daisy project the best
start it can get, for the complete dev team, in no time! &amp;nbsp;&lt;/p&gt;

&lt;p&gt;During your project customization project we offer the flexibility to switch
and test various Daisy versions (which is important for facing the cutting edge
challenges of working on top of Daisy trunk, but also could be useful in
longer-term projects)&lt;/p&gt;

&lt;h3&gt;Spring context component&lt;/h3&gt;

&lt;p&gt;A wrapper which lets you use the popular Spring framework for developing your
own wiki extensions, rather than the less-well known/used Avalon framework that
Cocoon provides.&lt;/p&gt;

&lt;h3&gt;Context doc in search page&lt;/h3&gt;

&lt;p&gt;The query search page lets you set a context document. This makes it easier
to test&amp;nbsp;queries using the ContextDoc() function.&amp;nbsp;&lt;/p&gt;

&lt;h3&gt;Custom Lucene analyzers&lt;/h3&gt;

&lt;p&gt;Optimize the full-text indexing process for your content using a custom
index&amp;nbsp;analyzer and get better full-text search results by using custom
query&amp;nbsp;analyzers. (e.g. handling custom synonym lists)&lt;/p&gt;

&lt;h2&gt;Convenience upgrades and fixes&lt;/h2&gt;

&lt;h3&gt;Important libary upgrades&lt;/h3&gt;

&lt;ul&gt;

&lt;li&gt;FOP 1.0 &amp;nbsp;(from 0.95)&lt;/li&gt;

&lt;li&gt;JQuery 1.4.2 (from&amp;nbsp;1.2.6)&lt;/li&gt;

&lt;li&gt;Lucene 3.0.1 (from&amp;nbsp;2.2.0)&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;Conditional namespaces (&lt;a href="/daisy-docs-current/337-daisy"&gt;docs&lt;/a&gt;)
&lt;/h3&gt;

&lt;p&gt;A Daisy repository can now manage multiple namespaces and decide in which
namespace each document should go. &amp;nbsp;Playing with multiple content repositories
and reshuffling their content over time was never easier.&lt;/p&gt;

&lt;h3&gt;Configuration&lt;/h3&gt;

&lt;p&gt;Various changes making configuration easier &amp;nbsp;and more flexible.&lt;/p&gt;

&lt;h3&gt;Version mode cookie&lt;/h3&gt;

&lt;p&gt;By storing the version mode in a cookie, guests can also benefit from the
version mode and point in time features across your customizations&lt;/p&gt;

&lt;h3&gt;Document browser&lt;/h3&gt;

&lt;p&gt;This was&amp;nbsp;introduced&amp;nbsp;in 2.3, and got some usability fixes and general
attention.&lt;/p&gt;

&lt;h3&gt;Publisher:&amp;nbsp;custom link annotation&lt;/h3&gt;

&lt;p&gt;In the advanced section: publisher requests now support adding custom
link-annotation metadata (available to the layout styling) based on
value-expressions.&lt;/p&gt;

&lt;h2&gt;Summary&lt;/h2&gt;

&lt;p&gt;We realize there has been an exceptional long time lapse between Daisy 2.4
and the previous 2.3 release, but we are confident this&amp;nbsp;exhaustive&amp;nbsp;feature-list
makes up for your wait.&amp;nbsp;&lt;/p&gt;

&lt;p&gt;Obviously the Point-in-Time support makes us specially proud. Again Daisy
sets itself apart from the CMS-pack with a new compelling feature.&lt;/p&gt;

&lt;p&gt;Adding this to a growing differentiator list from previous releases (remember
Books, document tasks, workflow,...)&amp;nbsp;makes for more persuasive argumentation to
envy both end-users and project-customers. And delivering on the promises should
be a breeze with the added developer support.&lt;/p&gt;

&lt;p&gt;As always, there's our Daisy mailing list which gets your questions answered,
and our professional services you can tap into if you want your project to be
done with Daisy by its makers.&lt;/p&gt;

&lt;p&gt;May all your Daisy projects be merry, and enjoy this new release!&lt;/p&gt;

&lt;p&gt;Go and get the good stuff at
&lt;a href="http://www.daisycms.org/"&gt;www.daisycms.org&lt;/a&gt;.&lt;/p&gt;

&lt;img src="http://feeds.feedburner.com/~r/Outerthought/~4/BreCj97ddVc" height="1" width="1"/&gt;</content><feedburner:origLink>http://outerthought.org/blog/439-ot</feedburner:origLink></entry><entry xmlns:s="http://outerx.org/daisywiki/1.0#serializer"><author><name>Outerthought</name></author><published /><updated>2010-10-08T21:09:45.000Z</updated><title>Conference season: NoSQL and REST ahoy!</title><link type="text/html" rel="alternate" hreflang="en" href="http://feedproxy.google.com/~r/Outerthought/~3/1KluKUUxpL8/437-ot" /><id>tag:blog.outerthought.org,2008:Daisy437-ot</id><content xml:base="http://outerthought.org" type="html">

&lt;p xmlns:jx="http://apache.org/cocoon/templates/jx/1.0" xmlns:ns="http://outerx.org/daisy/1.0"&gt;Conference season is heating up rapidly in the next few weeks. Or rather, it
seems like &lt;em&gt;we're onto something&lt;/em&gt;&amp;nbsp;with this NoSQL/HBase/SOLR/BigData
thingy, to the extent that all the pieces of the puzzle are falling together
quite nicely.&amp;nbsp;Hurray!&lt;/p&gt;

&lt;p&gt;Next Monday, I'll be (very briefly) presenting Lily to the
&lt;a xmlns:d="http://outerx.org/daisy/1.0" xmlns:urlencoder="xalan://java.net.URLEncoder" xmlns:einclude="http://outerx.org/daisy/1.0#externalinclude" xmlns:p="http://outerx.org/daisy/1.0#publisher" xmlns:ie="http://outerx.org/daisy/1.0#inlineeditor" xmlns:i18n="http://apache.org/cocoon/i18n/2.1" xmlns:lt="http://outerx.org/daisy/1.0#linktransformer" href="http://www.meetup.com/hbaseusergroup/calendar/14606174/"&gt;Bay Area HBase
MeetUp group&lt;/a&gt;, who has temporarily moved places to New York for the occasion
of
&lt;a href="http://www.cloudera.com/company/press-center/hadoop-world-nyc/"&gt;Hadoop
World 2010&lt;/a&gt;, the (now yearly) Cloudera/Hadoop lovefest. Not only that, I'll
finally get to meet all those great folks that make the HBase-clock tick,
something which puts a really big smile on my face. I have a couple of more
business-like meetings scheduled as well, so things will be pretty busy.&lt;/p&gt;

&lt;p&gt;Tuesday, I have the cumbersome challenge of choosing between all those Hadoop
World conference sessions and absorb as much info as possible to relay to my
colleagues at Outerthought HQ. Even though it's my first stay in NYC, I doubt
there will be much time for touristy things. Oh well, such is life.&lt;/p&gt;

&lt;p&gt;The weeks thereafter, leading up to the end of October, it's Lily release
crunch time again, preparing a decent set of release info materials and making
sure all the right channels are properly informed. That, and continuing work on
the Lily partnership model, convincing fellow techy folks about the value-add
Lily can provide to their business.&lt;/p&gt;

&lt;p&gt;Mid November, during Devoxx, it's the NoSQL bandwagon ride again, but we're
topping this off with something &lt;em&gt;hot off the presses&lt;/em&gt;: a Lab session on
RESTful development with Java, combining the power of REST design patterns, Java
and Kauri in a 3 hour hands-on mega-exercise for Devoxx University attendees. So
if you happen to attend Devoxx during University days and want to get a
&lt;em&gt;proper&lt;/em&gt;&amp;nbsp;introduction into REST and Kauri, join Marc for
&lt;a href="http://www.devoxx.com/display/Devoxx2K10/RESTful+development+with+Java"&gt;RESTful
development with Java&lt;/a&gt;. People who have heard Marc presenting before, know
that such training sessions are his&amp;nbsp;favorite&amp;nbsp;pastime, so I'm sure you'll be in
for a great ride.&lt;/p&gt;

&lt;img src="http://feeds.feedburner.com/~r/Outerthought/~4/1KluKUUxpL8" height="1" width="1"/&gt;</content><feedburner:origLink>http://outerthought.org/blog/437-ot</feedburner:origLink></entry></feed>
