You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@storm.apache.org by sr...@apache.org on 2015/09/29 05:20:13 UTC

[12/15] storm git commit: add external module docs; misc tweaks

http://git-wip-us.apache.org/repos/asf/storm/blob/af6d8ffc/_site/documentation/storm-redis.html
----------------------------------------------------------------------
diff --git a/_site/documentation/storm-redis.html b/_site/documentation/storm-redis.html
new file mode 100644
index 0000000..4dffd6b
--- /dev/null
+++ b/_site/documentation/storm-redis.html
@@ -0,0 +1,395 @@
+<!DOCTYPE html>
+<html>
+    <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+
+    <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon">
+    <link rel="icon" href="/favicon.ico" type="image/x-icon">
+
+    <title>Storm Redis Integration</title>
+
+    <!-- Bootstrap core CSS -->
+    <link href="/assets/css/bootstrap.min.css" rel="stylesheet">
+    <!-- Bootstrap theme -->
+    <link href="/assets/css/bootstrap-theme.min.css" rel="stylesheet">
+
+    <!-- Custom styles for this template -->
+    <link rel="stylesheet" href="http://fortawesome.github.io/Font-Awesome/assets/font-awesome/css/font-awesome.css">
+    <link href="/css/style.css" rel="stylesheet">
+    <link href="/assets/css/owl.theme.css" rel="stylesheet">
+    <link href="/assets/css/owl.carousel.css" rel="stylesheet">
+    <script type="text/javascript" src="/assets/js/jquery.min.js"></script>
+    <script type="text/javascript" src="/assets/js/bootstrap.min.js"></script>
+    <script type="text/javascript" src="/assets/js/owl.carousel.min.js"></script>
+    <script type="text/javascript" src="/assets/js/storm.js"></script>
+    <!-- Just for debugging purposes. Don't actually copy these 2 lines! -->
+    <!--[if lt IE 9]><script src="../../assets/js/ie8-responsive-file-warning.js"></script><![endif]-->
+    
+    <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
+    <!--[if lt IE 9]>
+      <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
+      <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
+    <![endif]-->
+  </head>
+
+
+  <body>
+    <header>
+  <div class="container-fluid">
+      <div class="row">
+          <div class="col-md-10">
+              <a href="/index.html"><img src="/images/logo.png" class="logo" /></a>
+            </div>
+            <div class="col-md-2">
+              <a href="/downloads.html" class="btn-std btn-block btn-download">Download</a>
+            </div>
+        </div>
+    </div>
+</header>
+<!--Header End-->
+<!--Navigation Begin-->
+<div class="navbar" role="banner">
+  <div class="container-fluid">
+      <div class="navbar-header">
+          <button class="navbar-toggle" type="button" data-toggle="collapse" data-target=".bs-navbar-collapse">
+                <span class="icon-bar"></span>
+                <span class="icon-bar"></span>
+                <span class="icon-bar"></span>
+            </button>
+        </div>
+        <nav class="collapse navbar-collapse bs-navbar-collapse" role="navigation">
+          <ul class="nav navbar-nav">
+              <li><a href="/index.html" id="home">Home</a></li>
+                <li><a href="/getting-help.html" id="getting-help">Getting Help</a></li>
+                <li><a href="/about/integrates.html" id="project-info">Project Information</a></li>
+                <li><a href="/documentation.html" id="documentation">Documentation</a></li>
+                <li><a href="/talksAndVideos.html">Talks and Slideshows</a></li>
+                <li class="dropdown">
+                    <a href="#" class="dropdown-toggle" data-toggle="dropdown" id="contribute">Community <b class="caret"></b></a>
+                    <ul class="dropdown-menu">
+                        <li><a href="/contribute/Contributing-to-Storm.html">Contributing</a></li>
+                        <li><a href="/contribute/People.html">People</a></li>
+                        <li><a href="/contribute/BYLAWS.html">ByLaws</a></li>
+                    </ul>
+                </li>
+                <li><a href="/2015/06/15/storm0100-beta-released.html" id="news">News</a></li>
+            </ul>
+        </nav>
+    </div>
+</div>
+
+
+
+    <div class="container-fluid">
+    <h1 class="page-title">Storm Redis Integration</h1>
+          <div class="row">
+           	<div class="col-md-12">
+	             <!-- Documentation -->
+
+<p class="post-meta"></p>
+
+<p>Storm/Trident integration for <a href="http://redis.io/">Redis</a></p>
+
+<p>Storm-redis uses Jedis for Redis client.</p>
+
+<h2 id="usage">Usage</h2>
+
+<h3 id="how-do-i-use-it?">How do I use it?</h3>
+
+<p>use it as a maven dependency:</p>
+<div class="highlight"><pre><code class="language-xml" data-lang="xml"><span class="nt">&lt;dependency&gt;</span>
+    <span class="nt">&lt;groupId&gt;</span>org.apache.storm<span class="nt">&lt;/groupId&gt;</span>
+    <span class="nt">&lt;artifactId&gt;</span>storm-redis<span class="nt">&lt;/artifactId&gt;</span>
+    <span class="nt">&lt;version&gt;</span>{storm.version}<span class="nt">&lt;/version&gt;</span>
+    <span class="nt">&lt;type&gt;</span>jar<span class="nt">&lt;/type&gt;</span>
+<span class="nt">&lt;/dependency&gt;</span>
+</code></pre></div>
+<h3 id="for-normal-bolt">For normal Bolt</h3>
+
+<p>Storm-redis provides basic Bolt implementations, <code>RedisLookupBolt</code> and <code>RedisStoreBolt</code>.</p>
+
+<p>As name represents its usage, <code>RedisLookupBolt</code> retrieves value from Redis using key, and <code>RedisStoreBolt</code> stores key / value to Redis. One tuple will be matched to one key / value pair, and you can define match pattern to <code>TupleMapper</code>.</p>
+
+<p>You can also choose data type from <code>RedisDataTypeDescription</code> to use. Please refer <code>RedisDataTypeDescription.RedisDataType</code> to see what data types are supported. In some data types (hash and sorted set), it requires additional key and converted key from tuple becomes element.</p>
+
+<p>These interfaces are combined with <code>RedisLookupMapper</code> and <code>RedisStoreMapper</code> which fit <code>RedisLookupBolt</code> and <code>RedisStoreBolt</code> respectively.</p>
+
+<h4 id="redislookupbolt-example">RedisLookupBolt example</h4>
+<div class="highlight"><pre><code class="language-java" data-lang="java"><span class="kd">class</span> <span class="nc">WordCountRedisLookupMapper</span> <span class="kd">implements</span> <span class="n">RedisLookupMapper</span> <span class="o">{</span>
+    <span class="kd">private</span> <span class="n">RedisDataTypeDescription</span> <span class="n">description</span><span class="o">;</span>
+    <span class="kd">private</span> <span class="kd">final</span> <span class="n">String</span> <span class="n">hashKey</span> <span class="o">=</span> <span class="s">&quot;wordCount&quot;</span><span class="o">;</span>
+
+    <span class="kd">public</span> <span class="nf">WordCountRedisLookupMapper</span><span class="o">()</span> <span class="o">{</span>
+        <span class="n">description</span> <span class="o">=</span> <span class="k">new</span> <span class="nf">RedisDataTypeDescription</span><span class="o">(</span>
+                <span class="n">RedisDataTypeDescription</span><span class="o">.</span><span class="na">RedisDataType</span><span class="o">.</span><span class="na">HASH</span><span class="o">,</span> <span class="n">hashKey</span><span class="o">);</span>
+    <span class="o">}</span>
+
+    <span class="nd">@Override</span>
+    <span class="kd">public</span> <span class="n">List</span><span class="o">&lt;</span><span class="n">Values</span><span class="o">&gt;</span> <span class="nf">toTuple</span><span class="o">(</span><span class="n">ITuple</span> <span class="n">input</span><span class="o">,</span> <span class="n">Object</span> <span class="n">value</span><span class="o">)</span> <span class="o">{</span>
+        <span class="n">String</span> <span class="n">member</span> <span class="o">=</span> <span class="n">getKeyFromTuple</span><span class="o">(</span><span class="n">input</span><span class="o">);</span>
+        <span class="n">List</span><span class="o">&lt;</span><span class="n">Values</span><span class="o">&gt;</span> <span class="n">values</span> <span class="o">=</span> <span class="n">Lists</span><span class="o">.</span><span class="na">newArrayList</span><span class="o">();</span>
+        <span class="n">values</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="k">new</span> <span class="nf">Values</span><span class="o">(</span><span class="n">member</span><span class="o">,</span> <span class="n">value</span><span class="o">));</span>
+        <span class="k">return</span> <span class="n">values</span><span class="o">;</span>
+    <span class="o">}</span>
+
+    <span class="nd">@Override</span>
+    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">declareOutputFields</span><span class="o">(</span><span class="n">OutputFieldsDeclarer</span> <span class="n">declarer</span><span class="o">)</span> <span class="o">{</span>
+        <span class="n">declarer</span><span class="o">.</span><span class="na">declare</span><span class="o">(</span><span class="k">new</span> <span class="nf">Fields</span><span class="o">(</span><span class="s">&quot;wordName&quot;</span><span class="o">,</span> <span class="s">&quot;count&quot;</span><span class="o">));</span>
+    <span class="o">}</span>
+
+    <span class="nd">@Override</span>
+    <span class="kd">public</span> <span class="n">RedisDataTypeDescription</span> <span class="nf">getDataTypeDescription</span><span class="o">()</span> <span class="o">{</span>
+        <span class="k">return</span> <span class="n">description</span><span class="o">;</span>
+    <span class="o">}</span>
+
+    <span class="nd">@Override</span>
+    <span class="kd">public</span> <span class="n">String</span> <span class="nf">getKeyFromTuple</span><span class="o">(</span><span class="n">ITuple</span> <span class="n">tuple</span><span class="o">)</span> <span class="o">{</span>
+        <span class="k">return</span> <span class="n">tuple</span><span class="o">.</span><span class="na">getStringByField</span><span class="o">(</span><span class="s">&quot;word&quot;</span><span class="o">);</span>
+    <span class="o">}</span>
+
+    <span class="nd">@Override</span>
+    <span class="kd">public</span> <span class="n">String</span> <span class="nf">getValueFromTuple</span><span class="o">(</span><span class="n">ITuple</span> <span class="n">tuple</span><span class="o">)</span> <span class="o">{</span>
+        <span class="k">return</span> <span class="kc">null</span><span class="o">;</span>
+    <span class="o">}</span>
+<span class="o">}</span>
+</code></pre></div><div class="highlight"><pre><code class="language-java" data-lang="java"><span class="n">JedisPoolConfig</span> <span class="n">poolConfig</span> <span class="o">=</span> <span class="k">new</span> <span class="n">JedisPoolConfig</span><span class="o">.</span><span class="na">Builder</span><span class="o">()</span>
+        <span class="o">.</span><span class="na">setHost</span><span class="o">(</span><span class="n">host</span><span class="o">).</span><span class="na">setPort</span><span class="o">(</span><span class="n">port</span><span class="o">).</span><span class="na">build</span><span class="o">();</span>
+<span class="n">RedisLookupMapper</span> <span class="n">lookupMapper</span> <span class="o">=</span> <span class="k">new</span> <span class="nf">WordCountRedisLookupMapper</span><span class="o">();</span>
+<span class="n">RedisLookupBolt</span> <span class="n">lookupBolt</span> <span class="o">=</span> <span class="k">new</span> <span class="nf">RedisLookupBolt</span><span class="o">(</span><span class="n">poolConfig</span><span class="o">,</span> <span class="n">lookupMapper</span><span class="o">);</span>
+</code></pre></div>
+<h4 id="redisstorebolt-example">RedisStoreBolt example</h4>
+<div class="highlight"><pre><code class="language-java" data-lang="java"><span class="kd">class</span> <span class="nc">WordCountStoreMapper</span> <span class="kd">implements</span> <span class="n">RedisStoreMapper</span> <span class="o">{</span>
+    <span class="kd">private</span> <span class="n">RedisDataTypeDescription</span> <span class="n">description</span><span class="o">;</span>
+    <span class="kd">private</span> <span class="kd">final</span> <span class="n">String</span> <span class="n">hashKey</span> <span class="o">=</span> <span class="s">&quot;wordCount&quot;</span><span class="o">;</span>
+
+    <span class="kd">public</span> <span class="nf">WordCountStoreMapper</span><span class="o">()</span> <span class="o">{</span>
+        <span class="n">description</span> <span class="o">=</span> <span class="k">new</span> <span class="nf">RedisDataTypeDescription</span><span class="o">(</span>
+            <span class="n">RedisDataTypeDescription</span><span class="o">.</span><span class="na">RedisDataType</span><span class="o">.</span><span class="na">HASH</span><span class="o">,</span> <span class="n">hashKey</span><span class="o">);</span>
+    <span class="o">}</span>
+
+    <span class="nd">@Override</span>
+    <span class="kd">public</span> <span class="n">RedisDataTypeDescription</span> <span class="nf">getDataTypeDescription</span><span class="o">()</span> <span class="o">{</span>
+        <span class="k">return</span> <span class="n">description</span><span class="o">;</span>
+    <span class="o">}</span>
+
+    <span class="nd">@Override</span>
+    <span class="kd">public</span> <span class="n">String</span> <span class="nf">getKeyFromTuple</span><span class="o">(</span><span class="n">ITuple</span> <span class="n">tuple</span><span class="o">)</span> <span class="o">{</span>
+        <span class="k">return</span> <span class="n">tuple</span><span class="o">.</span><span class="na">getStringByField</span><span class="o">(</span><span class="s">&quot;word&quot;</span><span class="o">);</span>
+    <span class="o">}</span>
+
+    <span class="nd">@Override</span>
+    <span class="kd">public</span> <span class="n">String</span> <span class="nf">getValueFromTuple</span><span class="o">(</span><span class="n">ITuple</span> <span class="n">tuple</span><span class="o">)</span> <span class="o">{</span>
+        <span class="k">return</span> <span class="n">tuple</span><span class="o">.</span><span class="na">getStringByField</span><span class="o">(</span><span class="s">&quot;count&quot;</span><span class="o">);</span>
+    <span class="o">}</span>
+<span class="o">}</span>
+</code></pre></div><div class="highlight"><pre><code class="language-java" data-lang="java"><span class="n">JedisPoolConfig</span> <span class="n">poolConfig</span> <span class="o">=</span> <span class="k">new</span> <span class="n">JedisPoolConfig</span><span class="o">.</span><span class="na">Builder</span><span class="o">()</span>
+                <span class="o">.</span><span class="na">setHost</span><span class="o">(</span><span class="n">host</span><span class="o">).</span><span class="na">setPort</span><span class="o">(</span><span class="n">port</span><span class="o">).</span><span class="na">build</span><span class="o">();</span>
+<span class="n">RedisStoreMapper</span> <span class="n">storeMapper</span> <span class="o">=</span> <span class="k">new</span> <span class="nf">WordCountStoreMapper</span><span class="o">();</span>
+<span class="n">RedisStoreBolt</span> <span class="n">storeBolt</span> <span class="o">=</span> <span class="k">new</span> <span class="nf">RedisStoreBolt</span><span class="o">(</span><span class="n">poolConfig</span><span class="o">,</span> <span class="n">storeMapper</span><span class="o">);</span>
+</code></pre></div>
+<h3 id="for-non-simple-bolt">For non-simple Bolt</h3>
+
+<p>If your scenario doesn&#39;t fit <code>RedisStoreBolt</code> and <code>RedisLookupBolt</code>, storm-redis also provides <code>AbstractRedisBolt</code> to let you extend and apply your business logic.</p>
+<div class="highlight"><pre><code class="language-java" data-lang="java">    <span class="kd">public</span> <span class="kd">static</span> <span class="kd">class</span> <span class="nc">LookupWordTotalCountBolt</span> <span class="kd">extends</span> <span class="n">AbstractRedisBolt</span> <span class="o">{</span>
+        <span class="kd">private</span> <span class="kd">static</span> <span class="kd">final</span> <span class="n">Logger</span> <span class="n">LOG</span> <span class="o">=</span> <span class="n">LoggerFactory</span><span class="o">.</span><span class="na">getLogger</span><span class="o">(</span><span class="n">LookupWordTotalCountBolt</span><span class="o">.</span><span class="na">class</span><span class="o">);</span>
+        <span class="kd">private</span> <span class="kd">static</span> <span class="kd">final</span> <span class="n">Random</span> <span class="n">RANDOM</span> <span class="o">=</span> <span class="k">new</span> <span class="nf">Random</span><span class="o">();</span>
+
+        <span class="kd">public</span> <span class="nf">LookupWordTotalCountBolt</span><span class="o">(</span><span class="n">JedisPoolConfig</span> <span class="n">config</span><span class="o">)</span> <span class="o">{</span>
+            <span class="kd">super</span><span class="o">(</span><span class="n">config</span><span class="o">);</span>
+        <span class="o">}</span>
+
+        <span class="kd">public</span> <span class="nf">LookupWordTotalCountBolt</span><span class="o">(</span><span class="n">JedisClusterConfig</span> <span class="n">config</span><span class="o">)</span> <span class="o">{</span>
+            <span class="kd">super</span><span class="o">(</span><span class="n">config</span><span class="o">);</span>
+        <span class="o">}</span>
+
+        <span class="nd">@Override</span>
+        <span class="kd">public</span> <span class="kt">void</span> <span class="nf">execute</span><span class="o">(</span><span class="n">Tuple</span> <span class="n">input</span><span class="o">)</span> <span class="o">{</span>
+            <span class="n">JedisCommands</span> <span class="n">jedisCommands</span> <span class="o">=</span> <span class="kc">null</span><span class="o">;</span>
+            <span class="k">try</span> <span class="o">{</span>
+                <span class="n">jedisCommands</span> <span class="o">=</span> <span class="n">getInstance</span><span class="o">();</span>
+                <span class="n">String</span> <span class="n">wordName</span> <span class="o">=</span> <span class="n">input</span><span class="o">.</span><span class="na">getStringByField</span><span class="o">(</span><span class="s">&quot;word&quot;</span><span class="o">);</span>
+                <span class="n">String</span> <span class="n">countStr</span> <span class="o">=</span> <span class="n">jedisCommands</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="n">wordName</span><span class="o">);</span>
+                <span class="k">if</span> <span class="o">(</span><span class="n">countStr</span> <span class="o">!=</span> <span class="kc">null</span><span class="o">)</span> <span class="o">{</span>
+                    <span class="kt">int</span> <span class="n">count</span> <span class="o">=</span> <span class="n">Integer</span><span class="o">.</span><span class="na">parseInt</span><span class="o">(</span><span class="n">countStr</span><span class="o">);</span>
+                    <span class="k">this</span><span class="o">.</span><span class="na">collector</span><span class="o">.</span><span class="na">emit</span><span class="o">(</span><span class="k">new</span> <span class="nf">Values</span><span class="o">(</span><span class="n">wordName</span><span class="o">,</span> <span class="n">count</span><span class="o">));</span>
+
+                    <span class="c1">// print lookup result with low probability</span>
+                    <span class="k">if</span><span class="o">(</span><span class="n">RANDOM</span><span class="o">.</span><span class="na">nextInt</span><span class="o">(</span><span class="mi">1000</span><span class="o">)</span> <span class="o">&gt;</span> <span class="mi">995</span><span class="o">)</span> <span class="o">{</span>
+                        <span class="n">LOG</span><span class="o">.</span><span class="na">info</span><span class="o">(</span><span class="s">&quot;Lookup result - word : &quot;</span> <span class="o">+</span> <span class="n">wordName</span> <span class="o">+</span> <span class="s">&quot; / count : &quot;</span> <span class="o">+</span> <span class="n">count</span><span class="o">);</span>
+                    <span class="o">}</span>
+                <span class="o">}</span> <span class="k">else</span> <span class="o">{</span>
+                    <span class="c1">// skip</span>
+                    <span class="n">LOG</span><span class="o">.</span><span class="na">warn</span><span class="o">(</span><span class="s">&quot;Word not found in Redis - word : &quot;</span> <span class="o">+</span> <span class="n">wordName</span><span class="o">);</span>
+                <span class="o">}</span>
+            <span class="o">}</span> <span class="k">finally</span> <span class="o">{</span>
+                <span class="k">if</span> <span class="o">(</span><span class="n">jedisCommands</span> <span class="o">!=</span> <span class="kc">null</span><span class="o">)</span> <span class="o">{</span>
+                    <span class="n">returnInstance</span><span class="o">(</span><span class="n">jedisCommands</span><span class="o">);</span>
+                <span class="o">}</span>
+                <span class="k">this</span><span class="o">.</span><span class="na">collector</span><span class="o">.</span><span class="na">ack</span><span class="o">(</span><span class="n">input</span><span class="o">);</span>
+            <span class="o">}</span>
+        <span class="o">}</span>
+
+        <span class="nd">@Override</span>
+        <span class="kd">public</span> <span class="kt">void</span> <span class="nf">declareOutputFields</span><span class="o">(</span><span class="n">OutputFieldsDeclarer</span> <span class="n">declarer</span><span class="o">)</span> <span class="o">{</span>
+            <span class="c1">// wordName, count</span>
+            <span class="n">declarer</span><span class="o">.</span><span class="na">declare</span><span class="o">(</span><span class="k">new</span> <span class="nf">Fields</span><span class="o">(</span><span class="s">&quot;wordName&quot;</span><span class="o">,</span> <span class="s">&quot;count&quot;</span><span class="o">));</span>
+        <span class="o">}</span>
+    <span class="o">}</span>
+</code></pre></div>
+<h3 id="trident-state-usage">Trident State usage</h3>
+
+<ol>
+<li><p>RedisState and RedisMapState, which provide Jedis interface just for single redis.</p></li>
+<li><p>RedisClusterState and RedisClusterMapState, which provide JedisCluster interface, just for redis cluster.</p></li>
+</ol>
+
+<p>RedisState
+```java
+        JedisPoolConfig poolConfig = new JedisPoolConfig.Builder()
+                                        .setHost(redisHost).setPort(redisPort)
+                                        .build();
+        RedisStoreMapper storeMapper = new WordCountStoreMapper();
+        RedisLookupMapper lookupMapper = new WordCountLookupMapper();
+        RedisState.Factory factory = new RedisState.Factory(poolConfig);</p>
+<div class="highlight"><pre><code class="language-text" data-lang="text">    TridentTopology topology = new TridentTopology();
+    Stream stream = topology.newStream(&quot;spout1&quot;, spout);
+
+    stream.partitionPersist(factory,
+                            fields,
+                            new RedisStateUpdater(storeMapper).withExpire(86400000),
+                            new Fields());
+
+    TridentState state = topology.newStaticState(factory);
+    stream = stream.stateQuery(state, new Fields(&quot;word&quot;),
+                            new RedisStateQuerier(lookupMapper),
+                            new Fields(&quot;columnName&quot;,&quot;columnValue&quot;));
+</code></pre></div><div class="highlight"><pre><code class="language-text" data-lang="text">RedisClusterState
+```java
+        Set&lt;InetSocketAddress&gt; nodes = new HashSet&lt;InetSocketAddress&gt;();
+        for (String hostPort : redisHostPort.split(&quot;,&quot;)) {
+            String[] host_port = hostPort.split(&quot;:&quot;);
+            nodes.add(new InetSocketAddress(host_port[0], Integer.valueOf(host_port[1])));
+        }
+        JedisClusterConfig clusterConfig = new JedisClusterConfig.Builder().setNodes(nodes)
+                                        .build();
+        RedisStoreMapper storeMapper = new WordCountStoreMapper();
+        RedisLookupMapper lookupMapper = new WordCountLookupMapper();
+        RedisClusterState.Factory factory = new RedisClusterState.Factory(clusterConfig);
+
+        TridentTopology topology = new TridentTopology();
+        Stream stream = topology.newStream(&quot;spout1&quot;, spout);
+
+        stream.partitionPersist(factory,
+                                fields,
+                                new RedisClusterStateUpdater(storeMapper).withExpire(86400000),
+                                new Fields());
+
+        TridentState state = topology.newStaticState(factory);
+        stream = stream.stateQuery(state, new Fields(&quot;word&quot;),
+                                new RedisClusterStateQuerier(lookupMapper),
+                                new Fields(&quot;columnName&quot;,&quot;columnValue&quot;));
+</code></pre></div>
+<h2 id="license">License</h2>
+
+<p>Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+&quot;License&quot;); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at</p>
+
+<p><a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a></p>
+
+<p>Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+&quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.</p>
+
+<h2 id="committer-sponsors">Committer Sponsors</h2>
+
+<ul>
+<li>Robert Evans (<a href="https://github.com/revans2">@revans2</a>)</li>
+<li>Jungtaek Lim (<a href="https://github.com/HeartSaVioR">@HeartSaVioR</a>)</li>
+</ul>
+
+
+
+	          </div>
+	       </div>
+	  </div>
+<footer>
+    <div class="container-fluid">
+        <div class="row">
+            <div class="col-md-3">
+                <div class="footer-widget">
+                    <h5>Meetups</h5>
+                    <ul class="latest-news">
+                        
+                        <li><a href="http://www.meetup.com/Apache-Storm-Apache-Kafka/">Apache Storm & Apache Kafka</a> <span class="small">(Sunnyvale, CA)</span></li>
+                        
+                        <li><a href="http://www.meetup.com/Apache-Storm-Kafka-Users/">Apache Storm & Kafka Users</a> <span class="small">(Seattle, WA)</span></li>
+                        
+                        <li><a href="http://www.meetup.com/New-York-City-Storm-User-Group/">NYC Storm User Group</a> <span class="small">(New York, NY)</span></li>
+                        
+                        <li><a href="http://www.meetup.com/Bay-Area-Stream-Processing">Bay Area Stream Processing</a> <span class="small">(Emeryville, CA)</span></li>
+                        
+                        <li><a href="http://www.meetup.com/Boston-Storm-Users/">Boston Realtime Data</a> <span class="small">(Boston, MA)</span></li>
+                        
+                        <li><a href="http://www.meetup.com/storm-london">London Storm User Group</a> <span class="small">(London, UK)</span></li>
+                        
+                        <!-- <li><a href="http://www.meetup.com/Apache-Storm-Kafka-Users/">Seatle, WA</a> <span class="small">(27 Jun 2015)</span></li> -->
+                    </ul>
+                </div>
+            </div>
+            <div class="col-md-3">
+                <div class="footer-widget">
+                    <h5>About Storm</h5>
+                    <p>Storm integrates with any queueing system and any database system. Storm's spout abstraction makes it easy to integrate a new queuing system. Likewise, integrating Storm with database systems is easy.</p>
+               </div>
+            </div>
+            <div class="col-md-3">
+                <div class="footer-widget">
+                    <h5>First Look</h5>
+                    <ul class="footer-list">
+                        <li><a href="/documentation/Rationale.html">Rationale</a></li>
+                        <li><a href="/tutorial.html">Tutorial</a></li>
+                        <li><a href="/documentation/Setting-up-development-environment.html">Setting up development environment</a></li>
+                        <li><a href="/documentation/Creating-a-new-Storm-project.html">Creating a new Storm project</a></li>
+                    </ul>
+                </div>
+            </div>
+            <div class="col-md-3">
+                <div class="footer-widget">
+                    <h5>Documentation</h5>
+                    <ul class="footer-list">
+                        <li><a href="/doc-index.html">Index</a></li>
+                        <li><a href="/documentation.html">Manual</a></li>
+                        <li><a href="https://storm.apache.org/javadoc/apidocs/index.html">Javadoc</a></li>
+                        <li><a href="/documentation/FAQ.html">FAQ</a></li>
+                    </ul>
+                </div>
+            </div>
+        </div>
+        <hr/>
+        <div class="row">   
+            <div class="col-md-12">
+                <p align="center">Copyright © 2015 <a href="http://www.apache.org">Apache Software Foundation</a>. All Rights Reserved. 
+                    <br>Apache Storm, Apache, the Apache feather logo, and the Apache Storm project logos are trademarks of The Apache Software Foundation. 
+                    <br>All other marks mentioned may be trademarks or registered trademarks of their respective owners.</p>
+            </div>
+        </div>
+    </div>
+</footer>
+<!--Footer End-->
+<!-- Scroll to top -->
+<span class="totop"><a href="#"><i class="fa fa-angle-up"></i></a></span> 
+
+</body>
+
+</html>
+

http://git-wip-us.apache.org/repos/asf/storm/blob/af6d8ffc/_site/documentation/storm-solr.html
----------------------------------------------------------------------
diff --git a/_site/documentation/storm-solr.html b/_site/documentation/storm-solr.html
new file mode 100644
index 0000000..8e5bca2
--- /dev/null
+++ b/_site/documentation/storm-solr.html
@@ -0,0 +1,337 @@
+<!DOCTYPE html>
+<html>
+    <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+
+    <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon">
+    <link rel="icon" href="/favicon.ico" type="image/x-icon">
+
+    <title>Storm Solr Integration</title>
+
+    <!-- Bootstrap core CSS -->
+    <link href="/assets/css/bootstrap.min.css" rel="stylesheet">
+    <!-- Bootstrap theme -->
+    <link href="/assets/css/bootstrap-theme.min.css" rel="stylesheet">
+
+    <!-- Custom styles for this template -->
+    <link rel="stylesheet" href="http://fortawesome.github.io/Font-Awesome/assets/font-awesome/css/font-awesome.css">
+    <link href="/css/style.css" rel="stylesheet">
+    <link href="/assets/css/owl.theme.css" rel="stylesheet">
+    <link href="/assets/css/owl.carousel.css" rel="stylesheet">
+    <script type="text/javascript" src="/assets/js/jquery.min.js"></script>
+    <script type="text/javascript" src="/assets/js/bootstrap.min.js"></script>
+    <script type="text/javascript" src="/assets/js/owl.carousel.min.js"></script>
+    <script type="text/javascript" src="/assets/js/storm.js"></script>
+    <!-- Just for debugging purposes. Don't actually copy these 2 lines! -->
+    <!--[if lt IE 9]><script src="../../assets/js/ie8-responsive-file-warning.js"></script><![endif]-->
+    
+    <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
+    <!--[if lt IE 9]>
+      <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
+      <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
+    <![endif]-->
+  </head>
+
+
+  <body>
+    <header>
+  <div class="container-fluid">
+      <div class="row">
+          <div class="col-md-10">
+              <a href="/index.html"><img src="/images/logo.png" class="logo" /></a>
+            </div>
+            <div class="col-md-2">
+              <a href="/downloads.html" class="btn-std btn-block btn-download">Download</a>
+            </div>
+        </div>
+    </div>
+</header>
+<!--Header End-->
+<!--Navigation Begin-->
+<div class="navbar" role="banner">
+  <div class="container-fluid">
+      <div class="navbar-header">
+          <button class="navbar-toggle" type="button" data-toggle="collapse" data-target=".bs-navbar-collapse">
+                <span class="icon-bar"></span>
+                <span class="icon-bar"></span>
+                <span class="icon-bar"></span>
+            </button>
+        </div>
+        <nav class="collapse navbar-collapse bs-navbar-collapse" role="navigation">
+          <ul class="nav navbar-nav">
+              <li><a href="/index.html" id="home">Home</a></li>
+                <li><a href="/getting-help.html" id="getting-help">Getting Help</a></li>
+                <li><a href="/about/integrates.html" id="project-info">Project Information</a></li>
+                <li><a href="/documentation.html" id="documentation">Documentation</a></li>
+                <li><a href="/talksAndVideos.html">Talks and Slideshows</a></li>
+                <li class="dropdown">
+                    <a href="#" class="dropdown-toggle" data-toggle="dropdown" id="contribute">Community <b class="caret"></b></a>
+                    <ul class="dropdown-menu">
+                        <li><a href="/contribute/Contributing-to-Storm.html">Contributing</a></li>
+                        <li><a href="/contribute/People.html">People</a></li>
+                        <li><a href="/contribute/BYLAWS.html">ByLaws</a></li>
+                    </ul>
+                </li>
+                <li><a href="/2015/06/15/storm0100-beta-released.html" id="news">News</a></li>
+            </ul>
+        </nav>
+    </div>
+</div>
+
+
+
+    <div class="container-fluid">
+    <h1 class="page-title">Storm Solr Integration</h1>
+          <div class="row">
+           	<div class="col-md-12">
+	             <!-- Documentation -->
+
+<p class="post-meta"></p>
+
+<p>Storm and Trident integration for Apache Solr. This package includes a bolt and a trident state that enable a Storm topology
+stream the contents of storm tuples to index Solr collections.</p>
+
+<h1 id="index-storm-tuples-into-a-solr-collection">Index Storm tuples into a Solr collection</h1>
+
+<p>The The bolt and trident state provided use one of the supplied mappers to build a <code>SolrRequest</code> object that is 
+responsible for making the update calls to Solr, thus updating the index of the collection specified.</p>
+
+<h1 id="usage-examples">Usage Examples</h1>
+
+<p>In this section we provide some simple code snippets on how to build Storm and Trident topologies to index Solr. In subsequent sections we 
+describe in detail the two key components of the Storm Solr integration, the <code>SolrUpdateBolt</code>, and the <code>Mappers</code>, <code>SolrFieldsMapper</code>, and <code>SolrJsonMapper</code>.</p>
+
+<h2 id="storm-bolt-with-json-mapper-and-count-based-commit-strategy">Storm Bolt With JSON Mapper and Count Based Commit Strategy</h2>
+<div class="highlight"><pre><code class="language-java" data-lang="java">    <span class="k">new</span> <span class="nf">SolrUpdateBolt</span><span class="o">(</span><span class="n">solrConfig</span><span class="o">,</span> <span class="n">solrMapper</span><span class="o">,</span> <span class="n">solrCommitStgy</span><span class="o">)</span>
+
+    <span class="c1">// zkHostString for Solr &#39;gettingstarted&#39; example</span>
+    <span class="n">SolrConfig</span> <span class="n">solrConfig</span> <span class="o">=</span> <span class="k">new</span> <span class="nf">SolrConfig</span><span class="o">(</span><span class="s">&quot;127.0.0.1:9983&quot;</span><span class="o">);</span>
+
+    <span class="c1">// JSON Mapper used to generate &#39;SolrRequest&#39; requests to update the &quot;gettingstarted&quot; Solr collection with JSON content declared the tuple field with name &quot;JSON&quot;</span>
+    <span class="n">SolrMapper</span> <span class="n">solrMapper</span> <span class="o">=</span> <span class="k">new</span> <span class="n">SolrJsonMapper</span><span class="o">.</span><span class="na">Builder</span><span class="o">(</span><span class="s">&quot;gettingstarted&quot;</span><span class="o">,</span> <span class="s">&quot;JSON&quot;</span><span class="o">).</span><span class="na">build</span><span class="o">();</span> 
+
+    <span class="c1">// Acks every other five tuples. Setting to null acks every tuple</span>
+    <span class="n">SolrCommitStrategy</span> <span class="n">solrCommitStgy</span> <span class="o">=</span> <span class="k">new</span> <span class="nf">CountBasedCommit</span><span class="o">(</span><span class="mi">5</span><span class="o">);</span>          
+</code></pre></div>
+<h2 id="trident-topology-with-fields-mapper">Trident Topology With Fields Mapper</h2>
+<div class="highlight"><pre><code class="language-java" data-lang="java">    <span class="k">new</span> <span class="nf">SolrStateFactory</span><span class="o">(</span><span class="n">solrConfig</span><span class="o">,</span> <span class="n">solrMapper</span><span class="o">);</span>
+
+    <span class="c1">// zkHostString for Solr &#39;gettingstarted&#39; example</span>
+    <span class="n">SolrConfig</span> <span class="n">solrConfig</span> <span class="o">=</span> <span class="k">new</span> <span class="nf">SolrConfig</span><span class="o">(</span><span class="s">&quot;127.0.0.1:9983&quot;</span><span class="o">);</span>
+
+    <span class="cm">/* Solr Fields Mapper used to generate &#39;SolrRequest&#39; requests to update the &quot;gettingstarted&quot; Solr collection. The Solr index is updated using the field values of the tuple fields that match static or dynamic fields declared in the schema object build using schemaBuilder */</span> 
+    <span class="n">SolrMapper</span> <span class="n">solrMapper</span> <span class="o">=</span> <span class="k">new</span> <span class="n">SolrFieldsMapper</span><span class="o">.</span><span class="na">Builder</span><span class="o">(</span><span class="n">schemaBuilder</span><span class="o">,</span> <span class="s">&quot;gettingstarted&quot;</span><span class="o">).</span><span class="na">build</span><span class="o">();</span>
+
+    <span class="c1">// builds the Schema object from the JSON representation of the schema as returned by the URL http://localhost:8983/solr/gettingstarted/schema/ </span>
+    <span class="n">SchemaBuilder</span> <span class="n">schemaBuilder</span> <span class="o">=</span> <span class="k">new</span> <span class="nf">RestJsonSchemaBuilder</span><span class="o">(</span><span class="s">&quot;localhost&quot;</span><span class="o">,</span> <span class="s">&quot;8983&quot;</span><span class="o">,</span> <span class="s">&quot;gettingstarted&quot;</span><span class="o">)</span>
+</code></pre></div>
+<h2 id="solrupdatebolt">SolrUpdateBolt</h2>
+
+<p><code>SolrUpdateBolt</code> streams tuples directly into Apache Solr. The Solr index is updated using<code>SolrRequest</code> requests. 
+ The <code>SolrUpdateBolt</code> is configurable using implementations of <code>SolrConfig</code>, <code>SolrMapper</code>, and optionally <code>SolrCommitStrategy</code>.</p>
+
+<p>The data to stream onto Solr is extracted from the tuples using the strategy defined in the <code>SolrMapper</code> implementation.</p>
+
+<p>The <code>SolrRquest</code> can be sent every tuple, or according to a strategy defined by <code>SolrCommitStrategy</code> implementations. 
+ If a <code>SolrCommitStrategy</code> is in place and one of the tuples in the batch fails, the batch is not committed, and all the tuples in that 
+  batch are marked as Fail, and retried. On the other hand, if all tuples succeed, the <code>SolrRequest</code> is committed and all tuples are successfully acked.</p>
+
+<p><code>SolrConfig</code> is the class containing Solr configuration to be made available to Storm Solr bolts. Any configuration needed in the bolts should be put in this class.</p>
+
+<h2 id="solrmapper">SolrMapper</h2>
+
+<p><code>SorlMapper</code> implementations define the strategy to extract information from the tuples. The public method
+<code>toSolrRequest</code> receives a tuple or a list of tuples and returns a <code>SolrRequest</code> object that is used to update the Solr index.</p>
+
+<h3 id="solrjsonmapper">SolrJsonMapper</h3>
+
+<p>The <code>SolrJsonMapper</code> creates a Solr update request that is sent to the URL endpoint defined by Solr as the resource 
+destination for requests in JSON format. </p>
+
+<p>To create a <code>SolrJsonMapper</code> the client must specify the name of the collection to update as well as the 
+tuple field that contains the JSON object used to update the Solr index. If the tuple does not contain the field specified, 
+a <code>SolrMapperException</code> will be thrown when the method <code>toSolrRequest</code>is called. If the field exists, its value can either 
+be a String with the contents in JSON format, or a Java object that will be serialized to JSON</p>
+
+<p>Code snippet illustrating how to create a <code>SolrJsonMapper</code> object to update the <code>gettingstarted</code> Solr collection with JSON content 
+declared in the tuple field with name &quot;JSON&quot;
+<code>java
+    SolrMapper solrMapper = new SolrJsonMapper.Builder(&quot;gettingstarted&quot;, &quot;JSON&quot;).build();
+</code></p>
+
+<h3 id="solrfieldsmapper">SolrFieldsMapper</h3>
+
+<p>The <code>SolrFieldsMapper</code> creates a Solr update request that is sent to the Solr URL endpoint that handles the updates of <code>SolrInputDocument</code> objects.</p>
+
+<p>To create a <code>SolrFieldsMapper</code> the client must specify the name of the collection to update as well as the <code>SolrSchemaBuilder</code>. 
+The Solr <code>Schema</code> is used to extract information about the Solr schema fields and corresponding types. This metadata is used
+to get the information from the tuples. Only tuple fields that match a static or dynamic Solr fields are added to the document. Tuple fields 
+that do not match the schema are not added to the <code>SolrInputDocument</code> being prepared for indexing. A debug log message is printed for the 
+ tuple fields that do not match the schema and hence are not indexed.</p>
+
+<p>The <code>SolrFieldsMapper</code> supports multivalue fields. A multivalue tuple field must be tokenized. The default token is |. Any 
+arbitrary token can be specified by calling the method <code>org.apache.storm.solr.mapper.SolrFieldsMapper.Builder.setMultiValueFieldToken</code>
+that is part of the <code>SolrFieldsMapper.Builder</code> builder class. </p>
+
+<p>Code snippet illustrating how to create a <code>SolrFieldsMapper</code> object to update the <code>gettingstarted</code> Solr collection. The multivalue 
+field separates each value with the token % instead of the default | . To use the default token you can ommit the call to the method
+<code>setMultiValueFieldToken</code>.</p>
+<div class="highlight"><pre><code class="language-java" data-lang="java">    <span class="k">new</span> <span class="n">SolrFieldsMapper</span><span class="o">.</span><span class="na">Builder</span><span class="o">(</span>
+            <span class="k">new</span> <span class="nf">RestJsonSchemaBuilder</span><span class="o">(</span><span class="s">&quot;localhost&quot;</span><span class="o">,</span> <span class="s">&quot;8983&quot;</span><span class="o">,</span> <span class="s">&quot;gettingstarted&quot;</span><span class="o">),</span> <span class="s">&quot;gettingstarted&quot;</span><span class="o">)</span>
+                <span class="o">.</span><span class="na">setMultiValueFieldToken</span><span class="o">(</span><span class="s">&quot;%&quot;</span><span class="o">).</span><span class="na">build</span><span class="o">();</span>
+</code></pre></div>
+<h1 id="build-and-run-bundled-examples">Build And Run Bundled Examples</h1>
+
+<p>To be able to run the examples you must first build the java code in the package <code>storm-solr</code>, 
+and then generate an uber jar with all the dependencies.</p>
+
+<h2 id="build-the-storm-apache-solr-integration-code">Build the Storm Apache Solr Integration Code</h2>
+
+<p><code>mvn clean install -f REPO_HOME/storm/external/storm-solr/pom.xml</code></p>
+
+<h2 id="use-the-maven-shade-plugin-to-build-the-uber-jar">Use the Maven Shade Plugin to Build the Uber Jar</h2>
+
+<p>Add the following to <code>REPO_HOME/storm/external/storm-solr/pom.xml</code></p>
+<div class="highlight"><pre><code class="language-text" data-lang="text"> &lt;plugin&gt;
+     &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;
+     &lt;artifactId&gt;maven-shade-plugin&lt;/artifactId&gt;
+     &lt;version&gt;2.4.1&lt;/version&gt;
+     &lt;executions&gt;
+         &lt;execution&gt;
+             &lt;phase&gt;package&lt;/phase&gt;
+             &lt;goals&gt;
+                 &lt;goal&gt;shade&lt;/goal&gt;
+             &lt;/goals&gt;
+             &lt;configuration&gt;
+                 &lt;transformers&gt;
+                     &lt;transformer implementation=&quot;org.apache.maven.plugins.shade.resource.ManifestResourceTransformer&quot;&gt;
+                         &lt;mainClass&gt;org.apache.storm.solr.topology.SolrJsonTopology&lt;/mainClass&gt;
+                     &lt;/transformer&gt;
+                 &lt;/transformers&gt;
+             &lt;/configuration&gt;
+         &lt;/execution&gt;
+     &lt;/executions&gt;
+&lt;/plugin&gt;
+</code></pre></div>
+<p>create the uber jar by running the commmand:</p>
+
+<p><code>mvn package -f REPO_HOME/storm/external/storm-solr/pom.xml</code></p>
+
+<p>This will create the uber jar file with the name and location matching the following pattern:</p>
+
+<p><code>REPO_HOME/storm/external/storm/target/storm-solr-0.11.0-SNAPSHOT.jar</code></p>
+
+<h2 id="run-examples">Run Examples</h2>
+
+<p>Copy the file <code>REPO_HOME/storm/external/storm-solr/target/storm-solr-0.11.0-SNAPSHOT.jar</code> to <code>STORM_HOME/extlib</code></p>
+
+<p><strong>The code examples provided require that you first run the <a href="http://lucene.apache.org/solr/quickstart.html">Solr gettingstarted</a> example</strong> </p>
+
+<h3 id="run-storm-topology">Run Storm Topology</h3>
+
+<p>STORM_HOME/bin/storm jar REPO_HOME/storm/external/storm-solr/target/storm-solr-0.11.0-SNAPSHOT-tests.jar org.apache.storm.solr.topology.SolrFieldsTopology</p>
+
+<p>STORM_HOME/bin/storm jar REPO_HOME/storm/external/storm-solr/target/storm-solr-0.11.0-SNAPSHOT-tests.jar org.apache.storm.solr.topology.SolrJsonTopology</p>
+
+<h3 id="run-trident-topology">Run Trident Topology</h3>
+
+<p>STORM_HOME/bin/storm jar REPO_HOME/storm/external/storm-solr/target/storm-solr-0.11.0-SNAPSHOT-tests.jar org.apache.storm.solr.trident.SolrFieldsTridentTopology</p>
+
+<p>STORM_HOME/bin/storm jar REPO_HOME/storm/external/storm-solr/target/storm-solr-0.11.0-SNAPSHOT-tests.jar org.apache.storm.solr.trident.SolrJsonTridentTopology</p>
+
+<h3 id="verify-results">Verify Results</h3>
+
+<p>The aforementioned Storm and Trident topologies index the Solr <code>gettingstarted</code> collection with objects that have the following <code>id</code> pattern:</p>
+
+<p>*id_fields_test_val* for <code>SolrFieldsTopology</code> and  <code>SolrFieldsTridentTopology</code></p>
+
+<p>*json_test_val* for <code>SolrJsonTopology</code> and <code>SolrJsonTridentTopology</code></p>
+
+<p>Querying  Solr for these patterns, you will see the values that have been indexed by the Storm Apache Solr integration: </p>
+
+<p>curl -X GET -H &quot;Content-type:application/json&quot; -H &quot;Accept:application/json&quot; <a href="http://localhost:8983/solr/gettingstarted_shard1_replica2/select?q=*id_fields_test_val*&amp;wt=json&amp;indent=true">http://localhost:8983/solr/gettingstarted_shard1_replica2/select?q=*id_fields_test_val*&amp;wt=json&amp;indent=true</a></p>
+
+<p>curl -X GET -H &quot;Content-type: application/json&quot; -H &quot;Accept: application/json&quot; <a href="http://localhost:8983/solr/gettingstarted_shard1_replica2/select?q=*id_fields_test_val*&amp;wt=json&amp;indent=true">http://localhost:8983/solr/gettingstarted_shard1_replica2/select?q=*id_fields_test_val*&amp;wt=json&amp;indent=true</a></p>
+
+<p>You can also see the results by opening the Apache Solr UI and pasting the <code>id</code> pattern in the <code>q</code> textbox in the queries page</p>
+
+<p><a href="http://localhost:8983/solr/#/gettingstarted_shard1_replica2/query">http://localhost:8983/solr/#/gettingstarted_shard1_replica2/query</a></p>
+
+
+
+	          </div>
+	       </div>
+	  </div>
+<footer>
+    <div class="container-fluid">
+        <div class="row">
+            <div class="col-md-3">
+                <div class="footer-widget">
+                    <h5>Meetups</h5>
+                    <ul class="latest-news">
+                        
+                        <li><a href="http://www.meetup.com/Apache-Storm-Apache-Kafka/">Apache Storm & Apache Kafka</a> <span class="small">(Sunnyvale, CA)</span></li>
+                        
+                        <li><a href="http://www.meetup.com/Apache-Storm-Kafka-Users/">Apache Storm & Kafka Users</a> <span class="small">(Seattle, WA)</span></li>
+                        
+                        <li><a href="http://www.meetup.com/New-York-City-Storm-User-Group/">NYC Storm User Group</a> <span class="small">(New York, NY)</span></li>
+                        
+                        <li><a href="http://www.meetup.com/Bay-Area-Stream-Processing">Bay Area Stream Processing</a> <span class="small">(Emeryville, CA)</span></li>
+                        
+                        <li><a href="http://www.meetup.com/Boston-Storm-Users/">Boston Realtime Data</a> <span class="small">(Boston, MA)</span></li>
+                        
+                        <li><a href="http://www.meetup.com/storm-london">London Storm User Group</a> <span class="small">(London, UK)</span></li>
+                        
+                        <!-- <li><a href="http://www.meetup.com/Apache-Storm-Kafka-Users/">Seatle, WA</a> <span class="small">(27 Jun 2015)</span></li> -->
+                    </ul>
+                </div>
+            </div>
+            <div class="col-md-3">
+                <div class="footer-widget">
+                    <h5>About Storm</h5>
+                    <p>Storm integrates with any queueing system and any database system. Storm's spout abstraction makes it easy to integrate a new queuing system. Likewise, integrating Storm with database systems is easy.</p>
+               </div>
+            </div>
+            <div class="col-md-3">
+                <div class="footer-widget">
+                    <h5>First Look</h5>
+                    <ul class="footer-list">
+                        <li><a href="/documentation/Rationale.html">Rationale</a></li>
+                        <li><a href="/tutorial.html">Tutorial</a></li>
+                        <li><a href="/documentation/Setting-up-development-environment.html">Setting up development environment</a></li>
+                        <li><a href="/documentation/Creating-a-new-Storm-project.html">Creating a new Storm project</a></li>
+                    </ul>
+                </div>
+            </div>
+            <div class="col-md-3">
+                <div class="footer-widget">
+                    <h5>Documentation</h5>
+                    <ul class="footer-list">
+                        <li><a href="/doc-index.html">Index</a></li>
+                        <li><a href="/documentation.html">Manual</a></li>
+                        <li><a href="https://storm.apache.org/javadoc/apidocs/index.html">Javadoc</a></li>
+                        <li><a href="/documentation/FAQ.html">FAQ</a></li>
+                    </ul>
+                </div>
+            </div>
+        </div>
+        <hr/>
+        <div class="row">   
+            <div class="col-md-12">
+                <p align="center">Copyright © 2015 <a href="http://www.apache.org">Apache Software Foundation</a>. All Rights Reserved. 
+                    <br>Apache Storm, Apache, the Apache feather logo, and the Apache Storm project logos are trademarks of The Apache Software Foundation. 
+                    <br>All other marks mentioned may be trademarks or registered trademarks of their respective owners.</p>
+            </div>
+        </div>
+    </div>
+</footer>
+<!--Footer End-->
+<!-- Scroll to top -->
+<span class="totop"><a href="#"><i class="fa fa-angle-up"></i></a></span> 
+
+</body>
+
+</html>
+

http://git-wip-us.apache.org/repos/asf/storm/blob/af6d8ffc/_site/feed.xml
----------------------------------------------------------------------
diff --git a/_site/feed.xml b/_site/feed.xml
index 50542f2..bb6f612 100644
--- a/_site/feed.xml
+++ b/_site/feed.xml
@@ -5,8 +5,8 @@
     <description></description>
     <link>http://storm.apache.org/</link>
     <atom:link href="http://storm.apache.org/feed.xml" rel="self" type="application/rss+xml"/>
-    <pubDate>Thu, 24 Sep 2015 12:13:34 -0400</pubDate>
-    <lastBuildDate>Thu, 24 Sep 2015 12:13:34 -0400</lastBuildDate>
+    <pubDate>Fri, 25 Sep 2015 15:01:11 -0400</pubDate>
+    <lastBuildDate>Fri, 25 Sep 2015 15:01:11 -0400</lastBuildDate>
     <generator>Jekyll v2.5.3</generator>
     
       <item>

http://git-wip-us.apache.org/repos/asf/storm/blob/af6d8ffc/_site/talksAndVideos.html
----------------------------------------------------------------------
diff --git a/_site/talksAndVideos.html b/_site/talksAndVideos.html
index f772d28..b2c8541 100644
--- a/_site/talksAndVideos.html
+++ b/_site/talksAndVideos.html
@@ -101,21 +101,113 @@
             <div class="tab-content">
                 <div role="tabpanel" class="tab-pane active" id="talks">
                     
-                    
-                    
+<!-- ################### -->
+                    <div class="brickSS">
+                        <div class="row">
+                            <div class="col-md-6">
+                                <iframe width="560" height="315" src="https://www.youtube.com/embed/_h5VjQoAJq4" frameborder="0" allowfullscreen></iframe>
+                            </div>
+                            <div class="col-md-6">
+                                <h3>P. Taylor Goetz - Beyond the Tweeting Toaster</h3>
+                                <div>
+                                    <p>Published on Sep 1, 2015</p><p>
+            In this session we will look at how streaming sensor data fits into a variety of (I)IoT analytics use cases, and how Apache Storm and Kafka fit into an overall architecture for large-scale streaming analytics. You will also learn how to leverage the highly accessible Arduino microcontroller platform to create low-cost sensor networks and stream data to Apache Storm for analysis in real time. Finally, we will give a live demonstration of sensor analysis using Kafka, Storm, and an out-of-the-box Arduino board (no soldering required!).
+            </p>
+                                </div>
+                            </div>
+                            
+                        </div>
+                    </div>
+
+<!-- ################### -->
+<!-- ################### -->
+                    <div class="brickSS">
+                        <div class="row">
+                            <div class="col-md-6">
+                                <h3>David Wilcox and Bobby Evans - Yahoo Ad Manager Plus: A Case Study</h3>
+                                <div>
+                                    <p>Published on Jun 30, 2015</p><p>
+            The Yahoo Ad Manager Plus platform (YAM+) provides reports to advertisers on impressions, clicks, and conversions for their ad campaigns. Impressions and clicks are straightforward. Conversions require joining "action beacons" from advertisers with impressions and clicks from advertisements served by YAM+. A conversion is recorded if a user clicked on or was shown an advertisement associated with the campaign identified in the beacon. This presentation describes a storm topology that uses HBase and Druid to provide low-latency feedback to advertisers on the performance of their campaigns. It covers storm and HBase tuning that was needed to support this reporting at production scale.
+            </p>
+                                </div>
+                            </div>
+                            <div class="col-md-6">
+                                <iframe width="560" height="315" src="https://www.youtube.com/embed/h77pMHzFrSg" frameborder="0" allowfullscreen></iframe>
+                            </div>
+                        </div>
+                    </div>
+
+<!-- ################### -->                    
+
+<!-- ################### -->
+                    <div class="brickSS">
+                        <div class="row">
+                            <div class="col-md-6">
+                                <iframe width="560" height="315" src="https://www.youtube.com/embed/pB9d3tMM__k" frameborder="0" allowfullscreen></iframe>
+                            </div>
+                            <div class="col-md-6">
+                                <h3>Bobby Evans - From Gust to Tempest: Scaling Apache Storm</h3>
+                                <div>
+                                    <p>Published on Jun 30, 2015</p><p>
+            At Yahoo, we extensively use the Apache Storm distributed real-time computation platform at medium scale deployment. In this talk we overview a collection of recent developments at Yahoo enabling massive Storm scaling to an order of magnitude larger clusters. They include a resource aware scheduler, load-aware shuffle grouping, a stand-alone heart-beat server that reduces the load on ZooKeeper, compression of ZooKeeper data and using timestamps instead of whole data through ZooKeeper, and finally a new distributed cache mechanism to distribute large files required by bolts.
+            </p>
+                                </div>
+                            </div>
+                            
+                        </div>
+                    </div>
+
+<!-- ################### -->                    
+<!-- ################### -->
+                    <div class="brickSS">
+                        <div class="row">
+                            <div class="col-md-6">
+                                <h3>Sheetal Dolas - Design Patterns for real time data analytics</h3>
+                                <div>
+                                    <p>Published on Jun 30, 2015</p><p>
+            Businesses are moving from large-scale batch data analysis to large-scale real-time data analysis. Apache Storm has emerged as one of the most popular platforms for the purpose.</p><p>
+            This talk covers proven design patterns for real time stream processing. Patterns that have been vetted in large-scale production deployments that process 10s of billions of events/day and 10s of terabytes of data/day.
+            </p>
+                                </div>
+                            </div>
+                            <div class="col-md-6">
+                                <iframe width="560" height="315" src="https://www.youtube.com/embed/hiBc6bHoe3o" frameborder="0" allowfullscreen></iframe>
+                            </div>
+                        </div>
+                    </div>
+
+<!-- ################### -->
                     
 <!-- ################### -->
                     <div class="brickSS">
                         <div class="row">
                             <div class="col-md-6">
+                                <iframe width="560" height="315" src="https://www.youtube.com/embed/ja4Qj9-l6WQ" frameborder="0" allowfullscreen></iframe>
+                            </div>
+                            <div class="col-md-6">
                                 <h3>Andrew Montalenti - streamparse: real-time streams with Python and Apache Storm - PyCon 2015</h3>
                                 <div>
                                     <p>Published on Apr 12, 2015</p><p>
             Real-time streams are everywhere, but does Python have a good way of processing them? Until recently, there were no good options. A new open source project, streamparse, makes working with real-time data streams easy for Pythonistas. If you have ever wondered how to process 10,000 data tuples per second with Python -- while maintaining high availability and low latency -- this talk is for you.</p>
                                 </div>
                             </div>
+                            
+                        </div>
+                    </div>
+
+<!-- ################### -->
+<!-- ################### -->
+                    <div class="brickSS">
+                        <div class="row">
+                            <div class="col-md-6">
+                                <h3>P. Taylor Goetz - Scaling Storm: Cluster Sizing and Performance Optimization</h3>
+                                <div>
+                                    <p>Published on Jun 23, 2014</p><p>
+            ne of the most commonly asked questions about Storm is how to properly size and scale a cluster for a given use case. While there is no magic bullet when it comes to capacity planning for a Storm cluster, there are many operational and development techniques that can be applied to eek out the maximum throughput for a given application. In this session we’ll cover capacity planning, performance tuning and optimization from both an operational and development perspective. We will discuss the basics of scaling, common mistakes and misconceptions, how different technology decisions affect performance, and how to identify and scale around the bottlenecks in a Storm deployment.</p>
+                                </div>
+                            </div>
                             <div class="col-md-6">
-                                <iframe width="560" height="315" src="https://www.youtube.com/embed/l1MM_SHDrPY" frameborder="0" allowfullscreen></iframe>
+                                <iframe width="560" height="315" src="https://www.youtube.com/embed/cH8hKyf4Y40" frameborder="0" allowfullscreen></iframe>
                             </div>
                         </div>
                     </div>
@@ -145,9 +237,7 @@
                     
                     <div class="brickSS">
                         <div class="row">
-                            <div class="col-md-6">
-                                <iframe width="560" height="315" src="https://www.youtube.com/embed/od8U-XijzlQ" frameborder="0" allowfullscreen></iframe>
-                            </div>
+                            
                             <div class="col-md-6">
                                 <h3>Andrew Montalenti & Keith Bourgoin - Real-time streams and logs with Storm and Kafka - PyData SV 2014 
                                 </h3>
@@ -161,16 +251,20 @@
             <p>In this talk, we will give an overview of these technologies and how they fit into the Python ecosystem. This will include a discussion of current open source interoperability options with Python, and how to combine real-time computation with batch logic written for Hadoop. We will also discuss Kafka and Storm's alternatives, current industry usage, and some real-world examples of how these technologies are being used in production by Parse.ly today.</p>
                                 </div>
                             </div>
+                            <div class="col-md-6">
+                                <iframe width="560" height="315" src="https://www.youtube.com/embed/od8U-XijzlQ" frameborder="0" allowfullscreen></iframe>
+                            </div>
                         </div>
                     </div>
 <!-- ################### -->
                     <div class="brickSS">
                         <div class="row">
+                            
+                            <div class="col-md-6">
+                                <iframe width="560" height="315" src="https://www.youtube.com/embed/uJ5rdAPHE1w" frameborder="0" allowfullscreen></iframe>
+                            </div>
                             <div class="col-md-6">
                                 <h3>Yahoo talks about Spark vs. Storm
-                                <span>
-                                    Jim Scott
-                                </span>
                                 </h3>
                                 <div>
                                     <p>Published on Sep 18, 2014</p><p>
@@ -181,23 +275,15 @@
             <p>Tom Graves a Senior Software Engineer on the Platform team at Yahoo. He is an Apache PMC member on Hadoop, Spark, and Tez. His team is responsible for delivering and maintaining Spark on Yarn for Yahoo.</p>
                                 </div>
                             </div>
-                            <div class="col-md-6">
-                                <iframe width="560" height="315" src="https://www.youtube.com/embed/uJ5rdAPHE1w" frameborder="0" allowfullscreen></iframe>
-                            </div>
+                            
                             
                         </div>
                     </div>
 <!-- ################### -->
                     <div class="brickSS">
-                        <div class="row">
-                            <div class="col-md-6">
-                                <iframe width="560" height="315" src="https://www.youtube.com/embed/5F0eQ7mkpTU" frameborder="0" allowfullscreen></iframe>
-                            </div>
+
                             <div class="col-md-6">
                                 <h3>Apache Storm Deployment and Use Cases by Spotify Developers
-                                <span>
-                                    Hakka Labs
-                                </span>
                                 </h3>
                                 <div>
                                     <p>Published on Apr 3, 2014</p><p>
@@ -214,6 +300,10 @@
             <p>Spotify is an exciting case study - users create 600 Gigabyte of data per day and 150 Gigabyte of data per day via different services. Every day 4 Terabyte of data is generated in Hadoop, a 700-node cluster running over 2.000 jobs per day. They currently have 28 Petabytes of storage, spread out over 4 data centres across the world.</p>
                                 </div>
                             </div>
+                            <div class="row">
+                                <div class="col-md-6">
+                                    <iframe width="560" height="315" src="https://www.youtube.com/embed/5F0eQ7mkpTU" frameborder="0" allowfullscreen></iframe>
+                                </div>
                         </div>
                     </div>
                     
@@ -222,15 +312,16 @@
                     <div class="brickSS">
                         <div class="row">
                             <div class="col-md-6">
+                                <iframe width="560" height="315" src="https://www.youtube.com/embed/CrABmVi12_A" frameborder="0" allowfullscreen></iframe>
+                            </div>
+                            <div class="col-md-6">
                                 <h3>Nathan Bijnens: A Real-Time Architecture Using Hadoop &amp; Storm</h3>
                                 <div>
                                                         <p>Published on Dec 19, 2013</p>
                                 <p>With the proliferation of data sources and growing user bases, the amount of data generated requires new ways for storage and processing. Hadoop opened new possibilities, yet it falls short of instant delivery. Adding stream processing using Nathan Marz's Storm, can overcome this delay and bridge the gap to real-time aggregation and reporting. On the Batch layer all master data is kept and is immutable. Once the base data is stored a recurring process will index the data. This process reads all master data, parses it and will create new views out of it. The new views will replace all previously created views. In the Speed layer data is stored not yet absorbed in the Batch layer. Hours of data instead of years of data. Once the data is indexed in the Batch layer the data can discarded in the Speed layer. The Query Service merges the data from the Speed and Batch layers. This talk focuses on the Lambda architecture, which combines multiple technologi
 es to be able to process vast amounts of data, while still being able to react timely and report near real-time statistics. Filmed at JAX London 2013.</p>
                                 </div>
                             </div>
-                            <div class="col-md-6">
-                                <iframe width="560" height="315" src="https://www.youtube.com/embed/CrABmVi12_A" frameborder="0" allowfullscreen></iframe>
-                            </div>
+                            
                             
                         </div>
                     </div>
@@ -313,58 +404,34 @@
                 <div role="tabpanel" class="tab-pane" id="slideshows">
                     <div class="row" style="padding-left: 45px;">
                         <div class="col-md-6 brick">
-                            <h2>Apache storm vs. Spark Streaming
-                                <span>
-                                    P. Taylor Goetz
-                                </span>
-                            </h2>
-                            <iframe src="//www.slideshare.net/slideshow/embed_code/key/hZmAFT4CZ19WEM" width="340" height="290" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <div style="margin-bottom:5px"> <strong> <a href="//www.slideshare.net/ptgoetz/apache-storm-vs-spark-streaming" title="Apache storm vs. Spark Streaming" target="_blank">Apache storm vs. Spark Streaming</a> </strong> from <strong><a href="//www.slideshare.net/ptgoetz" target="_blank">P. Taylor Goetz</a></strong> </div>
+                            <h2>Apache Storm 0.9 basic training</h2>
+                            <iframe src="//www.slideshare.net/slideshow/embed_code/key/GUD3Y58U1f973x" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <div style="margin-bottom:5px"> <strong> <a href="//www.slideshare.net/miguno/apache-storm-09-basic-training-verisign" title="Apache Storm 0.9 basic training - Verisign" target="_blank">Apache Storm 0.9 basic training - Verisign</a> </strong> from <strong><a href="//www.slideshare.net/miguno" target="_blank">Michael Noll</a></strong> </div>
                         </div>
 
                         <div class="col-md-6 brick">
-                            <h2>Scaling Apache Storm - Strata + Hadoop World 2014
-                                <span>
-                                    P. Taylor Goetz
-                                </span>
-                            </h2>
+                            <h2>Scaling Apache Storm - Strata + Hadoop World 2014</h2>
                             <iframe src="//www.slideshare.net/slideshow/embed_code/key/NRMYq1985xMCWv" width="340" height="290" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <div style="margin-bottom:5px"> <strong> <a href="//www.slideshare.net/ptgoetz/scaling-apache-storm-strata-hadoopworld-2014" title="Scaling Apache Storm - Strata + Hadoop World 2014" target="_blank">Scaling Apache Storm - Strata + Hadoop World 2014</a> </strong> from <strong><a href="//www.slideshare.net/ptgoetz" target="_blank">P. Taylor Goetz</a></strong> </div>
                         </div>
 
                         <div class="col-md-6 brick">
-                            <h2>Yahoo compares Storm and Spark
-                                <span>
-                                    from Chicago Hadoop Users Group
-                                </span>
-                            </h2>
+                            <h2>Yahoo compares Storm and Spark</h2>
                             <iframe src="//www.slideshare.net/slideshow/embed_code/key/BRgWgMTzazVSbG" width="340" height="290" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <div style="margin-bottom:5px"> <strong> <a href="//www.slideshare.net/ChicagoHUG/yahoo-compares-storm-and-spark" title="Yahoo compares Storm and Spark" target="_blank">Yahoo compares Storm and Spark</a> </strong> from <strong><a href="//www.slideshare.net/ChicagoHUG" target="_blank">Chicago Hadoop Users Group</a></strong> </div>
                         </div>
                     </div>
 
                     <div class="row" style="padding-left: 45px;">
                         <div class="col-md-6 brick">
-                            <h2>Hadoop Summit Europe 2014: Apache Storm Architecture
-                                <span>
-                                    from P. Taylor Goetz
-                                </span>
-                            </h2>
+                            <h2>Hadoop Summit Europe 2014: Apache Storm Architecture</h2>
                             <iframe src="//www.slideshare.net/slideshow/embed_code/key/m9vKPotXvQ8hb7" width="340" height="290" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <div style="margin-bottom:5px"> <strong> <a href="//www.slideshare.net/ptgoetz/storm-hadoop-summit2014" title="Hadoop Summit Europe 2014: Apache Storm Architecture" target="_blank">Hadoop Summit Europe 2014: Apache Storm Architecture</a> </strong> from <strong><a href="//www.slideshare.net/ptgoetz" target="_blank">P. Taylor Goetz</a></strong> </div>
                         </div>
 
                         <div class="col-md-6 brick">
-                            <h2>Storm: distributed and fault-tolerant realtime computation
-                                <span>
-                                    from nathanmarz
-                                </span>
-                            </h2>
-                            <iframe src="//www.slideshare.net/slideshow/embed_code/key/zF8J7y8oz4Qtbc" width="340" height="290" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <div style="margin-bottom:5px"> <strong> <a href="//www.slideshare.net/nathanmarz/storm-distributed-and-faulttolerant-realtime-computation" title="Storm: distributed and fault-tolerant realtime computation" target="_blank">Storm: distributed and fault-tolerant realtime computation</a> </strong> from <strong><a href="//www.slideshare.net/nathanmarz" target="_blank">nathanmarz</a></strong> </div>
+                            <h2>Storm: distributed and fault-tolerant realtime computation</h2>
+                            <iframe src="//www.slideshare.net/slideshow/embed_code/key/zF8J7y8oz4Qtbc" width="340" height="290" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <div style="margin-bottom:5px"> <strong> <a href="//www.slideshare.net/nathanmarz/storm-distributed-and-faulttolerant-realtime-computation" title="Storm: distributed and fault-tolerant realtime computation" target="_blank">Storm: distributed and fault-tolerant realtime computation</a> </strong> from <strong><a href="//www.slideshare.net/nathanmarz" target="_blank">Nathan Marz</a></strong> </div>
                         </div>
 
                         <div class="col-md-6 brick">
-                            <h2>Realtime Analytics with Storm and Hadoop
-                                <span>
-                                    from Hadoop Summit
-                                </span>
-                            </h2>
+                            <h2>Realtime Analytics with Storm and Hadoop</h2>
                             <iframe src="//www.slideshare.net/slideshow/embed_code/key/wAvMj9LtK7OAwn" width="340" height="290" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <div style="margin-bottom:5px"> <strong> <a href="//www.slideshare.net/Hadoop_Summit/realtime-analytics-with-storm" title="Realtime Analytics with Storm and Hadoop" target="_blank">Realtime Analytics with Storm and Hadoop</a> </strong> from <strong><a href="//www.slideshare.net/Hadoop_Summit" target="_blank">Hadoop Summit</a></strong> </div>
                         </div>
                     </div>

http://git-wip-us.apache.org/repos/asf/storm/blob/af6d8ffc/contribute/Contributing-to-Storm.md
----------------------------------------------------------------------
diff --git a/contribute/Contributing-to-Storm.md b/contribute/Contributing-to-Storm.md
index 310214b..7a5b232 100644
--- a/contribute/Contributing-to-Storm.md
+++ b/contribute/Contributing-to-Storm.md
@@ -18,14 +18,10 @@ Contributions to the Storm codebase should be sent as [GitHub](https://github.co
 
 For small patches, feel free to submit pull requests directly for them. For larger contributions, please use the following process. The idea behind this process is to prevent any wasted work and catch design issues early on:
 
-1. Open an issue on the [issue tracker](https://issues.apache.org/jira/browse/STORM) if one doesn't exist already
+1. Open an issue on the [JIRA issue tracker](https://issues.apache.org/jira/browse/STORM) if one doesn't exist already
 2. Comment on the issue with your plan for implementing the issue. Explain what pieces of the codebase you're going to touch and how everything is going to fit together.
 3. Storm committers will iterate with you on the design to make sure you're on the right track
-4. Implement your issue, submit a pull request, and iterate from there.
-
-### Modules built on top of Storm
-
-Modules built on top of Storm (like spouts, bolts, etc) that aren't appropriate for Storm core can be done as your own project or as part of [@stormprocessor](https://github.com/stormprocessor). To be part of @stormprocessor put your project on your own Github and then send an email to the mailing list proposing to make it part of @stormprocessor. Then the community can discuss whether it's useful enough to be part of @stormprocessor. Then you'll be added to the @stormprocessor organization and can maintain your project there. The advantage of hosting your module in @stormprocessor is that it will be easier for potential users to find your project.
+4. Implement your issue, submit a pull request prefixed with the JIRA ID (e.g. "STORM-123: add new feature foo"), and iterate from there.
 
 ### Contributing documentation
 

http://git-wip-us.apache.org/repos/asf/storm/blob/af6d8ffc/documentation.html
----------------------------------------------------------------------
diff --git a/documentation.html b/documentation.html
index cbe145e..348edd8 100644
--- a/documentation.html
+++ b/documentation.html
@@ -12,6 +12,7 @@ title: Documentation
                         <li role="presentation" class="active"><a href="#basic" aria-controls="basic" role="tab" data-toggle="tab">Basics of Storm</a></li>
                         <li role="presentation"><a href="#trident" aria-controls="trident" role="tab" data-toggle="tab">Trident</a></li>
                         <li role="presentation"><a href="#setup" aria-controls="setup" role="tab" data-toggle="tab">Setup and deploying</a></li>
+                        <li role="presentation"><a href="#integration" aria-controls="integration" role="tab" data-toggle="tab">Integration</a></li>
                         <li role="presentation"><a href="#intermediate" aria-controls="intermediate" role="tab" data-toggle="tab">Intermediate</a></li>
                         <li role="presentation"><a href="#advance" aria-controls="advance" role="tab" data-toggle="tab">Advanced</a></li>
                     </ul>
@@ -47,6 +48,22 @@ title: Documentation
                                 <li><a href="documentation/Maven.html">Building Storm</a> with Maven</li>
                             </ul>
                         </div>
+                        <div role="tabpanel" class="tab-pane" id="integration">
+                            <p>The following modules are included in the Apache Storm distribution and are not required for storm to operate, 
+                            but are useful for extending Storm in order to provide additional functionality such as integration with other 
+                            technologies frequently used in combination with Storm.</p>
+                            <ul>
+                                <li><a href="documentation/storm-kafka.html">Kafka</a></li>
+                                <li><a href="documentation/storm-hdfs.html">HDFS</a></li>
+                                <li><a href="documentation/storm-hbase.html">HBase</a></li>
+                                <li><a href="documentation/storm-hive.html">Hive</a></li>
+                                <li><a href="documentation/storm-jdbc.html">JDBC</a></li>
+                                <li><a href="documentation/storm-redis.html">Redis</a></li>
+                                <li><a href="documentation/storm-solr.html">Solr</a></li>
+                                <li><a href="documentation/storm-eventhubs.html">Azure EventHubs</a></li>
+                                <li><a href="documentation/flux.html">Flux</a> (declarative wiring/configuration of Topologies)</li>
+                            </ul>
+                        </div>
                         <div role="tabpanel" class="tab-pane" id="intermediate">
                             <ul>
                                 <li><a href="documentation/Serialization.html">Serialization</a></li>