<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Distributed System on MT&#39;s blog</title>
    <link>https://rmtt.github.io/zh/categories/distributed-system/</link>
    <description>Recent content in Distributed System on MT&#39;s blog</description>
    <generator>Hugo</generator>
    <language>zh</language>
    <lastBuildDate>Sat, 19 Jun 2021 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://rmtt.github.io/zh/categories/distributed-system/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>MIT 6.824 Lec1 分布式：MapReduce</title>
      <link>https://rmtt.github.io/zh/posts/ds-lec1/</link>
      <pubDate>Sat, 19 Jun 2021 00:00:00 +0000</pubDate>
      <guid>https://rmtt.github.io/zh/posts/ds-lec1/</guid>
      <description>&lt;h1 id=&#34;introduction&#34;&gt;Introduction&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;paper url: &lt;a href=&#34;http://nil.csail.mit.edu/6.824/2020/papers/mapreduce.pdf&#34;&gt;http://nil.csail.mit.edu/6.824/2020/papers/mapreduce.pdf&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;h2 id=&#34;why-need-distributed&#34;&gt;Why need distributed&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;parallelism&lt;/li&gt;
&lt;li&gt;fault tolerance&lt;/li&gt;
&lt;li&gt;physical&lt;/li&gt;
&lt;li&gt;security or isolated&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;basic-challenges&#34;&gt;Basic challenges&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;concurrency&lt;/li&gt;
&lt;li&gt;partial failture&lt;/li&gt;
&lt;li&gt;performence&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;map-reduce&#34;&gt;Map Reduce&lt;/h2&gt;
&lt;h3 id=&#34;个人理解&#34;&gt;个人理解&lt;/h3&gt;
&lt;p&gt;MapReduce是一个比较直观而且可以分布式的编程框架，主要过程就是将数据（输入）分发到不同的task（map过程），然后将所有task的输出收集起来shuffle一下，然后分发给另外的task（reduce过程）。从目前（2021年）来看，这个编程模型的瓶颈应该是中间的shuffle过程，因为数据量非常大的时候，shuffle过程的网络IO量也非常大。&lt;/p&gt;
&lt;h3 id=&#34;关键点&#34;&gt;关键点&lt;/h3&gt;
&lt;p&gt;MapReduce的编程模型很简单，但Google的论文中最有价值的部分是应该是关于容错和任务备份。&lt;/p&gt;
&lt;h4 id=&#34;容错&#34;&gt;容错&lt;/h4&gt;
&lt;h5 id=&#34;worker容错&#34;&gt;Worker容错&lt;/h5&gt;
&lt;p&gt;每个Task可以分为三个状态，&lt;code&gt;idle&lt;/code&gt;/&lt;code&gt;in-progress&lt;/code&gt;/&lt;code&gt;completed&lt;/code&gt;，当task被分配给worker后，会由&lt;code&gt;idle&lt;/code&gt;变为&lt;code&gt;in-progress&lt;/code&gt;状态，当worker正常完成task时，会由&lt;code&gt;in-progress&lt;/code&gt;变为&lt;code&gt;completed&lt;/code&gt;。
当worker因意外或其他原因变得&lt;code&gt;inavaible&lt;/code&gt;时，Task将会变成&lt;code&gt;idle&lt;/code&gt;状态，然后master就可以将其重新分配给其他worker去完成。&lt;/p&gt;
&lt;h5 id=&#34;master容错&#34;&gt;Master容错&lt;/h5&gt;
&lt;p&gt;Master的错误比较暴力，直接做几个&lt;code&gt;mirror&lt;/code&gt;就行了，如果没有&lt;code&gt;mirror&lt;/code&gt;，那么当master出错时，整个系统就会宕机。&lt;/p&gt;
&lt;h4 id=&#34;任务备份&#34;&gt;任务备份&lt;/h4&gt;
&lt;p&gt;个人觉得是论文里一个不错的点，任务备份是当一个MapReduce操作（个人理解就是map和reduce)完成时，将当前&lt;code&gt;in-progress&lt;/code&gt;的Task备份，然后当有空闲的worker时再将备份中的task分配过去执行。这样的好处是可以明显减少因为&lt;code&gt;straggler&lt;/code&gt;的存在而导致的性能下降。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;straggler指因为磁盘、网络等原因而造成性能下降的Worker&lt;/p&gt;&lt;/blockquote&gt;
&lt;h3 id=&#34;personal-idea&#34;&gt;personal idea&lt;/h3&gt;
&lt;p&gt;因为在实际情况中，每个Worker都会因为各种因素而产生性能上的差距。同时，Master中也记录了每个task的完成时间，感觉可以用完成时间的平均值（或者之类的）来将worker放到一颗平衡树里面，然后优先用效率高的worker去完成task。&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
