<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
		>
<channel>
	<title>Comments on: Introduction to MapReduce for .NET Developers</title>
	<atom:link href="http://www.developerzen.com/2009/05/06/introduction-to-mapreduce-for-net-developers/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.developerzen.com/2009/05/06/introduction-to-mapreduce-for-net-developers/</link>
	<description>The essence of software development...</description>
	<lastBuildDate>Thu, 28 Jan 2010 00:10:31 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
		<item>
		<title>By: MohitT</title>
		<link>http://www.developerzen.com/2009/05/06/introduction-to-mapreduce-for-net-developers/comment-page-1/#comment-2228</link>
		<dc:creator>MohitT</dc:creator>
		<pubDate>Fri, 15 Jan 2010 10:23:00 +0000</pubDate>
		<guid isPermaLink="false">http://www.developerzen.com/?p=2294#comment-2228</guid>
		<description>Hi,

Would it be good, if you complete this example for naive userd like me, by deploying this in one of the cloud providers like Windows Azure. 

Regards
Mohit</description>
		<content:encoded><![CDATA[<p>Hi,</p>
<p>Would it be good, if you complete this example for naive userd like me, by deploying this in one of the cloud providers like Windows Azure. </p>
<p>Regards<br />
Mohit</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: CraigH</title>
		<link>http://www.developerzen.com/2009/05/06/introduction-to-mapreduce-for-net-developers/comment-page-1/#comment-2087</link>
		<dc:creator>CraigH</dc:creator>
		<pubDate>Thu, 06 Aug 2009 13:23:15 +0000</pubDate>
		<guid isPermaLink="false">http://www.developerzen.com/?p=2294#comment-2087</guid>
		<description>You key/value pair definitions are slightly different to the original Google spec.

You specify
Map --&gt; Intermediates --&gt; Reduce as 
(K1, V1) –-&gt; (K2, V2) –-&gt; V3

where google has
Map --&gt; Intermediates --&gt; Reduce as 
(K1, V1) –-&gt; (K2, list(V2)) –-&gt; V2

I thought Hadoop was the same as Google?

See also a C++ implementation of MapReduce at http://www.craighenderson.co.uk/mapreduce which I hope to get through a submission to Boost.org sometime in the future.</description>
		<content:encoded><![CDATA[<p>You key/value pair definitions are slightly different to the original Google spec.</p>
<p>You specify<br />
Map &#8211;&gt; Intermediates &#8211;&gt; Reduce as<br />
(K1, V1) –-&gt; (K2, V2) –-&gt; V3</p>
<p>where google has<br />
Map &#8211;&gt; Intermediates &#8211;&gt; Reduce as<br />
(K1, V1) –-&gt; (K2, list(V2)) –-&gt; V2</p>
<p>I thought Hadoop was the same as Google?</p>
<p>See also a C++ implementation of MapReduce at <a href="http://www.craighenderson.co.uk/mapreduce" rel="nofollow">http://www.craighenderson.co.uk/mapreduce</a> which I hope to get through a submission to Boost.org sometime in the future.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: ekampf</title>
		<link>http://www.developerzen.com/2009/05/06/introduction-to-mapreduce-for-net-developers/comment-page-1/#comment-2070</link>
		<dc:creator>ekampf</dc:creator>
		<pubDate>Sat, 18 Jul 2009 20:36:02 +0000</pubDate>
		<guid isPermaLink="false">http://www.developerzen.com/?p=2294#comment-2070</guid>
		<description>Hi George,
  What I meant by that sentence is that I could have used Func&lt;T1,T2,TResult&gt; etc. instead of defining my own delegate types: MapFunction, ReduceFunction which would have made the function signature longer and less readable.

I like your LINQ implementation, which also less explicit and provides more freedom. However for my tutorial I thought more explicit code (specifying the key, value types for each step) would help convey the concept better...

In any case, both codes are just samples and you really need the power of a distributed platform (Hadoop, Dryad etc...) to really make use of the advantages map-reduce has to offer...

Regards,
Eran</description>
		<content:encoded><![CDATA[<p>Hi George,<br />
  What I meant by that sentence is that I could have used Func<t1 ,T2,TResult> etc. instead of defining my own delegate types: MapFunction, ReduceFunction which would have made the function signature longer and less readable.</p>
<p>I like your LINQ implementation, which also less explicit and provides more freedom. However for my tutorial I thought more explicit code (specifying the key, value types for each step) would help convey the concept better&#8230;</p>
<p>In any case, both codes are just samples and you really need the power of a distributed platform (Hadoop, Dryad etc&#8230;) to really make use of the advantages map-reduce has to offer&#8230;</p>
<p>Regards,<br />
Eran</t1></p>
]]></content:encoded>
	</item>
	<item>
		<title>By: George Dernikos</title>
		<link>http://www.developerzen.com/2009/05/06/introduction-to-mapreduce-for-net-developers/comment-page-1/#comment-2068</link>
		<dc:creator>George Dernikos</dc:creator>
		<pubDate>Thu, 16 Jul 2009 17:15:53 +0000</pubDate>
		<guid isPermaLink="false">http://www.developerzen.com/?p=2294#comment-2068</guid>
		<description>Oops! Something happened to the code..
Anyhow, here&#039;s the snippet: http://csharp.pastebin.com/f6f8e34a0</description>
		<content:encoded><![CDATA[<p>Oops! Something happened to the code..<br />
Anyhow, here&#8217;s the snippet: <a href="http://csharp.pastebin.com/f6f8e34a0" rel="nofollow">http://csharp.pastebin.com/f6f8e34a0</a></p>
]]></content:encoded>
	</item>
	<item>
		<title>By: George Dernikos</title>
		<link>http://www.developerzen.com/2009/05/06/introduction-to-mapreduce-for-net-developers/comment-page-1/#comment-2067</link>
		<dc:creator>George Dernikos</dc:creator>
		<pubDate>Thu, 16 Jul 2009 17:10:09 +0000</pubDate>
		<guid isPermaLink="false">http://www.developerzen.com/?p=2294#comment-2067</guid>
		<description>@ekampf

First of all hi there, nice post..

As I was reading the post you I didn&#039;t quite understand the &quot;(Yes, I realize I could use .NET’s Func instead but that would just result in horribly long ugly code…)&quot; part. I kind of disagree on that.

Here&#039;s my *naive* implementation of MapReduce to reason my disagreement, in which I use Func:
&lt;code&gt;
public static IEnumerable MapReduce(
    this IEnumerable source,
    Func mapper,
    Func grouper,
    Func&lt;IGrouping, TReduceResult&gt; reducer)
{
    return source.Select(mapper).GroupBy(grouper).Select(reducer);
}
&lt;/code&gt;

that&#039;s it..
and a small example, say I want to get word counts from a list of documents:
&lt;code&gt;
var documents = new[] {
    new {
        Name = &quot;doc1.txt&quot;,
        Data = &quot;word1 word2 word3 word4 word2 word2 word4 word4 word4&quot;
    },
    new {
        Name = &quot;doc2.txt&quot;,
        Data = &quot;word5 word6 word7 word8 word6 word6 word7 word7 word7&quot;
    }
};

var docs = documents.MapReduce(
    d =&gt; d,
    d =&gt; d.Name,
    d =&gt; new
    {
        FileName = d.Key,
        WordOccurences = d.Single().Data.Split(&#039; &#039;).MapReduce(
            w =&gt; new { Word = w, Occurence = 1 },
            w =&gt; w.Word,
            w =&gt; new { Word = w.Key, Occurence = w.Sum(wi =&gt; wi.Occurence) })
    });

foreach (var d in docs)
{
    Console.WriteLine(d.FileName);
    foreach (var w in d.WordOccurences)
        Console.WriteLine(&quot;\t{0}: {1}&quot;, w.Word, w.Occurence);
}
&lt;/code&gt;

Note: I use MapReduce to iterate over the list of documents as well over the list of words of each document.
I don&#039;t think you get long and ugly code, on the contrary, in my opinion it&#039;s more beautiful.

Anyhow, it was a nice article of yours and if only we had a Querable version of a MapReduce method that could not only run on a bunch of threads but on a cluster too, that would be great :).</description>
		<content:encoded><![CDATA[<p>@ekampf</p>
<p>First of all hi there, nice post..</p>
<p>As I was reading the post you I didn&#8217;t quite understand the &#8220;(Yes, I realize I could use .NET’s Func instead but that would just result in horribly long ugly code…)&#8221; part. I kind of disagree on that.</p>
<p>Here&#8217;s my *naive* implementation of MapReduce to reason my disagreement, in which I use Func:<br />
<code><br />
public static IEnumerable MapReduce(<br />
    this IEnumerable source,<br />
    Func mapper,<br />
    Func grouper,<br />
    Func&lt;IGrouping, TReduceResult&gt; reducer)<br />
{<br />
    return source.Select(mapper).GroupBy(grouper).Select(reducer);<br />
}<br />
</code></p>
<p>that&#8217;s it..<br />
and a small example, say I want to get word counts from a list of documents:<br />
<code><br />
var documents = new[] {<br />
    new {<br />
        Name = "doc1.txt",<br />
        Data = "word1 word2 word3 word4 word2 word2 word4 word4 word4"<br />
    },<br />
    new {<br />
        Name = "doc2.txt",<br />
        Data = "word5 word6 word7 word8 word6 word6 word7 word7 word7"<br />
    }<br />
};</p>
<p>var docs = documents.MapReduce(<br />
    d =&gt; d,<br />
    d =&gt; d.Name,<br />
    d =&gt; new<br />
    {<br />
        FileName = d.Key,<br />
        WordOccurences = d.Single().Data.Split(' ').MapReduce(<br />
            w =&gt; new { Word = w, Occurence = 1 },<br />
            w =&gt; w.Word,<br />
            w =&gt; new { Word = w.Key, Occurence = w.Sum(wi =&gt; wi.Occurence) })<br />
    });</p>
<p>foreach (var d in docs)<br />
{<br />
    Console.WriteLine(d.FileName);<br />
    foreach (var w in d.WordOccurences)<br />
        Console.WriteLine("\t{0}: {1}", w.Word, w.Occurence);<br />
}<br />
</code></p>
<p>Note: I use MapReduce to iterate over the list of documents as well over the list of words of each document.<br />
I don&#8217;t think you get long and ugly code, on the contrary, in my opinion it&#8217;s more beautiful.</p>
<p>Anyhow, it was a nice article of yours and if only we had a Querable version of a MapReduce method that could not only run on a bunch of threads but on a cluster too, that would be great <img src='http://www.developerzen.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: ekampf</title>
		<link>http://www.developerzen.com/2009/05/06/introduction-to-mapreduce-for-net-developers/comment-page-1/#comment-1837</link>
		<dc:creator>ekampf</dc:creator>
		<pubDate>Wed, 13 May 2009 11:03:57 +0000</pubDate>
		<guid isPermaLink="false">http://www.developerzen.com/?p=2294#comment-1837</guid>
		<description>They don&#039;t need to use the key in this sample.

The Map function:
Gets a key and value where the value is a text to scan. It iterates over the words in the text and outputs  values

The Reduce function:
Gets a key (word) and list of values (lots of 1&#039;s) and return a sum of the values which is the number of the word was encountered.
Its the code calling the reduce delegate function that uses the key:

&lt;blockquote&gt;    // Reduce on each group
    var reduced = from g in groups
                  let k2 = g.Key
                  from reducedValue in _reduce(k2, g)
                  &lt;strong&gt;select new KeyValuePair(k2, reducedValue);&lt;/strong&gt;
&lt;/blockquote&gt;

So the output of the entire process is an list of  pairs...

The key matters to the result of each operation but not to the actual code of the map\reduce delegates as the framework running the delegates takes care of the work related to the keys (grouping etc.)</description>
		<content:encoded><![CDATA[<p>They don&#8217;t need to use the key in this sample.</p>
<p>The Map function:<br />
Gets a key and value where the value is a text to scan. It iterates over the words in the text and outputs  values</p>
<p>The Reduce function:<br />
Gets a key (word) and list of values (lots of 1&#8217;s) and return a sum of the values which is the number of the word was encountered.<br />
Its the code calling the reduce delegate function that uses the key:</p>
<blockquote><p>    // Reduce on each group<br />
    var reduced = from g in groups<br />
                  let k2 = g.Key<br />
                  from reducedValue in _reduce(k2, g)<br />
                  <strong>select new KeyValuePair(k2, reducedValue);</strong>
</p></blockquote>
<p>So the output of the entire process is an list of  pairs&#8230;</p>
<p>The key matters to the result of each operation but not to the actual code of the map\reduce delegates as the framework running the delegates takes care of the work related to the keys (grouping etc.)</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Paul Batum</title>
		<link>http://www.developerzen.com/2009/05/06/introduction-to-mapreduce-for-net-developers/comment-page-1/#comment-1836</link>
		<dc:creator>Paul Batum</dc:creator>
		<pubDate>Wed, 13 May 2009 10:50:35 +0000</pubDate>
		<guid isPermaLink="false">http://www.developerzen.com/?p=2294#comment-1836</guid>
		<description>Heh, I&#039;m still confused.

Can you explain why your MapFromMem and Reduce methods at the end don&#039;t use the key argument they are passed?</description>
		<content:encoded><![CDATA[<p>Heh, I&#8217;m still confused.</p>
<p>Can you explain why your MapFromMem and Reduce methods at the end don&#8217;t use the key argument they are passed?</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: ekampf</title>
		<link>http://www.developerzen.com/2009/05/06/introduction-to-mapreduce-for-net-developers/comment-page-1/#comment-1835</link>
		<dc:creator>ekampf</dc:creator>
		<pubDate>Wed, 13 May 2009 10:48:53 +0000</pubDate>
		<guid isPermaLink="false">http://www.developerzen.com/?p=2294#comment-1835</guid>
		<description>Oh yeah, depending on your algorithm you may be able to add another layer of reducers. They&#039;re called Combiners in Hadoop (&lt;a href=&quot;http://wiki.apache.org/hadoop/HadoopMapReduce&quot; rel=&quot;nofollow&quot;&gt;http://wiki.apache.org/hadoop/HadoopMapReduce&lt;/a&gt;):

&lt;blockquote&gt;&quot;When the map operation outputs its pairs they are already available in memory. For efficiency reasons, sometimes it makes sense to take advantage of this fact by supplying a combiner class to perform a reduce-type function. If a combiner is used then the map key-value pairs are not immediately written to the output. Instead they will be collected in lists, one list per each key value. When a certain number of key-value pairs have been written, this buffer is flushed by passing all the values of each key to the combiner&#039;s reduce method and outputting the key-value pairs of the combine operation as if they were created by the original map operation.

For example, a word count MapReduce application whose map operation outputs (word, 1) pairs as words are encountered in the input can use a combiner to speed up processing. A combine operation will start gathering the output in in-memory lists (instead of on disk), one list per word. Once a certain number of pairs is output, the combine operation will be called once per unique word with the list available as an iterator. The combiner then emits (word, count-in-this-part-of-the-input) pairs. From the viewpoint of the Reduce operation this contains the same information as the original Map output, but there should be far fewer pairs output to disk and read from disk. &quot;&lt;/blockquote&gt;

</description>
		<content:encoded><![CDATA[<p>Oh yeah, depending on your algorithm you may be able to add another layer of reducers. They&#8217;re called Combiners in Hadoop (<a href="http://wiki.apache.org/hadoop/HadoopMapReduce" rel="nofollow">http://wiki.apache.org/hadoop/HadoopMapReduce</a>):</p>
<blockquote><p>&#8220;When the map operation outputs its pairs they are already available in memory. For efficiency reasons, sometimes it makes sense to take advantage of this fact by supplying a combiner class to perform a reduce-type function. If a combiner is used then the map key-value pairs are not immediately written to the output. Instead they will be collected in lists, one list per each key value. When a certain number of key-value pairs have been written, this buffer is flushed by passing all the values of each key to the combiner&#8217;s reduce method and outputting the key-value pairs of the combine operation as if they were created by the original map operation.</p>
<p>For example, a word count MapReduce application whose map operation outputs (word, 1) pairs as words are encountered in the input can use a combiner to speed up processing. A combine operation will start gathering the output in in-memory lists (instead of on disk), one list per word. Once a certain number of pairs is output, the combine operation will be called once per unique word with the list available as an iterator. The combiner then emits (word, count-in-this-part-of-the-input) pairs. From the viewpoint of the Reduce operation this contains the same information as the original Map output, but there should be far fewer pairs output to disk and read from disk. &#8220;</p></blockquote>
]]></content:encoded>
	</item>
	<item>
		<title>By: ekampf</title>
		<link>http://www.developerzen.com/2009/05/06/introduction-to-mapreduce-for-net-developers/comment-page-1/#comment-1834</link>
		<dc:creator>ekampf</dc:creator>
		<pubDate>Wed, 13 May 2009 10:35:17 +0000</pubDate>
		<guid isPermaLink="false">http://www.developerzen.com/?p=2294#comment-1834</guid>
		<description>The reducer&#039;s result of the reduce operation do not look like the result of the map operation. That&#039;s why on the sample code I define the following:
    * (K1, V1) – key-value types for the input data
    * (K2, V2) – key value types for the intermediate results (results of our Map function)
    * V3 – The type of the result for the entire Map-Reduce process

The reducer gets as input an intermediate-key and all the values mapped to it in the mapping phase.
It runs over those values and outputs a result (V3).
You can&#039;t run the reduce until you have that list of all the values mapped to a certain key - so you have to wait for the mapping phase to finish.</description>
		<content:encoded><![CDATA[<p>The reducer&#8217;s result of the reduce operation do not look like the result of the map operation. That&#8217;s why on the sample code I define the following:<br />
    * (K1, V1) – key-value types for the input data<br />
    * (K2, V2) – key value types for the intermediate results (results of our Map function)<br />
    * V3 – The type of the result for the entire Map-Reduce process</p>
<p>The reducer gets as input an intermediate-key and all the values mapped to it in the mapping phase.<br />
It runs over those values and outputs a result (V3).<br />
You can&#8217;t run the reduce until you have that list of all the values mapped to a certain key &#8211; so you have to wait for the mapping phase to finish.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Paul Batum</title>
		<link>http://www.developerzen.com/2009/05/06/introduction-to-mapreduce-for-net-developers/comment-page-1/#comment-1833</link>
		<dc:creator>Paul Batum</dc:creator>
		<pubDate>Wed, 13 May 2009 10:31:02 +0000</pubDate>
		<guid isPermaLink="false">http://www.developerzen.com/?p=2294#comment-1833</guid>
		<description>Unless I am missing something, you can also start actual the reducing without all the data. Because the results of the reduce operation look the same as the results of the map operation, you can re-reduce a combination of previously reduced results and newly mapped results.</description>
		<content:encoded><![CDATA[<p>Unless I am missing something, you can also start actual the reducing without all the data. Because the results of the reduce operation look the same as the results of the map operation, you can re-reduce a combination of previously reduced results and newly mapped results.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: ekampf</title>
		<link>http://www.developerzen.com/2009/05/06/introduction-to-mapreduce-for-net-developers/comment-page-1/#comment-1832</link>
		<dc:creator>ekampf</dc:creator>
		<pubDate>Wed, 13 May 2009 08:22:28 +0000</pubDate>
		<guid isPermaLink="false">http://www.developerzen.com/?p=2294#comment-1832</guid>
		<description>Hi Paul,
  You&#039;re right. Those two statements seems contradicting but they&#039;re actually both true and the post which isn&#039;t correctly explained in the post (which I&#039;ll have to correct)

The first statement is obviously correct because you can&#039;t start running our reducer method before you have all the values for the intermediate key - which means the mapper has to finish running.

However, if you download Hadoop and run one of its samples you&#039;ll see that it start running the Reducer tasks before the Mapper tasks finish.
This happens because the reducer task is composed of two phases:
1. Shuffle phase: collect the map outputs and group by key
2. Reduce phase: the actual reducing

Phase one of the reducer can execute in parallel with the mapping process and that is what the 2nd statement is referring to - you can start streaming and grouping values from the mappers to the reducers during the mapping process.

Hope this clarifies your confusion...

Regards,
Eran</description>
		<content:encoded><![CDATA[<p>Hi Paul,<br />
  You&#8217;re right. Those two statements seems contradicting but they&#8217;re actually both true and the post which isn&#8217;t correctly explained in the post (which I&#8217;ll have to correct)</p>
<p>The first statement is obviously correct because you can&#8217;t start running our reducer method before you have all the values for the intermediate key &#8211; which means the mapper has to finish running.</p>
<p>However, if you download Hadoop and run one of its samples you&#8217;ll see that it start running the Reducer tasks before the Mapper tasks finish.<br />
This happens because the reducer task is composed of two phases:<br />
1. Shuffle phase: collect the map outputs and group by key<br />
2. Reduce phase: the actual reducing</p>
<p>Phase one of the reducer can execute in parallel with the mapping process and that is what the 2nd statement is referring to &#8211; you can start streaming and grouping values from the mappers to the reducers during the mapping process.</p>
<p>Hope this clarifies your confusion&#8230;</p>
<p>Regards,<br />
Eran</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Paul Batum</title>
		<link>http://www.developerzen.com/2009/05/06/introduction-to-mapreduce-for-net-developers/comment-page-1/#comment-1829</link>
		<dc:creator>Paul Batum</dc:creator>
		<pubDate>Wed, 13 May 2009 02:41:44 +0000</pubDate>
		<guid isPermaLink="false">http://www.developerzen.com/?p=2294#comment-1829</guid>
		<description>Great post, but there is one thing that confuses me. 

First you say:
&quot;Therefore both phases can be parallelized with the only bottleneck being the fact that the map phase has to finish for the reduce phase to start.&quot;

Then you say:
&quot;Streamline values emitted by map function to the worker (or workers) doing the reduce. Note that we don’t have to wait for a certain map run to finish going over the entire file in order to start sending its emitted values to the reducer, so the map and reduce functions can process data in parallel.&quot;

Am I missing something, or are these two statements contradictory?</description>
		<content:encoded><![CDATA[<p>Great post, but there is one thing that confuses me. </p>
<p>First you say:<br />
&#8220;Therefore both phases can be parallelized with the only bottleneck being the fact that the map phase has to finish for the reduce phase to start.&#8221;</p>
<p>Then you say:<br />
&#8220;Streamline values emitted by map function to the worker (or workers) doing the reduce. Note that we don’t have to wait for a certain map run to finish going over the entire file in order to start sending its emitted values to the reducer, so the map and reduce functions can process data in parallel.&#8221;</p>
<p>Am I missing something, or are these two statements contradictory?</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: ekampf</title>
		<link>http://www.developerzen.com/2009/05/06/introduction-to-mapreduce-for-net-developers/comment-page-1/#comment-1824</link>
		<dc:creator>ekampf</dc:creator>
		<pubDate>Tue, 12 May 2009 11:12:10 +0000</pubDate>
		<guid isPermaLink="false">http://www.developerzen.com/?p=2294#comment-1824</guid>
		<description>Thanks :)
Its not cut, just for some reason it won&#039;t wrap like the other text :S  will try to fix...</description>
		<content:encoded><![CDATA[<p>Thanks <img src='http://www.developerzen.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
Its not cut, just for some reason it won&#8217;t wrap like the other text :S  will try to fix&#8230;</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: avi</title>
		<link>http://www.developerzen.com/2009/05/06/introduction-to-mapreduce-for-net-developers/comment-page-1/#comment-1823</link>
		<dc:creator>avi</dc:creator>
		<pubDate>Tue, 12 May 2009 04:45:54 +0000</pubDate>
		<guid isPermaLink="false">http://www.developerzen.com/?p=2294#comment-1823</guid>
		<description>thanks,
great post, very interesting.

BTW&#039; the line 
MapReduceProgram master = new MapReduceProgram(MapFromMem, Reduce);
is cut</description>
		<content:encoded><![CDATA[<p>thanks,<br />
great post, very interesting.</p>
<p>BTW&#8217; the line<br />
MapReduceProgram master = new MapReduceProgram(MapFromMem, Reduce);<br />
is cut</p>
]]></content:encoded>
	</item>
</channel>
</rss>
