The Google File System

本博客采用创作共用版权协议, 要求署名、非商业用途和保持一致. 转载本博客文章必须也遵循署名-非商业用途-保持一致的创作共用协议.

GFS是一个共享的分布式文件系统

  • GFS提供了一个与位置无关的名字空间(namespace), 这使得数据可以为了负载均衡或灾难冗余等目的在不同位置间透明迁移
  • GFS并没有在文件系统层面提供任何Cache机制, 但借助了Linux底层cache机制.
  • GFS文件以分层目录的形式组织, 用路径名来表示, 文件的写入主要依赖追加(append)操作完成

How to Write Go Code

官方How to Write Go Code的阉割版 :-D

GOPATH

GOPATH环境变量指明当前工作区的位置, 这可能在你编写Go程序时唯一一个需要设置的环境变量

1
2
3
4
5
6
7
# 设置GOPATH
$ mkdir example
$ cd example
# 类Unix设置环境变量, 只对当前session有效, 如需长期生效需要设置如.zshrc的配置文件
$ export "GOPATH=$PWD"
# 验证是否设置成功
$ echo $GOPATH

6.824 Lab 1: MapReduce(2016)

本博客采用创作共用版权协议, 要求署名、非商业用途和保持一致. 转载本博客文章必须也遵循署名-非商业用途-保持一致的创作共用协议.

MapReduce框架简介

  1. 应用提供大量输入文件, 一个Map函数, 一个Reduce函数, nReduce个reduce tasks.
  2. RPC服务器启动, 等该worker注册(Register)RPC中. 任务状态为可执行时, 调度器(Schedule)决定如何把task分配给worker和如何容错.
  3. Master把每个输入文件作为一个Map任务, 每个任务至少调用一次doMap. 这些任务或者直接执行或者由DoTask RPC发射, 每个对doMap()的调用读取合适的文件, 对每个文件调用map, 对每个map文件最后产生nReduce个文件.
  4. Master对每个reduce人物至少调用一次doReduce(). doReduce()收集由map产生的nReduce文件(f-*-), 然后对这些文件运行reduce函数. 最终产生nReduce个结果文件.
  5. Master调用mr.merge(), 合并所有的结果文件为一个输出文件.
  6. Master发送Shutdown RPC关闭workers, 然后关闭RPC服务器.

Go goroutine同步

本博客采用创作共用版权协议, 要求署名、非商业用途和保持一致. 转载本博客文章必须也遵循署名-非商业用途-保持一致的创作共用协议.

出现问题场景: 一个函数run()中包含多个goroutine函数并发, 这些goroutine函数会生成中间文件, 被run()函数运行结束后的check()函数检查. 当goroutine并发时, 并不会阻塞run()的上下文, 可能导致的情况为run()函数执行完毕(但其中的goroutine并发函数没有执行完毕), 导致check()函数执行失败.

所以我们需要一种操作, 直到当前所有goroutine没有执行完毕, 才进行下一步操作

所以需要goroutine同步, go提供了sync包channel机制来解决goroutine之间的同步问题

Google MapReduce

简介

  • 开始喜欢看基于工程实践总结出来的paper, 而不是功利性的paper, 没有冗长难懂的数据公式和概率统计的paper.
  • 并行计算,分布式数据,处理故障的问题与与大量复杂的业务代码掩盖了原来的简单的大数据处理计算。
  • MapReduce通过函数式风格代码, 自动和并行的运行在集群中. 系统的运行考虑输入数据的划分, 机器间的程序调度, 处理其中出现的错误(容错), 管理机器间通信.
  • MapReduce抽象模型灵感来自于Lisp和其他函数式编程语言
  • MapReduce的主要贡献: 通过简单又不失强大的接口, 在大规模商用集群中自动并行和分布式的处理大规模计算. MapReduce简单易用, 隐藏了底层的并行, 容错, 局部优化和负载均衡. 很多大数据处理逻辑都可以通过MapReduce来表达.

快学Go

简介

  • Go是Google开发的一种静态强类型、编译型,并发型,并具有垃圾回收功能的编程语言
  • 面向对象三大特性(封装/继承/多态), Go语言仅仅支持封装
1
2
3
4
5
6
7
// 使用go run test.go, 运行下面源码
package main
import "fmt"
func main() {
fmt.Println("Hello, World")
}

快学Clojure

Why? 为了更好的了解并发和函数式语言.

简介

  • Clojure是一套现代的Lisp语言的动态语言版(Lisp方言)
  • 函数式语言, 编译型语言
  • 最开始Clojure运行在JVM上, 所有有很好的扩平台特性.
  • 函数式语言的不变性使它们很好的支持并发

Zhihu实习总结

Zhihu, 一家真正的互联网基因的公司, 一家搭建传播知识平台的社区, 一个充满朝气和青春的创建公司, 一个最初梦想开始的地方.

2015年10月下旬, 拿着Zhihu的实习offer, 来了一场说走就走的实习, 想想自己当时还是挺冲动的. 可能是被这家正能量的公司所吸引吧. 第一次踏入国内权利的核心, 以为会遇到各种名人, 看到各种好车, 路过各种高楼大厦. 结果, 北京也没有什么出奇的地方, 顶多雾霾比别的城市更严重一些.

11月2日, 我走入知乎迎接自己实习的第一天, 印象中是一个呆呆的前台小哥接待的我. 如今转眼间五个月就要结束了, 饱含着浓浓的不舍, 不过学校还有些事情需要去处理一下的.