设计数据密集型应用——批处理(10)

本文探讨了批处理系统中使用Unix工具进行日志分析的实践,深入剖析了MapReduce在分布式文件系统中的应用,比较了排序与内存聚合,以及Unix哲学在批处理中的体现。文章还涵盖了Hadoop与分布式数据库的对比,以及MapReduce之后的发展,如数据流引擎、图处理和高级API的演进。

1. 写在最前面

带有太强个人色彩的系统无法成功。当最初的设计完成并且相对稳定时,不同的人们以自己的方式进行测试,真正的考验才开始。

—高德纳

构建系统的三种不同类型:

  • 服务(在线系统):服务等待客户的请求或指令到达。每收到一个,服务会试图尽快处理它,并发回一个响应。响应时间通常是服务性能的主要衡量指标,可用性通常非常重要
  • 批处理系统(离线系统):一个批处理系统有大量的输入数据,跑一个作业(job )来处理它,并生成一些数据,这往往需要一段时间,通常不会有用户等待作业完成。批处理作业的主要性能衡量标准通常是吞吐量
  • 流处理系统(准实时系统):流处理介于在线和离线之间,所以有时候被称为准实时或准在线。像批处理系统一样,流处理输入并产生输出。但是流处理系统比批处理系统具有更低的延迟。

批处理是构建可靠、可伸缩和可维护应用程序的重要组成部分。例如,2004 年发布的批处理算法 Map-Reduce 被称为「造就 Google 大规模可伸缩性的算法」。

2. 使用 Unix 工具的批处理

以下是 Nginx 的日志实例,采集的模板如下:

 $remote_addr - $remote_user [$time_local] "$request"
 $status $body_bytes_sent "$http_referer" "$http_user_agent"

采集的样例如下:

216.58.210.78 - - [27/Feb/2015:17:55:11 +0000] "GET /css/typography.css HTTP/1.1" 
200 3377 "http://martin.kleppmann.com/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) 
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.115 Safari/537.36"

2.1 简单的日志分析

需要分析出网站五个最受欢迎的网页。

使用Unix Shell 的方式:

cat /var/log/nginx/access.log | #1 读取日志
	awk '{print $7}' | #2 按照空格分割日志,输出其第七字段,此处为 URL
	sort             | #3 按照字母序列排序 URL
	uniq -c          | #4 过滤掉重复的行,并统计其出现的此处
	sort -r -n       | #5 按照每行起始处的数字 -n 排序,然后逆序返回结果
	head -n 5          #6 只输出前五行

注:使用 awk、sed 、grep、sort、uniq 和 xargs 的组合,可以在几分钟内完成许多数据的分析,并且它们的性能相当的好。

2.1.1 命令链与自定义程序

使用简单的程序来完成分析网络最受欢迎的网页。

counts = Hash.new(0)         # 1 counts 是一个哈希表,保存每个 URL 被浏览的次数,默认值为0
File.open('/var/log/nginx/access.log') do |file| 
    file.each do |line|
        url = line.split[6]  # 2 逐行读取日志,抽取每行第七个字段
        counts[url] += 1     # 3 将日志当前行的 URL 对应的计数器值加 1
    end
end

top5 = counts.map{|url, count| [count, url] }.sort.reverse[0...5] # 4 按计数器降序对哈希表排序,并取前五位
top5.each{|count, url| puts "#{count} #{url}" }                   # 5 打印前五个条目

注:上述程序并不像 Unix 管道那样简洁,但它的可读性很强,喜欢那种属于口味的问题

2.1.2 排序 VS 内存中的聚合

上述两种方式的那种方式更好?

这取决于有多少个不同的 URL ,即工作集的大小。

  • 当工作集足够小时,内存散列表现良好。
  • 如果工作集大于可用内存,则排序方法的优点可以高效地使用磁盘。

注:sort 程序通过溢出至磁盘的方式来自动应对大于内存的数据集,并能同时使用多个 CPU 核进行排序。这意味着之前看到的简单的 Unix 命令链很容易伸缩至大数据集。

2.2 Unix 哲学

Unix 的哲学,该哲学的表述:

  • 让每个程序都做好一件事。要做一件新的工作,写一个新程序,而不是通过添加「功能」让老程序复杂化。
  • 期待每个程序的输出成为另一个程序的输入。不要将无关信息混入输出。
  • 设计和构建软件时,即使是操作系统,也让它们能够尽早地被试用,最好在几周内完成。
  • 优先试用工具来减轻编排任务,即使必须曲线救国编写工具,且在用完后很可能要扔掉大部分。
2.2.1 统一的接口

在 Unix 中,统一的接口是文件(file)(更准确地说,是一个文件描述符)。一个文件只是一串有序的字节序列。因为这是一个非常简单的接口,所以可以使用相同的接口来表示许多不同的东西:从文件系统上的真实文件,到另一个进程(Unix 套接字,stdin,stdout)的通信通道,设备驱动程序(比如/dev/audio或/dev/lp0),表示 TCP 连接的套接字等等。很容易将这些设计视为理所当然的,但实际上能让这些差异巨大的东西共享一个统一的接口是非常厉害的,这使得它们可以很容易地连接在一起。

注:统一接口的另一个例子是 URL 和 HTTP,这是 Web 的基石。一个 URL 标识一个网站上的一个特定的资源,可以链接到任何其他网站的任何网址。具有网络浏览器的用户因此可以通过跟随链接在网站之间无缝跳转,即使服务器可能由完全不相关的组织维护。

2.2.2 逻辑与布线相分离

Unix 工具的另一个特点是使用标准输入和标准输出。如果运行一个程序,而不指定任何其他的东西,标准输入来自键盘,标准输出指向屏幕。但是,也可以从文件输入或将输出重定向到文件。管道允许你将一个进程的标准输出附加到另一个进程的标准输入。

注:此处存才一个小内存缓冲区,而不需要将整个中间数据流写入磁盘

如果需要,程序仍然可以直接读取和写入文件,但 Unix 方法在

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值