Mapreduce的序列化和流量统计程序开发

一、Hadoop数据序列化的数据类型

  Java数据类型 => Hadoop数据类型

  int         IntWritable

  float        FloatWritable

  long        LongWritable

  double         DoubleWritable

  String       Text

  boolean      BooleanWritable

  byte        ByteWritable

  map          MapWritable

  array        ArrayWritable

二、Hadoop的序列化

  1.什么是序列化?

   在java中,序列化接口是Serializable,它下面又实现了很多的序列化接口,所以java的序列化是一个重量级的序列化框架,一个对象被java序列化之后会附带很多额外的信息(校验信息、header、继承体系等),不便于在网络中进行高效的传输,所以Hadoop开发了一套自己的序列化框架——Writable。

      序列化就是把内存当中的对象,转化为字节序列以便于存储和网络传输;

   反序列化是将收到的字节序列或硬盘当中的持续化数据,转换成内存中的对象。

  2.序列化的理解方法(自己悟的,不对勿喷~~)

    比如下面流量统计案例中,流量的封装类FlowBean实现了Writable接口,其中定义了变量upFlow、dwFlow、flowSum;

    在Mapper和Reducer类中初始化封装类FlowBean时,内存会分配空间加载这些对象,而这些对象不便于在网络中高效的传输,这是封装类FlowBean中的序列化方法将这些对象转换为字节序列,方便了存储和传输;

    当Mapper或Reducer需要将这些对象的字节序列写出到磁盘时,封装类FlowBean中的反序列化方法将字节序列转换为对象,然后写道磁盘中。

  3.序列化特点

   序列化与反序列化时分布式数据处理当中经常会出现的,比如hadoop通信是通过远程调用(rpc)实现的,这个过程就需要序列化。

  特点:1)紧凑;

     2)快速

     3)可扩展

     4)可互操作

三、Mapreduce的流量统计程序案例

  1.代码

/*** @author: PrincessHug* @date: 2019/3/23, 23:38* @Blog: https://www.cnblogs.com/HelloBigTable/*/
public class FlowBean implements Writable {private long upFlow;private long dwFlow;private long flowSum;public long getUpFlow() {return upFlow;}public void setUpFlow(long upFlow) {this.upFlow = upFlow;}public long getDwFlow() {return dwFlow;}public void setDwFlow(long dwFlow) {this.dwFlow = dwFlow;}public long getFlowSum() {return flowSum;}public void setFlowSum(long flowSum) {this.flowSum = flowSum;}public FlowBean() {}public FlowBean(long upFlow, long dwFlow) {this.upFlow = upFlow;this.dwFlow = dwFlow;this.flowSum = upFlow + dwFlow;}/*** 序列化* @param out 输出流* @throws IOException*/@Overridepublic void write(DataOutput out) throws IOException {out.writeLong(upFlow);out.writeLong(dwFlow);out.writeLong(flowSum);}/*** 反序列化* @param in* @throws IOException*/@Overridepublic void readFields(DataInput in) throws IOException {upFlow = in.readLong();dwFlow = in.readLong();flowSum = in.readLong();}@Overridepublic String toString() {return upFlow + "\t" + dwFlow + "\t" + flowSum;}
}public class FlowCountMapper extends Mapper<LongWritable, Text,Text,FlowBean> {@Overrideprotected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {//获取数据String line = value.toString();//切分数据String[] fields = line.split("\t");//封装数据String phoneNum = fields[1];long upFlow = Long.parseLong(fields[fields.length - 3]);long dwFlow = Long.parseLong(fields[fields.length - 2]);//发送数据context.write(new Text(phoneNum),new FlowBean(upFlow,dwFlow));}
}public class FlowCountReducer extends Reducer<Text,FlowBean,Text,FlowBean> {@Overrideprotected void reduce(Text key, Iterable<FlowBean> values, Context context) throws IOException, InterruptedException {//聚合数据long upFlow_sum = 0;long dwFlow_sum = 0;for (FlowBean f:values){upFlow_sum += f.getUpFlow();dwFlow_sum += f.getDwFlow();}//发送数据context.write(key,new FlowBean(upFlow_sum,dwFlow_sum));}
}public class FlowPartitioner extends Partitioner<Text,FlowBean> {@Overridepublic int getPartition(Text key, FlowBean value, int i) {//获取用来分区的电话号码前三位String phoneNum = key.toString().substring(0, 3);//设置分区逻辑int partitionNum = 4;if ("135".equals(phoneNum)){return 0;}else if ("137".equals(phoneNum)){return 1;}else if ("138".equals(phoneNum)){return 2;}else if ("139".equals(phoneNum)){return 3;}return partitionNum;}
}
public class FlowCountDriver {public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {//获取配置,定义工具Configuration conf = new Configuration();Job job = Job.getInstance();//设置运行类job.setJarByClass(FlowCountDriver.class);//设置Mapper类及Mapper输出数据类型job.setMapperClass(FlowCountMapper.class);job.setMapOutputKeyClass(Text.class);job.setMapOutputValueClass(FlowBean.class);//设置Reducer类及其输出数据类型job.setReducerClass(FlowCountReducer.class);job.setOutputKeyClass(Text.class);job.setOutputValueClass(FlowBean.class);//设置自定义分区job.setPartitionerClass(FlowPartitioner.class);job.setNumReduceTasks(5);//设置文件输入输出流FileInputFormat.setInputPaths(job,new Path("G:\\mapreduce\\flow\\in"));FileOutputFormat.setOutputPath(job,new Path("G:\\mapreduce\\flow\\inpartitionout"));//返回运行完成if (job.waitForCompletion(true)){System.out.println("运行完毕!");}else {System.out.println("运行出错!");}}
}

 

 

 

  

转载于:https://www.cnblogs.com/HelloBigTable/p/10590705.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/264445.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

matlab标准化出现负值,为什么我求出来的约束条件是负值

本帖最后由 renwoxinfen 于 2016-11-8 09:01 编辑程序如下&#xff1a;a.m% 设计变量(螺杆平均直径D和长度L)的初始值x0[30;5000];% 设计变量(螺杆平均直径D长度L)的下界与上界Lb[30;5000];Ub[200;6000];% 调用多维约束优化函数% 线性不等式约束放入约束函数文件&#xff0c;参…

1048 Find Coins

水题&#xff0c;详见代码&#xff5e; #include <iostream> #include <string.h> #include <cstdio> #include <algorithm> #include <cstdlib> #include <math.h> #include <queue> #include <stack> #include <vector&g…

P2P之UDP穿透NAT的原理与实现(转)

论坛上经常有对P2P原理的讨论&#xff0c;但是讨论归讨论&#xff0c;很少有实质的东西产生&#xff08;源代码&#xff09;。呵呵&#xff0c;在这里我就用自己实现的一个源代码来说明UDP穿越NAT的原理。 首先先介绍一些基本概念&#xff1a; NAT(Network Address Transla…

基于MATLAB的turbo码代码,一种基于Simulink的Turbo码仿真实现

一种基于Simulink的Turbo码仿真实现Implementation of Turbo Code Simulation Based on SimulinkDOI: 10.12677/HJWC.2014.43010,PDF, ,下载:2,684 浏览:6,349作者:王 丁&#xff1a;杭州电子科技大学&#xff0c;杭州摘要:介绍了Turbo码的编解码原理&#xff0c;并且提出了一…

数组各元素出现的次数

var str "abcabcaaaaa";var map {};  for(var i 0;i<str.length;i){    var s str[i];    var r map[s];    if(r){      map[s] 1;      }else{        map[s] 1;      }    }console.log(JSON.stringify(map)…

php组件是啥,浅谈PHP组件、框架以及Composer

本篇文章主要介绍了PHP组件、框架以及Composer&#xff0c;具有一定的学习价值&#xff0c;感兴趣的朋友可以了解一下。什么是组件组件是一组打包的代码&#xff0c;是一系列相关的类、接口和Trait&#xff0c;用于帮助我们解决PHP应用中某个具体问题。例如&#xff0c;你的PHP…

{转}maven+continuum安装与配置

为什么80%的码农都做不了架构师&#xff1f;>>> 一、下载 1. maven: 项目管理工具&#xff0c;可以进行项目的编译、测试、布置、发布等 下载路径&#xff1a;http://apache.etoak.com/maven/binaries/apache-maven-2.2.1-bin.zip 2. continuum: 基本实现的功能&…

六种方法,做一名更好的开发者

六种方法&#xff0c;做一名更好的开发者2008-12-13 23:381. 交谈 尽可能多地跟其他软件开发者交谈&#xff1b;培养个人关系&#xff1b;跟意见与你相左的人交流&#xff1b;跟经验更丰富的人交流&#xff1b;跟阅历丰富的人交流。多到Groups 中去&#xff0c;尤其是交谈…

.net Excel导出出现乱码及excel打开出现错误提示

测试人员测试发现。导出excel出现乱码以及出现文件可正常导出、后几次导出却异常。 使用的系统浏览器&#xff1a; 其他360浏览器、谷歌浏览器均正常。 出现情况如下&#xff1a; 查资料发现&#xff0c;之前导出代码编写的 Response.AppendHeader("Content-Disposition&q…

stract oracle,ORACLE 字符串聚合函数 strCat

源码如下&#xff1a;create or replace type strcat_type as object(currentstr varchar2(4000),currentseprator varchar2(8),static function ODCIAggregateInitialize(sctx IN OUT strcat_type) return number,member function ODCIAggregateIterate(self IN OUT strcat_ty…

您请求的报表需要更多信息...

ASP.NET水晶报表心得: 我建立好的的报表,在本机测试通过,可是一发布就出现这个提示:"您请求的报表需要更多信息...".这个问题郁闷死我了,困扰了我好一阵,说句心里话,还没有解决,在网上了也搜索了,但是没有解决我所遇到的问题,我采取了一个折中的办法去处理. 首先说一…

rsync推拉模型及结合inotify实现推模型自动同步

一、前言 无论使用什么操作系统下&#xff0c;都经常有同步文件的需求&#xff0c;不管发生在本地&#xff0c;还是发生在本地和远程主机之间。那么应该怎么做呢&#xff1f; 使用拷贝类的命令&#xff0c;本地使用cp命令&#xff0c;复制到远程主机使用scp这样的命令&#xff…

数据库设计:三范式

第一范式:确保每列的原子性. 如果每列(或者每个属性)都是不可再分的最小数据单元(也称为最小的原子单元),则满足第一范式. 例如:顾客表(姓名、编号、地址、……)其中"地址"列还可以细分为国家、省、市、区等。第二范式:在第一范式的基础上更进一层,目标是确保表…

oracle to pgsql,PostgresToOracle

PostgresToOracle官方版是一款十分专业和实用的PostgreSQL数据库迁移到Oracle工具&#xff0c;PostgresToOracle官方版功能出色&#xff0c;操作便捷&#xff0c;能够轻松快捷的帮助大家将PostgreSQL数据导入到oracle数据中&#xff0c;导入之后可以进行数据编辑&#xff0c;此…

资源下载列表

赵昱的博客&#xff1a;http://blog.zhaoyu.me/ 新托福考位助手&#xff1a;1.0.0 Beta2 | Download &#xff1a;新托福考位助手 (601) | 更新记录 Icyplayer Library C#&#xff1a;1.0.0 | Download&#xff1a;Icyplayer Library C# (522) | 更新记录 转载于:https://www…

Struts2中的OGNL详解

2019独角兽企业重金招聘Python工程师标准>>> 首先了解下OGNL的概念&#xff1a; OGNL是Object-Graph Navigation Language的缩写&#xff0c;全称为对象图导航语言&#xff0c;是一种功能强大的表达式语言&#xff0c;它通过简单一致的语法&#xff0c;可以任意存取…

oracle exacc,【学习笔记】Oracle 11GR2新特性Adaptive Cursor Sharing(ACS)

天萃荷净Oracle研究中心学习笔记&#xff1a;分享一篇关于Oracle 11.2.0.1 11Gr2数据库最新版本中最新特性Adaptive Cursor Sharing(ACS)深入研究笔记。本站文章除注明转载外&#xff0c;均为本站原创&#xff1a; 转载自love wife & love life —Roger 的Oracle技术博客本…

鼠标屏幕取词-技术

二、小故事串起来&#xff0c;就是秘密所在 别以为刚才那几个小故事都是杂乱无章地堆在一起&#xff0c;只要你把它们看明白了&#xff0c;那取词的秘密也就大白于天下了。让我们看看词霸在几个小故事中各扮演了什么角色…… 1.获得鼠标当前位置 通过HOOK机制钩住系统中的鼠标消…

C# 之 HttpResponse 类

Response 对象&#xff0c;派生自HttpResponse 类&#xff0c;该类封装来自 ASP.NET 操作的 HTTP 响应信息。存在于System.Web命名空间下。 注&#xff1a;MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型就是设定某种扩展名的文件用一种应用程序来打开的…

oracle时间类型插入,oracle 插入时间字符串 Date类型

和MysqL不同&#xff0c;MysqL 可以直接插入 时间字符串的&#xff0c;UPDATE HR_EFF_EVALUATORSET LEVEL_ 2,ROLE_NAME_ 他评,ASSESS_ROLE_ 具体人员,ASSESS_WAY_ 10,WEIGHT_ 百分制,NOTE_ 欧敏测试,PLAN_ID_ 110001231000002,STATUS_ 0,CREATE_TIME_TO_DATE(2016-12-…