1、Hadoop基础知识
第1章 初识Hadoop
- Hadoop代替配有大量硬盘的数据库来进行大规模数据分析的原因是:
- 传输速率(取决于硬盘的带宽)的提升远大于寻址时间(将磁头移动到特定硬盘位置进行读/写操作的过程)的提升,而数据库采用的是硬盘寻址数据访问模式,其相较于流数据读取模式(主要取决于传输速率)会花费更多时间;
- 关系型数据库使用的数据结构是B树(受限于寻址的速率),当其只更新一小部分数据时更有优势;但遇到大规模数据时,因为需要使用**”排序/合并“来重建数据库,所以B树**的效率会明显落后于MapReduce;
- MapReduce是一个批处理系统,更适合没有用户在现场等待查询结果的离线使用场景,并不适合交互式分析;
- MapReduce适合一次写入、多次读取数据的应用,关系型数据库则更适合持续更新的数据集以及索引后数据集的点查询和更新(建立索引的数据库系统能够提供对小规模数据的低延迟数据检索和快速更新);
- Hadoop采用的是读时模式(在处理数据时才对数据进行解释,使得数据加载成为一个文件拷贝操作),因此更适合半结构化数据(例如电子表格在结构上由单元格组成,但每个单元格内可以保存任何形式数据)和非结构化数据(例如纯文本或图像等没有特别的内部结构);RDBMS适合结构化数据(例如XML文档),但会在数据加载阶段带来大量时间开销;
- RDBMS为保持数据的完整性且不含冗余,其数据通常是规范的,但这并不适合Hadoop,因为这会使读取记录成为非本地操作(为什么???),其适合如日志文件(当每次都需要记录客户端主机全名时,会导致同一客户端的全名可能多次出现)的非规范化数据;
- 对数据进行分区后,函数原语(如map和reduce)能够在各分区上并行工作,因此处理模型可以随着数据规模线性收缩,即若输入数据量增加一倍,但集群规模也扩展一倍,仍能使得作业的运行速度与原来一样快;
第2章 关于MapReduce
- MapReduce任务过程分为两个处理阶段:map阶段和reduce阶段。每个阶段都以键-值对作为输入和输出,其中map的键是某一行起始位置相对于文件起始位置的偏移量,但两个阶段的键和值的类型由程序员来选择;
- map函数的输出经由MapReduce框架处理后,最后发送到reduce函数,这个处理过程基于键来对键-值对进行排序和分组(中间有个shuffle过程,将相同键的合并);
- 在设置形参类型的时候,Hadoop不直接使用Java内嵌的类型,而是使用在
org.apache.hadoop.io
包中一套可优化网络序列化传输的基本类型,如LongWritable
、Text
、IntWritable
类型相当于Java的Long
、String
、Interger
类型; - map和reduce提供
Context
实例用于输出内容的写入; - reduce函数的输入类型必须匹配map函数的输出类型