觉得有帮助的,请多多支持博主,点赞关注哦~
文章目录
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参数)
- Java的序列化是一个重量级序列化框架(Serializab1e),一个对象被序列化后,会附带很多额外的信息(各种校验信息,header,继承体系等),不便于在网络中高效传输。
- Java序列化很强大,序列化得到的信息很详细,但是序列化后很占内存。
所以,hadoop 自己开发了一套序列化机制(Writable),特点如下:
- 紧凑:紧凑的格式能让我们充分利用网络带宽,而带宽是数据中心最稀缺的资
- 快速:进程通信形成了分布式系统的骨架,所以需要尽量减少序列化和反序列化的性能开销,这是基本的;
- 可扩展:协议为了满足新的需求变化,所以控制客户端和服务器过程中,需要直接引进相应的协议,这些是新协议,原序列化方式能支持新的协议报文;
- 互操作:能支持不同语言写的客户端和服务端进行交互;
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.