diff --git a/_posts/2021-04-01-mit6824-2.markdown b/_posts/2021-04-01-mit6824-2.markdown index 259e729..74fc747 100644 --- a/_posts/2021-04-01-mit6824-2.markdown +++ b/_posts/2021-04-01-mit6824-2.markdown @@ -41,36 +41,3 @@ comments: true - `Get(k) -> v` 强一致性系统: 保证最新的一致性,但成本很高, 因为你必须跟他人进行大量的交流才能实现强一致性概念. - -# Mapreduce -这是一个典型的 mapreduce job -![mapreduce](/images/posts/mapreduce01.png) -- 整个计算流程被称为 `Job` -- 任何一次 Map/Reduce的调用被称为 `Task` - -一个完整的 `job` 由一系列 `map task` 和 `reduce task` 组成. - -{% highlight ruby %} -Map(k,v) - split V into words - for each word w - emit(w, "1") -{% endhighlight %} - -Map函数, k 是一个文件名, v 代表传入这个 map 函数的输入文件的内容. 通过调用 MapReduce framework 的 map 函数可以做出发送(emit)动作, emit 在 map 函数中 worker 会讲结果写入本地磁盘或存储 -{% highlight ruby %} -Reduce(k, v) - emit(len(v)) -{% endhighlight %} -K is word, Reduce 函数会更加这个 key 所关联的所有 map 对应的值得到一个 vector 数组. master 发送执行 Reduce 函数至 worker 节点以后, worker 节点会和所有 map执行节点通讯, 请求 map 结果文件然后执行 emit 操作, emit 在 Reduce 函数中 worker 会将结果写入集群或共享文件系统(GFS),作为最终结果. - -GFS 会自动将你存储在它之上的任何大文件分割成 64Mb 大小的数据块, 并将它们分散存储在许多服务器上, - -2004 年 当 mapreduce 提出的时候,系统最大的瓶颈来源于网络吞吐量, 所以他们通过一系列方法来避免网络传输, 本地优化: -- 其中一种就是讲 GFS 服务器和 mapreduce worker 配置在同一个计算机集群中, 接着 master 会讲 map 任务拆分,然后分配给不同的 worker, master 会从 GFS 找出实际保存该输入文件所在的服务器. -- map会将结果输出到运行map的计算机本地磁盘上 - -![mapreduce](/images/posts/shuffle.png) -- 当reduce 执行的时候, reduce 的 worker 会要求 map 的 worker 将行存储转换成列存储, 这个过程在论文中称作 **shuffle**. 这个过程将从整个网络中的 map worker 中获取数据, 这也是 mapreduce 中非常消耗性能的一部分. - -但现在 2020 年, 许多数据中心的网络瓶颈已经解决了, 不会再有root路由器的性能瓶颈, google可能也不用MapReduce很久了, 所以map函数其实可以自由的从任何网络获取数据不知局限于本地磁盘了.