一、数据完整性
 
二、压缩
 

三、序列化

  • 基本概念
  1. 序列化指的是将结构化对象转化为字节流以便于通过网络进行传输或写入持久化存储的过程
  2. 反序列化指的是将字节流转为一系列结构化对象的过程。
  3. 进程间通信和持久存储--分布式数据处理过程,出现序列化和反序列两个动作
  4. RPC是hadoop用于节点之间的进程间的通信,RPC协议使用序列化将消息编码转为二进制流,将其发送到远程节点,此后,二进制流被反序列化为原始消息。RPC序列化格式特点:紧凑(网络带宽充分利用)、快速(序列化和反序列化开销尽可能小)、可扩展性(协议随时间可变)、互操作性(不同语言)
  5. 数据持久性存储的特点:紧凑(高效使用存储空间)、快速(读取或写入TB级数据的开销变得极小)、可扩展(可以使用透明的方式读取用旧格式写入的数据)、互操作性(使用不同语言读取或写入持久化数据)
  6. Hadoop的序列化格式为Writables,MapReduce程序使用它来序列化键值对
  • Writable接口
  1. 接口定义

     public interface Writable {
    void write(DataOutput out) throw IOException;//用于将状态写入二进制格式的DataOutput流中
    void readFields(DataInput in) throw IOException;//用于从二进制格式的DataInput流中读取状态
    }

  2. 类型的比较对MapReduce至关重要,键与键之间的比较是在排序阶段完成的,Hadoop提供了一个从Java Comparator接口优化的方法,RawComparator接口,该接口允许执行者比较从流中读取的未被反序列化为对象的记录,从而省去了创建对象的所有开销。

     package org.apache.hadoop.io;
    
     import java.util.Comparator;
    public interface RawComparator<T> extends Comparator<T>{
    public int compare(byte [] b1,int s1,int l1,btye []b2,int s2,int l2);
    }

  3. WritableComparator是RawComparator对WritableComparable类的一个通用实现。它提供了一个默认的对原始函数compare()函数的调用,对从数据流对要比较的对象进行反序列化,然后调用对象的compare方法。另外一个功能就是RawComparator实例的一个工厂方法。

    RawComparator<IntWritable> comparator = WritableComparator.get(IntWritable.class);
    IntWritable w1 = new IntWritable(163);
    IntWritable w2 = new IntWritable(67);
    assertThat(comparator.compare(w1,w2),greaterThan(0)); byte[] b1 = serialize(w1);
    byte[] b2 = serialize(w2);
    assertThat(comparator.compare(b1,0,b1.length,b2,0,b2.length),greaterThan(0));

  • Writable类
  1. org.apache.hadoop.io
  2. Writable类层次图
  3. Writable基本类型的封装
  4. Writable的Text类:Text类是一种UTF-8格式的Writable。可以理解为一种与java.lang.String相似的Writable。Text类代替了UTF8类。UTF8类编码不支持编码大于32767个字节的字符,使用了Java的改进过的UTF-8。而Text类使用的是标准的UTF-8,使其更易于与理解的UTF-8的其他工具协同工作,故String与Text之间存在差异。Text类使用整型(使用一个可变长度的编码方案)在字符串编码中存储字节数,最大值为2GB。String类与Text类的区别如下:
    • 索引
    • Unicode
    • 遍历(迭代):将Tet对象变成java.nio.ByteBuffer,然后对缓冲区的Text反复调用bytesToCodePoint()静态方法,这个方法提取下一个代码点作为int然后更新缓冲中的位置,当bytesToCodePoint()返回-1时,检测到字符串结束。

       public class TextIterator {
      public static void main(String[] arg){
      Text t = new Text("\u0041\u00DF\u6771\uD801\uDC00"); ByteBuffer buf = ByteBuffer.wrap(t.getBytes(),0,t.getLength());
      int cp;
      while(buf.hashRemaining()&&(cp=
      Text.bytesToCodePoint(buf)) != -1){
      System.out.println(Integer.toHexString(cp));
      } }
      }

    • 可修改性,通过set()方法改变

      Text t = new Text("hadoop");
      t.set(new Text("pig"));
    • Text类常用ToString方法转化为String类,因为String类具有丰富的API

      Text t = new Text("hadoop");
      String s = t.toString();
  5. ByteWritable类是一个二进制数据数组封装。它将序列化格式是一个int字段,指定的是字节数及其字节本身。
  6. NullWritable类是一种特殊的Writable类型,因为它的序列化是零长度的。没有字节被写入流或流中读取,它常被作为占位符使用。
  7. ObjectWritable类和GenericWritable类:适用于字段可以使用多种类型,其为一种多用途的封装,用于Hadoop的RPC来封送和反封送方法参数和返回类型
  • Writable集合
  1. Writable集合类型:ArrayWritable,TwoDArrayWritable,MapWritable和SortedMapWritable

    • ArrayWritable:数组
    • TwoDArrayWritable:二维数组
    • MapWritable
    • SortedMapWritable
  • 序列化框架
  1. API:Hadoop提供了一个简单的序列化框架API。序列化框架由Serialization实现(在org.apache.hadoop.io.serializer包)来表示。Serialization定义了从类型到Serializer实例(一个对象转为一个字节流)和Deserializer实例(从一个字节流转为一个对象)的映射
  2. IDL:接口描述语言,通过语言中立、声明式来定义它们。Apache Thrift和Google Protocol Buffers
 
四、基于文件的数据结构
  • SequenceFile类
  1. 假设一个日志文件中的每一个日志记录都是一行新的文本。如果想记录二进制类型,纯文本并不是一个合适的格式。Hadoop的SequenceFile类很适用这种情况,其做法是为二进制键/值提供一个持久化的数据结构,当时SequenceFile类用于日志,需要一个键和一个值。
  2. 创建SequenceFile类

     public class SequenceFileWriteDemo {
    private static final String[] DATA ={
    "One,two,buckle my shoe",
    "Three,four,shut the door",
    "Five,six,pick up sticks",
    "Seven,eight,lay them straight",
    "Nine,ten,a big fat hen"
    }; public static void main(String[] args) throws IOException {
    String uri = args[0];
    Configuration conf = new Configuration();
    FileSystem fs = FileSystem.get(URI.create(uri),conf); IntWritable key = new IntWritable();
    Text value = new Text();
    SequenceFile.Writer writer = null;
    try{
    writer = SequenceFile.createWriter(fs,conf,path,key.getClass(),value.getClass());
    for(int i = 0; i < 100;i++){
    key.set(100-i);
    value.set(DATA[i%DATA.length]);
    System.out.println("[%s]\t%s\t%s\n",writer.getLength(),key,value);
    }
    }finally{
    IOUtils.closeStream(writer);
    } } }

  3. 读取SequeceFile类
  • MapFile类
  1. 写入MapFile类
  2. 读取MapFile类

《Hadoop权威》学习笔记四:Hadoop的I/O的更多相关文章

  1. Hadoop入门学习笔记---part1

    随着毕业设计的进行,大学四年正式进入尾声.任你玩四年的大学的最后一次作业最后在激烈的选题中尘埃落定.无论选择了怎样的选题,无论最后的结果是怎样的,对于大学里面的这最后一份作业,也希望自己能够尽心尽力, ...

  2. Hadoop入门学习笔记---part4

    紧接着<Hadoop入门学习笔记---part3>中的继续了解如何用java在程序中操作HDFS. 众所周知,对文件的操作无非是创建,查看,下载,删除.下面我们就开始应用java程序进行操 ...

  3. Hadoop入门学习笔记---part3

    2015年元旦,好好学习,天天向上.良好的开端是成功的一半,任何学习都不能中断,只有坚持才会出结果.继续学习Hadoop.冰冻三尺,非一日之寒! 经过Hadoop的伪分布集群环境的搭建,基本对Hado ...

  4. Hadoop入门学习笔记---part2

    在<Hadoop入门学习笔记---part1>中感觉自己虽然总结的比较详细,但是始终感觉有点凌乱.不够系统化,不够简洁.经过自己的推敲和总结,现在在此处概括性的总结一下,认为在准备搭建ha ...

  5. [转帖]hadoop学习笔记:hadoop文件系统浅析

    hadoop学习笔记:hadoop文件系统浅析 https://www.cnblogs.com/sharpxiajun/archive/2013/06/15/3137765.html 1.什么是分布式 ...

  6. C#可扩展编程之MEF学习笔记(四):见证奇迹的时刻

    前面三篇讲了MEF的基础和基本到导入导出方法,下面就是见证MEF真正魅力所在的时刻.如果没有看过前面的文章,请到我的博客首页查看. 前面我们都是在一个项目中写了一个类来测试的,但实际开发中,我们往往要 ...

  7. IOS学习笔记(四)之UITextField和UITextView控件学习

    IOS学习笔记(四)之UITextField和UITextView控件学习(博客地址:http://blog.csdn.net/developer_jiangqq) Author:hmjiangqq ...

  8. java之jvm学习笔记四(安全管理器)

    java之jvm学习笔记四(安全管理器) 前面已经简述了java的安全模型的两个组成部分(类装载器,class文件校验器),接下来学习的是java安全模型的另外一个重要组成部分安全管理器. 安全管理器 ...

  9. Learning ROS for Robotics Programming Second Edition学习笔记(四) indigo devices

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...

  10. Typescript 学习笔记四:回忆ES5 中的类

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

随机推荐

  1. 字符串匹配算法之Sunday算法

    字符串匹配查找算法中,最着名的两个是KMP算法(Knuth-Morris-Pratt)和BM算法(Boyer-Moore).两个算法在最坏情况下均具有线性的查找时间.但是在实用上,KMP算法并不比最简 ...

  2. twsited(5)--不同模块用rabbitmq传递消息

    上一章,我们讲到,用redis共享数据,以及用redis中的队列来实现一个简单的消息传递.其实在真实的过程中,不应该用redis来传递,最好用专业的消息队列,我们python中,用到最广泛的就是rab ...

  3. 将日志写入Debug窗口

    定义在NuGet包“Microsoft.Extensions.Logging.Debug”中的DebugLogger会直接调用Debug的WriteLine方法来写入分发给它的日志消息.如果需要使用D ...

  4. Core开发-后台任务利器Hangfire使用

    Core开发-后台任务利器Hangfire使用 ASP.NET Core开发系列之后台任务利器Hangfire 使用. Hangfire 是一款强大的.NET开源后台任务利器,无需Windows服务/ ...

  5. easyui 1.3.3 中combotree post传参问题

    重写Tree的loader,增加queryParams属性支持,并且增加setQueryParams方法 //重写tree的loader $.extend($.fn.tree.defaults, { ...

  6. ASM-51汇编出错信息表

    1  Address Out of Range 一个被计值的目标地址超出了当前语句的范围.2 Badly Formed Argument 数字规定的类型中有非法数字存在.3 Illefal Equal ...

  7. MyBatis的事务处理

    先来假设这样一个问题:如果数据库里面有一个用户表和一个作家表,那么当要添加一条数据到作家表中时,作家表的id必须是用户表中的其中一个id,因为作家一定也要是一个用户.这时就涉及到事务处理. 在上一篇博 ...

  8. 解决Qt5.7.0 cannot find -lGL

    很久没用Qt了,这次要做一个协议编辑器,在ubuntu 14.04上安装了最新版本的Qt 5.7.0.界面改用扁平化风格,第一感觉还不错.按默认步骤创建了一个gui程序,编译运行,报了一个错:cann ...

  9. MVC 4.0语法 自动分页

    4.0语法中实现自动分页只需要两个方法即可,Skip() ----跳过序列中指定的元素,Take()-----从序列的开头返回指定数量元素. 一般用自动分页都是无刷新的,可以把显示的数据,用局部页面封 ...

  10. 【Python基础】计算项目代码行数

    统计代码行数 # coding: utf-8 import os import sys import time def get_line_count(file_path): ""& ...