muduo多机协作网络编程示例一:单词计数及排序

原创 2013年01月13日 03:59:54


去年我写了《Muduo 网络编程示例》系列文章,这些文章已经收入《Linux 多线程服务端编程:使用 muduo C++ 网络库》一书。这些文章讲的基本都是运行在单机上的网络程序,每个例子都只有一个程序(第7.13节例外)。我接下来打算继续写几篇文章,谈一谈分布在多台机器上、协作发挥作用的网络编程例子。

今天先讲第一个,单词计数及排序。单词计数(word count),顾名思义就是统计一个文本文件里边每个词出现了多少次。排序指的是按出现次数从多到少排序,也可以把问题改为“找出出现次数最多的1000个单词”。

这个问题有三个层次,第一是输入文件比较小,能完全放入内存;第二是输入文件比较大,不能一次性都放入内存;第三是输入文件分布在多台机器上,这需要用到网络编程。

第一个层次很好解决,几十行代码就搞定了。https://gist.github.com/4519962

第二个层次不难解决,基本思路是分而治之,先hash分块统计单词出现次数,将每一块按出现次数排序,最后归并。代码见 https://github.com/chenshuo/recipes/blob/master/puzzle/query_freq.cc ,分析见http://www.cnblogs.com/baiyanhuang/archive/2012/11/11/2764914.html 。

第三个层次也不难,可以当做网络编程的练习来做。如果有合适的框架,可以轻松解决,因为单词计数是map reduce的经典范例,对出现次数排序也可以再用一步map reduce搞定(估计需要一个好的 shuffle 函数,简单hash是不行的)。

如果用普通网络编程,一种设计思路如下图,其中方框代表机器,椭圆代表输入输出文件,圆角矩形代表进程。思路跟第二个层次一样,先hash到多个shard文件(由hasher和receiver负责),再对每个shard文件排序(由sender负责),最后归并(merger)。

topk

注意这种思路适合求top K元素,不适合按出现次数排序全部单词,因为最终结果收集在一台机器上。目前这个sender实现的一个限制是,每个shard必须能全部放入内存,因为sender对shard排序是在内存中进行的。如果数据更大,还需要实现单机外部排序。

图中hasher和receiver的代码见muduo示例中的 muduo/examples/wordcount ;sender和merger的代码见 https://github.com/chenshuo/recipes/tree/master/topk 。注意merger没有使用muduo,而是采用阻塞网络编程。有兴趣的读者可以思考其背后的原因。要想发挥 merger 正常的性能,需要修改 /usr/include/boost/asio/basic_socket_streambuf.hpp ,增大缓冲区,即 enum { buffer_size = 8192 };

这可以看作是map reduce的原始实现,或者说用map reduce的思想手写了一些原始工具。如果把map reduce比作C语言,这里的几个程序相当于汇编写的函数。

以后我再写一个按出现次数全排序的例子吧,需要替换这里的sender和merger。

(.完.)

Muduo 网络编程示例之零:前言

我将会写一系列文章,介绍用 muduo 网络库完成常见的 TCP 网络编程任务。这些例子都比较简单,逻辑不复杂,代码也很短,适合摘取关键部分放到博客上。其中一些有一定的代表性与针对性,比如“如何传输完...
  • Solstice
  • Solstice
  • 2011-02-02 00:58:00
  • 32336

muduo网络编程分包和解包(二)

1. muduo发送结构体的方法如果发送端仅仅发送一段字符串,可以使用《muduo网络编程分包和解包(一)》介绍的长度+字符串的格式发送数据,但是如果想发送一个结构体或对象,需要对对象进行序列化把它转...
  • sunny_ss12
  • sunny_ss12
  • 2015-07-10 23:45:32
  • 1326

muduo库的事件框架

TCP网络编程本质 TCP网络编程编程本质是处理三个半事件。 1.连接建立:服务器accept(被动)接收连接,客户端connect(主动)发起连接。 2.连接断开:主动断开(close、shutdo...
  • FreeeLinux
  • FreeeLinux
  • 2016-12-04 18:22:51
  • 736

现代 C++ 网络库 muduo

  • 2015年10月29日 14:20
  • 183KB
  • 下载

ros多机之间通信

在我看来,ROS最牛逼的地方就是它的通信机制了,不仅仅是进程间通信方便,就连不同设备间通信也很方便,只需添加几行代码,你就可以实现多电脑间的 Topi c共享, 远程控制等功能。下面就让我们一起来实现...
  • guo1988kui
  • guo1988kui
  • 2017-10-31 14:52:53
  • 86

《Muduo 网络库:现代非阻塞C++网络编程》演讲

2012年6月30日下午将在深圳做《Muduo 网络库:现代非阻塞C++网络编程》演讲,这是PPT:http://www.slideshare.net/chenshuo/muduo-network-l...
  • Solstice
  • Solstice
  • 2012-06-29 23:16:27
  • 29763

Muduo网络库源码分析(一) EventLoop事件循环(Poller和Channel)

从这一篇博文起,我们开始剖析Muduo网络库的源码,主要结合《Linux多线程服务端编程》和网上的一些学习资料! (一)TCP网络编程的本质:三个半事件 1. 连接的建立,包括服务端接受(acce...
  • NK_test
  • NK_test
  • 2016-04-04 00:05:33
  • 3621

Muduo 网络编程示例之四:Twisted Finger

Python Twisted 是一款非常好的网络库,它也采用 Reactor 作为网络编程的基本模型,所以从使用上与 muduo 颇有相似之处。(当然,muduo 没有 deferreds)Finge...
  • Solstice
  • Solstice
  • 2011-02-23 21:34:00
  • 6610

muduo网络编程分包和解包(一)

non-blocking网络编程中,在Tcp这种字节流协议上做应用层分包是网络编程的基本需求。(muduo p194) 什么叫分包? 分包指的是在发送一个消息或一帧数据时,通过一定的处理,让接收方...
  • sunny_ss12
  • sunny_ss12
  • 2015-07-08 14:21:40
  • 1044

Muduo 网络编程示例之一:五个简单 TCP 协议

这是《Muduo 网络编程示例》系列的第一篇文章。本文将介绍五个简单 TCP 网络服务协议的 muduo 实现,包括 echo (RFC 862)、discard (RFC 863)、chargen ...
  • Solstice
  • Solstice
  • 2011-02-02 12:59:00
  • 16486
收藏助手
不良信息举报
您举报文章:muduo多机协作网络编程示例一:单词计数及排序
举报原因:
原因补充:

(最多只允许输入30个字)