Hadoop序列化总结

本文详细介绍了Hadoop序列化的概念、原因及Java序列化不适用的理由。重点探讨了Hadoop常用序列化类型及其在数据排序中的应用,并详细讲解了如何实现自定义序列化,包括注意事项和具体案例,旨在帮助读者深入理解并掌握Hadoop序列化技术。
摘要由CSDN通过智能技术生成

觉得有帮助的,请多多支持博主,点赞关注哦~

Hadoop序列化

1、序列化理解

1.1、序列化定义

1.1.1、概念

序列化就是把内存中的对象,转换成字节序列(或其他数据传输协议)以便于存储(持久化)和网络传输。

反序列化就是将收到字节序列(或其他数据传输协议)或者是硬盘的持久化数据,转换成内存中的对象。

1.1.2、理解
1)序列化就是把内存中的对象,转换成【字节序列】以便于存储和网络传输。 
2)反序列化就是将收到【字节序列】或者是硬盘的持久化数据,转换成对象。

书桌:
  商家---》顾客(序列化的操作)
  1)书桌对象->拆成了N个小零件(字节序列)
  
  顾客收到货:(反序列化)
  2)组装零件(字节序列)-->书桌对象

1.2、使用序列化的原因

一般来说,“活的”对象只生存在内存里,关机断电就没有了。而且“活的”对象只能由本地的进程使用,不能被发送到网络上的另外一台计算机。 然而序列化可以存储“活的”对象,可以将“活的”对象发送到远程计算机。
总而言之就是:将数据活化,并进行远程的传输与存储。

1.3、Hadoop没使用java序列化的原因

常规java程序:            mapreduce(java编写)
  1、helloworld         wordcount
  2、数据类型             java的常规数据类型(中间的处理程序)
                        +hadoop序列化类型(input参数、output参数)
  1. Java的序列化是一个重量级序列化框架(Serializab1e),一个对象被序列化后,会附带很多额外的信息(各种校验信息,header,继承体系等),不便于在网络中高效传输。
  2. Java序列化很强大,序列化得到的信息很详细,但是序列化后很占内存。

所以,hadoop 自己开发了一套序列化机制(Writable),特点如下:

  1. 紧凑:紧凑的格式能让我们充分利用网络带宽,而带宽是数据中心最稀缺的资
  2. 快速:进程通信形成了分布式系统的骨架,所以需要尽量减少序列化和反序列化的性能开销,这是基本的;
  3. 可扩展:协议为了满足新的需求变化,所以控制客户端和服务器过程中,需要直接引进相应的协议,这些是新协议,原序列化方式能支持新的协议报文;
  4. 互操作:能支持不同语言写的客户端和服务端进行交互;

2、常用的Hadoop序列化类型

Java类型 Hadoop Writable类型
boolean BooleanWritable
byte ByteWritable
int IntWritable, VIntWritable(可变长度)
float FloatWritable
long LongWritable, VLongWritable(可变长度)
double DoubleWritable
String Text
map MapWritable
array ArrayWritable
null NulWritable

2.1、实现数据排序

数据排序代码示例:

package com.biubiubiu.test;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

import java.io.IOException;

public class TestSort {
   
   /*
     数据:
      4
      5
    */
    //自定义Mapper
    static class CustomSortMapper extends Mapper<Object, Text,IntWritable,IntWritable>{
   
        //为了实现变量的重用
        IntWritable number = new IntWritable();
       @Override
       protected void map(Object key, Text value, Context context) throws IOException, InterruptedException {
   
           System.out.println("map接收的参数:key="+key+",value="+value.toString());
           int num=Integer.parseInt(value.toString());
           number.set(num);
           //输出-->环形缓冲区context
           context.write(number,number);

       }
   }
    //自定义Reducer
    static class CustomSortReducer extends Reducer<IntWritable,IntWritable,IntWritable,NullWritable>{
   
        /**
         *
         * @param key              6
         * @param values           (6,6,6)
         * @param context
         * @throws IOException
         * @throws InterruptedException
         */
        IntWritable number= new IntWritable();
        @Override
        protected void reduce(IntWritable key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
   
           StringBuffer valuesStr = new StringBuffer();
           for(IntWritable value:values){
   
               valuesStr.append(value).append(" ");
           }
            System.out.println("reduce端接收的参数:key="+key+",值列表是("+valuesStr.toString()+")");
           //reduce输出, 只输出key,去重
            number.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值