Hadoop进阶2-Hadoop权威指南C1-C6阅读笔记
本文是Hadoop权威指南-第三版的阅读笔记,内容包括第1-6章内容
记录了一些个人认为重要的知识点。
C1 初识Hadoop
RAID-冗余硬盘阵列
Hadoop提供了一个可靠的共享存储和分析系统
HDFS-实现数据的存储
MapReduce-实现数据的分析和处理
寻址是将磁头移动到特定硬盘位置进行读写操作的过程--是硬盘操作延迟的主要原因
传输速率主要取决于带库宽
HPC 高性能计算
Grid Computing 网格计算
Message Passing Interface 消息传递接口
数据本地化(data locality)特性是mapreduce的核心特征
数据处理应该在离数据本身比较近的地方进行
存储区域网络--SAN
志愿计算---工作单元(work unit)
C2 关于MapReduce
MR的新API倾向于使用虚类,而不是接口-->更有利于拓展
Hadoop Pipes
Hadoop Streaming
Dumbo
C3 HDFS
管理网络中跨多台计算机存储的文件系统成为分布式文件系统
HDFS以流式数据访问模式来存储超大文件
HDFS---高吞吐量,高时间延迟
HDFS的块(block)比磁盘大,其目的是为了最小化寻址开销(文件传输时间=寻址时间+磁盘传输时间)
块也不能过大,影响mapreduce的并行性
数据块抽象的作用
- 简化存储子系统设计
- 适合数据备份--容错和可用性
辅助namenode-- 定期通过编辑日志合并命名空间镜像以防止编辑日志过大,
保存合并后的命名空间的副本
联邦HDFS
每个namenode管理文件系统命名空间的一部分
每个namenode维护一个命名空间卷(namespace volume)
HDFS的高可用性
active-standby namenode
故障转移控制器(failover_controller)运行在每一个namenode上,监视宿主
访问HDFS的方法
一. HTTP
原来的HTTP接口--只读
新的WebHDFS实现支持所有的文件系统操作
image
二. C 语言
libhdfs库
三. FUSE
用户空间文件系统用(Filesystem in Userspace)
四. Java接口**
Hadoop将网络可能成一棵树,两个节点之间的距离是它们到最近共同祖先的距离总和。
文件系统的一致模型(coherency model)描述了文件读/写的数据可见性
对HDFS而言,当前正在写入的块对于其他reader是不可见的
"sync()"方法使所有缓存与数据节点强行同步==调用sync方法后,HDFS能保证文件中到目前为止写入的数据均到达所有的datanode的写入管道并且对所有新的reader均可见。
HDFS在关闭文件时隐含执行sync()方法
sync方法可以防止数据块的丢失,但是会带来额外的开销
数据的鲁棒性和吞吐量之间会有所取舍。
将数据导入HDFS
Flume--提供了不同级别的数据投递可靠性
最大努力投递
端到端投递
Sqoop--将数据从结构化存储设备批量存入HDFS
关系型数据库--> Sqoop--> Hive数据仓库
distcp分布式复制程序/并行复制
Hadoop文件系统间(集群间)复制大量文件
同版本:
image
本质也是一个mapreduce任务
不同版本集群间的复制:
基于只读HTTP协议:
image
存档
存档命令
image
存档文件=索引文件+数据文件
image
C4 Hadoop的I/O操作
数据完整性
措施: checksum 数据校验和
常用错误检测码: CRC-32(循环冗余校验)--任何大小的数据输入均计算得到一个32位的整数校验和
HDFS:
对写入数据计算校验和和,复制和读取数据时验证校验和
datanode存储校验和
DataBlockScanner 定期验证数据块: 解决物理存储媒体上位损坏的有利措施
压缩:
image
在mapreduce中使用压缩
序列化
序列化:指将结构化对象转化为字节流以便在网络上传输或写到磁盘进行永久存储的过程
序列化在分布式数据处理的两大领域经常出现:
进程间通信
永久存储
RPC协议将消息序列化成二进制流后发送到远程节点,远程节点接着将二进制流反序列化为原始消息
Writable接口
RawComparator接口:该接口允许其实现直接比较数据流中的记录,无须反序列化
自定义Writable类型
序列化框架
Avro数据序列化系统
SequenceFile
通过SequenceFile类型将小文件包装起来,可以获得更高效率的存储和处理
SequenceFile.Sorter类,sort()方法和merge()方法
C5 MapReduce应用开发
MRUnit 测试库
MRUnit与标准的执行框架(如JUnit)一起使用
在集群上运行MR任务
打包:
image
作业ID=jobtracker开始时间+唯一标识(增量计数)
任务ID
任务尝试ID
MR任务的调优:
reducer数应少于reduce任务槽数
对map输出进行压缩几乎总能使作业执行得更快