golang实现单机版MapReduce | Charles的技术博客 

作者:JerryXia | 发表于 , 阅读 (0)
介绍本篇文章主要描述了如何使用golang实现一个单机版的MapReduce程序,想法来自于MIT-6.824课程的一个lab。本文分为以下几个模块:
MapReduce基本原理MapReduce简单使用MapReduce单机版实现MapReduce基本原理MapReduce的计算以一组Key/Value对为输入,然后输出一组Key/Value对,用户通过编写Map和Reduce函数来控制处理逻辑。
Map函数把输入转换成一组中间的Key/Value对,MapReduce library会把所有Key的中间结果传递给Reduce函数处理。
Reduce函数接收Key和其对应的一组Value,它的作用就是聚合这些Value,产生最终的结果。Reduce的输入是以迭代器的方式输入,使得MapReduce可以处理数据量比内存大的情况。
一次MapReduce的处理过程如下图:

MapReduce library会把输入文件划分成多个16到64MB大小的分片(大小可以通过参数调节),然后在一组机器上启动程序。其中比较特殊的程序是master,剩下的由master分配任务的程序叫w...阅读全文

 自己动手写分布式KV存储引擎(一): 设计和实现网络框架 | Charles的技术博客 

作者:JerryXia | 发表于 , 阅读 (0)
网络框架的要点使用TCP还是UDP?由于TCP相对于UDP来讲,可靠性高很多,保证包的按序达到,这对于高可靠的存储系统来讲是十分必要的,因此,本文的网络框架将基于TCP来实现。
操作系统的选择由于目前Linux是服务端编程中主流的操作系统平台,因此,本文的网络框架将基于Linux平台,且为X86_64体系架构。
Reactor VS Proactor一般Reactor模型基于I/O多路复用来实现,Linux平台提供select,epoll等接口,而Proactor模型一般基于异步I/O来实现,目前Linux系统对这块支持不太好,因此,本文的网络框架将基于Reactor来实现。
线程模型两种常见的线程模型,一是IO线程和工作线程共用相同线程,二是IO线程和工作线程分开。
I/O线程和工作线程共用
如上图,I/O线程和工作线程共用的线程模型中,实际上是没有专门的工作线程的,I/O线程不仅需要负责处理I/O,还需要真正地处理请求,计算结果。一般典型的处理流程为
Process Read I/O: 处理读I/OProcess: 解析请求,计算结果Process Write I/O:...阅读全文

 golang reflection学习笔记 | Charles的技术博客 

作者:JerryXia | 发表于 , 阅读 (0)
Introductionreflection是golang中用来获取interface的type, value和method的方式,本文主要介绍这三种使用方式。
golang reflectioninterface的类型获取interface的type12t := reflect.Typeof(3)fmt.Println(t) //"int"Typeof用来获取某个interface的类型。
interface的值获取interface的value1234v := reflect.ValueOf(3)fmt.Println(v) // "3"fmt.Println("%v\n", v) // "3"fmt.Println(v.String()) // "<int 3>"ValueOf中返回值类型是reflect.Value,也可以通过它来获取其类型。
12345v := reflect.Value(3) // a reflect.Valuet := v.Type() // x := v.Interface() // an interface{} i := x.(int) // a...阅读全文