《Hadoop权威指南》读书笔记

第1章 初识Hadoop

MapReduce 尽量在计算机节点上存储数据,以实现数据的本地快速访问。

数据本地化特性是MapReduce的核心特征。

第2章  关于MapReduce

Hadoop本身提供了一套可优化网络序列化传输的基本类型,而不是直接使用Java内嵌的数据。这些类型都在org.apache.hadoop.io包中。

LongWritable类型(相当于Java的Long类型)

Text类型(相当于Java中的String类型)

IntWritable类型(相当于Java的Integer类型)

 

Job对象指定作业执行规范:

// Create a new Job
*     Job job = Job.getInstance();
*     job.setJarByClass(MyJob.class);
*     
*     // Specify various job-specific parameters     
*     job.setJobName("myjob");
*     
*     job.setInputPath(new Path("in"));
*     job.setOutputPath(new Path("out"));
*     
*     job.setMapperClass(MyJob.MyMapper.class);
*     job.setReducerClass(MyJob.MyReducer.class);
*
*     // Submit the job, then poll for progress until the job is complete
*     job.waitForCompletion(true);

为了实现横向扩展,我们需要把数据存储在分布式文件系统中,一般为HDFS,由此允许Hadoop将MapReduce计算转移到存储有部分数据的各台机器上。

有两类节点控制着作业执行过程:一个jobtracker及一系列tasktracker。jobtracker通过调度tasktracker上运行的任务来协调所有运行在系统上的作业。tasktracker在运行任务的同时将运行进度报告发送给jobtracker , jobtracker由此记录每项作业任务的整体进度情况。如果其中一个任务失败,jobtracker可以在另一个tasktracker节点上重新调度该任务。

Hadoop允许用户针对map任务的输出指定一个combiner(就像mapper和reducer一样)

第3章  Hadoop分布式文件系统

HDFS以流式数据访问模式来存储超大文件,运行于商用硬件集群上。

HDFS同样也有块的概念,但是大很多,默认为64MB。与单一磁盘上的文件系统相似,HDFS上的文件也被划分为块大小的多个分块(chunk),作为独立的存储单元。但与其他文件系统不同的是,HDFS中小于一个块大小的文件不会占据整个块的空间。

HDFS集群有两类节点以管理者-工作者模式运行,即一个namenode(管理者)和多个datanode(工作者)。

datanode是文件系统的工作节点。他们根据需要存储并检索数据块(受客户端或namenode调度),并且定期向namenode发送它们存储的块的列表。

namenode在内存中保存文件系统中每个文件和每个数据块的引用关系,这意味着对一个拥有大量文件的超大集群来说,内存将成为限制系统横向扩展的瓶颈。

 

namenode告知客户端每个块中最佳的datanode,并让客户端直接连接到该datanode检索数据。由于数据流分散在集群中的所有datanode,所以这种设计能使HDFS可扩展到大量的并发客户端。同时,namenode只需要响应块位置的请求,无需相应数据请求,否则随着客户端数量的增长,namenode会很快成为瓶颈。

 

第4章  Hadoop的I/O操作

datanode负责在收到数据后存储该数据及其验证校验和。它在收到客户端的数据或复制其他datanode的数据时执行这个操作。正在写数据的客户端将数据及其校验和发送到由一系列datanode组成的管线,管线中最后一个datanode负责验证校验和。

客户端从datanode读取数据时,也会验证校验和,将它们与datanode中存储的校验和进行比较。每个datanode均持久保存有一个用于验证的校验和日志,所以它知道每个数据块的最后一次验证时间。客户端成功验证一个数据块后,会告诉这个datanode,datanode由此更新日志。

HDFS存储着每个数据块的复本,因此它可以通过数据复本来修复损坏的数据块,进而得到一个新的,完好无损的复本。

Hadoop的localFileSystem执行客户端的校验和验证。这意味着在你写如一个名为filename的文件时,文件系统客户端会明确在包含每个文件块校验和的同一个目录内新建一个名为.filename.crc的隐藏文件。

第9章  构建Hadoop集群

Hadoop的主体由Java语言写成,能够在任意一个安装了JVM的平台上运行。但由于仍有部分代码(例如控制脚本)需在Unix环境下执行,因为Hadoop并不适宜以最终产品的形态运行在非Unix平台上。

对于多机架的集群来说,描述清楚节点-机架间的映射关系就很有必要。这样的话,当Hadoop将MapReduce任务分配到各个节点时,会倾向于执行机架内的数据传输(拥有更多带宽),而非跨机架数据传输。HDFS将能够更加智能地放置复本,以取得性能和弹性的平衡。

Hadoop控制脚本(并非守护进程)依赖SSH来执行针对整个集群的操作。

新的开始

9月2号到学校,自己成了宁波城市职业技术学院的大一新生,楼下超市阿姨直夸这个孩子真是独立,自己一个人去超市置办物品,不像其他孩子还要家人护送。

食堂的饭菜好像有点问题,于是我在饿了么办了一个超级会员,可惜折扣不够。

从JVM开始学起,早日挣脱这部分茫然,然后迈入新的空白。