第一章:就是介绍一下Hadoop的历史及发展过程。
第二章:MapReduce
从一个统计气象学的例子,来引出MapReduce的写法,对比了一下新旧API的区别以及不同。新的API主要采用的是虚类而不是接口的方式来提供服务。讨论了数据流:Hadoop的存储,以及工作原理,还有Combiner函数的使用。最后,谈到了使用不同语言来实现mapreduce功能(Streaming, Pipes),原因是因为Hadoop使用了Unix标准作为流作为输入输出和应用程序之间的接口,所以我们可以使用任何编程语言通过标准输入输出来写MapReduce程序。
第三章:Hadoop分布式文件系统
首先讲解了文件系统的概念,以及Hadoop文件系统的特点:超大文件、流式数据访问、商用硬件、不满足低延迟数据访问、不适合大量小文件、不支持多写入以及任意修改等等。然后又介绍了块存储的特点。利用块存储的原理的优点是:
- 一个文件的大小可以大于网络中任意一个磁盘的容量
- 使用抽象块而非整个文件作为存储单元大大简化了存储子系统的设计
然后又继续讲解了namenode和datanode这两个老生常谈的话题,你需要知道这两个node的功能是什么。需要注意的是namenode的安全机制,因为它事关整个文件系统的生死。关于Hadoop文件系统HDFS的高可用性的实现,有很多文章都探讨过了,大家可以去网上搜搜。
此外这一章节还谈到了文件系统的基本操作,比如复制,对比之类的。
然后接下来比较重点讲的是HDFS的访问,书中介绍了这么几个方式:
- 从Hadoop URL读取数据,主要是利用IOUtils类,但是这种方式优缺点,不是任何时候都能用。
- 通过FileSystem API读取数据,还是用到了上面的IOUtils类,但是使用的是FileSystem API,里面封装了各式各样的方法,用到的时候可以自己查查。
然后介绍了读写HDFS的方法,揭示了客户端与HDFS交互的背后的原理,这个在我的博文中也有详细的讲到。还讲到了文件一致性,以及数据导入程序Flume和Sqoop,然后是并行复制工具distcp。最后讲Hadoop的存档工具。
第四章 Hadoop的IO
既然涉及到hadoop的IO,就会有文件的读写,那么读写肯定要防止差错,那么监测数据是否损坏的常见措施,就是看数据在第一次引入系统的时候计算校验和,并且在数据通通过一个不可靠的通道进行传输时候再次计算校验和,这样就能发现数据是否损坏。而检测校验和是否匹配并不能纠错,所以这也正是不可以使用低端硬件的原因,换句话说,一定要使用ECC内存(因为ECC内存和普通内存的区别是,ECC是一种广泛应用于计算机领域中的指令纠错技术,ECC内存的意思就是将这种技术应用于内存的制造中)。我们常常采用CRC-32技术进行校检,默认情况下读取512个字节,而由于CRC的校验和是4个字节,所以存储校验和的额外开销低于1%。
hadoop自带一套原子操作用于用于数据IO操作,其中有一些技术比Hadoop本身更常用。比如数据的完整性和数据压缩。因为涉及到IO肯定要涉及到内存以及数据流量的大小。具体使用哪一种压缩方式,还需要根据Hadoop提供的各种压缩方式的优缺点来判定。我们可以根据hadoop提供的压缩命令来调整使用哪种压缩策略,譬如:gzip -1 filename gzip代表的是压缩方式,而-1为优化压缩速度,-9代表了优化压缩空间。这两个选项是矛盾的。
所以我们不仅仅要根据现实情况实现不同种类的数据压缩,还可以根据压缩文件名后缀进行压缩方式的判断,而且在使用mapreduce的时候要考察该压缩方式是否支持切片操作。此外在map和reduce之间也可以进行压缩来进行提速。
IO意味着传输,而传输就意味着序列化,而序列化在分布式数据处理领域中经常出现:一个是进程间通信,另一个则是永久储存。Hadoop系统中多个节点间的通信是通过RPC协议进行的,RPC序列化的格式如下:
紧凑
紧凑的格式能够充分利用网络带宽
快速
进程间通信形成了分布式系统的骨架,所以需要尽量减少序列化和反序列化性能的开销,这个是最基本的。
可扩展
为了满足新的需求,协议不断变化,所以在控制客户端和服务器端的过程中,需要直接引进相应的协议。例如能够在方法调用的过程中增添新的参数,并且新的服务器需要能够接受来自老客户端的老格式消息。
支持相互操作
对于某些系统来说,希望能支持以不同语言写的客户端与服务器交互,所以需要设计一种特定的格式来满足这种需求。
为了支持序列化,hadoop自己采用的是writable类型的,它的特点是紧凑,速度快,但是不易于扩展。为了克服这个缺点,Apache开发了序列化框架Avro。我们想一下,需要自己开发序列化框架的原因是啥,还是因为我们的字符编码方式有着千差万别,而序列化讲究的是无障碍的快速传输,所以要达到这一点,必须要实现自己的统一编码方式,换句话说就是通用的序列化框架。那么我们可能会有疑问,为什么我们不用java自带的java object serialization?因为高效,高性能的进程间通信是hadoop的关键,我们需要精确的控制连接,延迟和缓冲的处理方式,所以RMI无能为力。总而言之,
于是乎,Avro就成为了本章节详细介绍的重点。那么什么是Avro,如何去理解Avro,我会专门开一篇博文介绍一下。
第五章 MapReduce应用开发
首先介绍了MP的编写流程及注意事项,我觉得不仅仅是MP,而且是针对所有的大数据计算程序的必须遵循的步骤,所以这里还是要啰嗦一下如何确保程序的正确性:
MP的编程遵循一定的特殊流程,首先编写map函数和reduce函数,最好使用单元测试来确保函数的运行是否符合预期。如果小数据集测试合格,那么再放到大数据集合上测试。当程序在数据集上运行的时候,可能会出现很多问题,那么再进行测试修复。当程序逻辑性真确无误后,那么再进行优化调试。
首先,用于配置的API都是通过XML配置文件运行的,此外所有的依赖也是通过maven来管理的,所以这个跟web开发的套路差不多。同时为了简化以命令行的方式运行作业,Hadoop也提供了辅助类,类似GenericOptionsParser,Tool和ToolRunner。此外用MRUnit可很方便的编写测试类。在所有程序都写好了以后,可以在本地运行和集群上运行。在本地上运行没有什么可以说的,那么在集群上运行,分为以下几个步骤:
1. 打包作业 2.启动作业 3.获取结果 4.作业调试 5.作业调优
以上就是Hadoop的运行流程,那么在实际过程中,我们如何将复杂的问题转换成MapReduce的工作流。本书的这个章节也做了一个具体的例子分析,这里就不再赘述。
第六章 MapReduce的工作机制
这个章节详细介绍了1.X版本的hadoop和2.X的不同,主要就是在YARN上面。基本的流程不多扯,在我之前的几篇博文里面都有提到,简而言之就是:
1.作业的提交 2.作业的初始化 3.任务的分配 4.任务的执行 5.进度和状态的更新 6.作业的完成
而YARN的诞生主要是解决了节点数超过4000以后MP系统扩展性的瓶颈,该章节也详细介绍了yarn在设计理念基础,以及每个方面与经典mapreduce的不同。另外还讲述了map到reduce之间的shuffle和排序的细节。
第七章 MapReduce的类型与格式
maperduce数据处理模型很简单:map和reduce函数的输入和输出是键值对,第七章主要介绍各种类型的数据如何在MapReduce中使用。
第八章 MapReduce的特性
这个章节继续探讨了MapReduce的一些高级特性
计数器(各种各样的计数器类型) 排序 连接 边数据 MP库类等等。
第九章 构建Hadoop集群
之前的几个章节我们已经了解了如何在单机上配置hadoop,本章节讲述了如何在计算机集群上构建hadoop系统。
第十章 管理hadoop集群
在当集群建立好了之后,就是如何管理该集群了。
第十一章 关于Pig
Pig为大型数据集的处理提供了更高层次的抽象
第十二章 关于Hive
这个这里不多做赘述,我在博客:不跟你谈情怀,只跟你聊聊Hive中也有所介绍。
第十二章 关于HBase
HBase是一个在HDFS上开发的面向列的分布式数据库。
第十三章 关于ZooKeeper
第十四章 关于Sqoop