大数据首页投稿(暂停使用,暂停投稿)程序员首页投稿

大数据学习day_4

2017-07-21  本文已影响0人  Sakura_P

思考问题

HDFS的IO操作总结

Hadoop工程下与I/O相关的包如下:

数据的完整性

校验和方式是检查数据完整性的重要方式。一般会通过对比新旧校验和来确定数据情况,若两者不同则说明数据已经损坏。

HDFS会对写入的所有数据计算校验和,并在读取数据时验证校验和。

常用的错误检测码是CRC-32(循环冗余校验)。任何大小的数据输入均计算得到一个32位的整数校验和。

hadoop采用HDFS作为默认的文件系统,需要考虑两方面的数据完整性:

  1. 对本地文件I/O的检查
    在Hadoop中,本地文件系统的数据完整性由客户端负责。重点在于存储读取文件时进行校验和的处理。
  1. 对HDFS的I/O数据进行检查
    一般来说,HDFS会在三种情况下检验校验和:
  2. DataNode接收数据后存储数据前
    • DataNode接收数据一般有两种情况:一是客户从客户端上传数据;二是DataNode从其他DataNode上接收数据。当客户端上传数据时,Hadoop会根据预定规则形成一条数据管线。
    • 数据按管线流动以完成数据的上传及备份过程,其数据就是先在客户端这个节点上保存数据,备份1在接收数据的同时也会把接收到的数据发送给备份2所在的机器,若过程顺利,三个备份形成的时间相差不多。
  3. 客户端读取DataNode上的数据时
    Ⅰ:在传输数据的最开始阶段,Hadoop会简单地检查数据块的完整性信息;
    Ⅱ:依次向各个DataNode传输数据,包括数据头信息、块信息、备份个数、校验和等;
    Ⅲ:Hadoop不会在数据每流动到一个DataNode时都检查校验和,它只会在数据流达到最后一个节点时才检查校验和。
  4. DataNode后台守护进程的定期检查
    DataNode会在后台运行DataBlockScanner,这个程序会定期检查此DataNode上的所有数据块。

数据恢复

基本思路是:HDFS存储至少三个相同的数据块,假设数据块1,2,3为相同的三个数据块,

①客户端读取数据块1时,检测到数据块1发生了错误,首先向namenode报告数据块1已经损坏;并抛出异常信息;

②namenode将这个数据块1标记成已损坏,所以namenode不会再分配客户端去读取数据块1,而是分配客户端去读取数据块2或者数据块3;

③为了保证正确数据块1的数量不变,会复制数据块2或3到datanode的数据块4中;

④删除已损坏数据块1,这样就保证复本因子的不变。数据块数量为3.

在hadoop上进行数据读操作时,若发现某数据快失效,读操作涉及的用户,DataNode和NameNode都会尝试来恢复数据块,恢复成功后设置标签,防止其他角色重复恢复。

  1. 检查已恢复标签
    检查一致的数据块恢复标记,若已经恢复,则直接跳过恢复阶段。
  2. 统计各个备份数据块恢复状态
    在这个阶段,DataNode会检查所有出错数据块备份的DataNode,查看这些节点上数据块的恢复情况,将其作为一条记录保存在数据块记录表中。
  3. 找出所有正确版本数据块中最小长度的版本
    DataNode会扫描上一阶段中保存的数据块记录,判断当前副本是否正在恢复;
    是:跳过;
    否:判断是否配置参数设置了恢复需要保存原副本长度:
    是:将恢复长度相同的副本加入待恢复队列;
    否:将所有正确的副本加入到待恢复队列。
  4. 副本同步
    若需要保持副本长度,则直接同步长度相同的副本即可,否则以长度最小的副本同步其他副本。

文件格式

  1. SequenceFile
SequenceFile文件结构

2. RCFile

RCFile 文件结构

3. Avro

Avro MR 文件格式

4. 文本格式

5. 外部格式

数据压缩

对于任何大容量的分布式存储而言,文件压缩都是必须的,文件压缩带来的好处是:
Ⅰ:减少文件所需的存储空间;
Ⅱ:加快文件在网络上或磁盘上的传输速率;

hadoop关于文件压缩的代码几乎都在package.org.apache.hadoop.io.compress中。

  1. hadoop对压缩工具的选择

    压缩一般是在时间和空间上的一种权衡。一般来说,更长的压缩时间会接生过更多的空间。不同的压缩算法之间有一定的区别。
  2. 压缩分割和输入分割
    压缩分割和输入分割时很重要的。bzip2支持文件分割,用户可以分开读取每块内容并分别处理之,因此bizip2压缩的文件可分割存储

  3. 在MapReduce程序中使用压缩

  1. 压缩小结

序列化

序列化是将对象转化为字节流以便在网络上传输或写到磁盘进行永久存储的过程,或者说用字节流描述对象的方法。

与序列化相对的是反序列化,反序列化就是将字节流转化为对象的方法。

序列化有两个目的 :

hadoop采用RPC来实现进程间通信 。一般而言,RPC的序列化机制有以下特点:
紧凑:紧凑的格式可以充分利用带宽,加快传输速度;
快速:能减少序列化和反序列化的开销;
可扩展性:可以逐步改变,是客户端与服务器端直接相关 的;
互操作性:支持不同语言编写的客户端与服务器交互数据;

在hadoop中,序列化处于核心地位。因为无论是存储文件还是计算中传输数据,都需要执行序列化过程。hadoop并没有采用java提供的序列化机制(java object serialization),而是自己重新写了一个序列化机制Writeables,它具有紧凑,快速的特点,更方便。

  1. Writable类
    Writable是hadoop的核心,hadoop通过它定义了hadoop中基础的数据类型和操作。一般来说,无论是 上传下载数据还是运行MapReduce程序,无时无刻不需要使用Writable类。

Writeable类中只定义了两种方法:序列化输出数据流和反序列化输入数据流;
或者这样分类:将其状态写到DataOutput二进制流(序列化)和从DataInput二进制流读取状态(发序列化)

  1. 实现自己的hadoop数据类型
    hadoop可以支持实现自己的数据类型

  2. 序列化框架Avro

  1. 针对MapReduce的文件类
    对于默写应用,需要特殊的数据结构来存储自己的数据。针对此需求,hadoop提供了一些更高层次的容器。

hadoop定义了一些文件数据结构以适应Mapreduce编程框架的需要,其中SequenceFile和MapFile两种类型非常重要。
Map输出的中间结果就是由他们表示的,其中,MapFile是经过排序并带有索引的SequenceFile.
(1)SequenceFile类
记录的是key/value对的列表,是序列化之后的二进制文件,因此不能直接查看,可通过命令查看文件内容。
hadoop fs -text MySequenceFile
sequence有三种不同类型的结构:
未压缩的key/value对;
记录压缩的key/value对(只有value被压缩);
Block压缩的key/value对;
注:未压缩和只压缩value的SequenceFile数据格式,两种数据格式相同。
(2)MapFile类
MapFile的使用与SequenceFile类似,与SequenceFile生成一个文件不同,这个程序生成一个文件夹。
(3)ArrayFile,SetFile和BloomMapFile
ArrayFile继承自MapFile,保存的是从Integer到value的映射关系。
SetFile继承自MapFile,同JAVA的set类似,仅仅是一个key的集合,而没有任何value。
BloomMapFile在实际使用中发挥的作用和MapFile类似,只是增加了过滤功能。

上一篇 下一篇

猜你喜欢

热点阅读