使用 Unix 工具的批处理
分析简单的日志
命令链与自定义程序
这个程序并不像Unix管道那样简洁,但是它的可读性很强,喜欢哪⼀种属于⼝味的问题。但两者除了表⾯上的差异之外,执⾏流程也有很⼤差异,如果你在⼤⽂件上运⾏此分析,则会变得明显。
排序 VS 内存中的聚合
Unix 哲学
-
统一的接口
-
逻辑与布线相分离
-
透明度和实验
MapReduce 和分布式文件系统
为了容忍机器和磁盘故障,⽂件块被复制到多台机器上。复制可能意味着多个机器上的相同数据的多个副本,如第5章中所述,或者诸如Reed-Solomon码这样的纠删码⽅案,它允许以⽐完全复制更低的存储开销以恢复丢失的数据【20,22】。这些技术与RAID相似,可以在连接到同⼀台机器的多个磁盘上提供冗余;区别在于在分布式⽂件系统中,⽂件访问和复制是在传统的数据中⼼⽹络上完成的,没有特殊的硬件。
MapReduce 作业执行
分布式执⾏MapReduce
Reducer调⽤时会收到⼀个键,和⼀个迭代器作为参数,迭代器会顺序地扫过所有具有该键的记录(因为在某些情况可能⽆法完全放⼊内存中)。Reducer可以使⽤任意逻辑来处理这些记录,并且可以⽣成任意数量的输出记录。这些输出记录会写⼊分布式⽂件系统上的⽂件中(通常是在跑Reducer的机器本地磁盘上留⼀份,并在其他机器上留⼏份副本)。
MapReduce 工作流
Reduce 端连接与分组
当MapReduce作业被赋予⼀组⽂件作为输⼊时,它读取所有这些⽂件的全部内容;数据库会将这种操作称为全表扫描。如果你只想读取少量的记录,则全表扫描与索引查询相⽐,代价⾮常⾼昂。但是在分析查询中,通常需要计算⼤量记录的聚合。在这种情况下,特别是如果能在多台机器上并⾏处理时,扫描整个输⼊可能是相当合理的事情。
排序合并连接
由于Reducer⼀次处理⼀个特定⽤户ID的所有记录,因此⼀次只需要将⼀条⽤户记录保存在内存中,⽽不需要通过⽹络发出任何请求。这个算法被称为排序合并连接
把相关数据放在一起
使⽤MapReduce编程模型,能将计算的物理⽹络通信层⾯(从正确的机器获取数据)从应⽤逻辑中剥离出来(获取数据后执⾏处理)。这种分离与数据库的典型⽤法形成了鲜明对⽐,从数据库中获取数据的请求经常出现在应⽤代码内部【36】。由于MapReduce能够处理所有的⽹络通信,因此它也避免了应⽤代码去担⼼部分故障,例如另⼀个节点的崩溃:MapReduce在不影响应⽤逻辑的情况下能透明地重试失败的任务。
Group By
处理倾斜
这种技术将处理热键的⼯作分散到多个Reducer上,这样可以使其更好地并⾏化,代价是需要将连接另⼀侧的输⼊记录复制到多个Reducer上。 Crunch中的分⽚连接(sharded join)⽅法与之类似,但需要显式指定热键⽽不是使⽤采样作业。
Map 端连接
-
⼴播散列连接
-
分区散列连接
-
Map 端合并连接
-
MapReduce 工作流与 Map 端连接