代碼實現——MapReduce實現Hadoop序列化

簡單介紹

1、什么是序列化

  • 序列化:把內存中的對象,轉換成字節序列(或其他數據傳輸協議)以便于存儲到磁盤(持久化)和網絡傳輸。
  • 反序列化:將收到字節序列(或其他數據傳輸協議)或者是磁盤的持久化數據,轉換成內存中的對象。

2、 為什么要序列化

對象的序列化(Serialization)用于將對象編碼成一個字節流,以及從字節流中重新構建對象。"將一個對象編碼成一個字節流"稱為序列化該對象(SeTializing);相反的處理過程稱為反序列化(Deserializing)。 序列化有三種主要的用途:

  1. 作為一種持久化格式:一個對象被序列化以后,它的編碼可以被存儲到磁盤上,供以后反序列化用。

  2. 作為一種通信數據格式:序列化結果可以從一個正在運行的虛擬機,通過網絡被傳遞到另一個虛擬機上。

  3. 作為一種拷貝、克隆(clone)機制:將對象序列化到內存的緩存區中。然后通過反序列化,可以得到一個對已存對象進行深拷貝的新對象。

在分布式數據處理中,主要使用上面提到的前兩種功能:數據持久化和通信數據格式

需求

統計每一個手機號耗費的總上行流量、下行流量、總流量(txt文檔在/Users/lizhengi/test/input/目錄下)

1       13736230513     192.196.2.1     www.shouhu.com  2481    24681   200
2       13846544121     192.196.2.2                     264     0       200
3       13956435636     192.196.2.3                     132     1512    200
4       13966251146     192.168.2.1                     240     0       404
5       18271575951     192.168.2.2     www.shouhu.com  1527    2106    200
6       18240717138     192.168.2.3     www.hao123.com  4116    1432    200
7       13590439668     192.168.2.4                     1116    954     200
8       15910133277     192.168.2.5     www.hao123.com  3156    2936    200
9       13729199489     192.168.2.6                     240     0       200
10      13630577991     192.168.2.7     www.shouhu.com  6960    690     200
11      15043685818     192.168.2.8     www.baidu.com   3659    3538    200
12      15959002129     192.168.2.9     www.hao123.com  1938    180     500
13      13560439638     192.168.2.10                    918     4938    200
14      13470253144     192.168.2.11                    180     180     200
15      13682846555     192.168.2.12    www.qq.com      1938    2910    200
16      13992314666     192.168.2.13    www.gaga.com    3008    3720    200
17      13509468723     192.168.2.14    www.qinghua.com 7335    110349  404
18      18390173782     192.168.2.15    www.sogou.com   9531    2412    200
19      13975057813     192.168.2.16    www.baidu.com   11058   48243   200
20      13768778790     192.168.2.17                    120     120     200
21      13568436656     192.168.2.18    www.alibaba.com 2481    24681   200
22      13568436656     192.168.2.19                    1116    954     200

實現過程

1、新建Maven工程,pom.xml依賴如下

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.lizhengi</groupId><artifactId>Hadoop-API</artifactId><version>1.0-SNAPSHOT</version><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>RELEASE</version></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.8.2</version></dependency><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-common</artifactId><version>3.2.1</version></dependency><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-client</artifactId><version>3.2.1</version></dependency><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-hdfs</artifactId><version>3.2.1</version></dependency></dependencies></project>

2、src/main/resources目錄下,新建一個文件,命名為“log4j.properties”,添加內容如下

log4j.rootLogger=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=target/spring.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n

3、編寫Bean類-FlowBean

package com.lizhengi.flow;import org.apache.hadoop.io.Writable;import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;/*** @author lizhengi* @create 2020-07-20*/
// 1 實現writable接口
public class FlowBean implements Writable {private long upFlow;    //上行流量private long downFlow;  //下行流量private long sumFlow;   //總流量//2  反序列化時,需要反射調用空參構造函數,所以必須有public FlowBean() {}@Overridepublic String toString() {return upFlow + "\t" + downFlow + "\t" + sumFlow;}public void set(long upFlow, long downFlow) {this.upFlow = upFlow;this.downFlow = downFlow;this.sumFlow = upFlow + downFlow;}public long getUpFlow() {return upFlow;}public void setUpFlow(long upFlow) {this.upFlow = upFlow;}public long getDownFlow() {return downFlow;}public void setDownFlow(long downFlow) {this.downFlow = downFlow;}public long getSumFlow() {return sumFlow;}public void setSumFlow(long sumFlow) {this.sumFlow = sumFlow;}//3  寫序列化方法public void write(DataOutput out) throws IOException {out.writeLong(upFlow);out.writeLong(downFlow);out.writeLong(sumFlow);}//4 反序列化方法//5 反序列化方法讀順序必須和寫序列化方法的寫順序必須一致public void readFields(DataInput in) throws IOException {upFlow = in.readLong();downFlow = in.readLong();sumFlow = in.readLong();}}

4、編寫Mapper類-FlowMapper

package com.lizhengi.flow;import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;import java.io.IOException;/*** @author lizhengi* @create 2020-07-20*/
public class FlowMapper extends Mapper<LongWritable, Text, Text, FlowBean> {private Text phone = new Text();private FlowBean flow = new FlowBean();@Overrideprotected void map(LongWritable key, Text value, Context context)	throws IOException, InterruptedException {String[] fields = value.toString().split("\t");phone.set(fields[1]);long upFlow = Long.parseLong(fields[fields.length - 3]);long downFlow = Long.parseLong(fields[fields.length - 2]);flow.set(upFlow,downFlow);context.write(phone, flow);}
}

5、編寫Reducer類-FlowReducer

package com.lizhengi.flow;import java.io.IOException;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;/*** @author lizhengi* @create 2020-07-20*/
public class FlowReducer extends Reducer<Text, FlowBean, Text, FlowBean> {private FlowBean sunFlow = new FlowBean();@Overrideprotected void reduce(Text key, Iterable<FlowBean> values, Context context)throws IOException, InterruptedException {long sum_upFlow = 0;long sum_downFlow = 0;// 1 遍歷所用bean,將其中的上行流量,下行流量分別累加for (FlowBean value : values) {sum_upFlow += value.getUpFlow();sum_downFlow += value.getDownFlow();}// 2 封裝對象sunFlow.set(sum_upFlow, sum_downFlow);// 3 寫出context.write(key, sunFlow);}
}

6、編寫Drvier類-FlowDriver

package com.lizhengi.flow;/*** @author lizhengi* @create 2020-07-20*/import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;public class FlowDriver {public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {// 1 獲取job實例Job job = Job.getInstance(new Configuration());// 2.設置類路徑job.setJarByClass(FlowDriver.class);// 3 指定本業務job要使用的mapper/Reducer業務類job.setMapperClass(FlowMapper.class);job.setReducerClass(FlowReducer.class);// 4 指定mapper輸出數據的kv類型job.setMapOutputKeyClass(Text.class);job.setMapOutputValueClass(FlowBean.class);// 5 指定最終輸出的數據的kv類型job.setOutputKeyClass(Text.class);job.setOutputValueClass(FlowBean.class);// 6 指定job的輸入原始文件所在目錄FileInputFormat.setInputPaths(job, "/Users/marron27/test/input");FileOutputFormat.setOutputPath(job, new Path("/Users/marron27/test/output"));//FileInputFormat.setInputPaths(job, new Path(args[0]));//FileOutputFormat.setOutputPath(job, new Path(args[1]));// 7 將job中配置的相關參數,以及job所用的java類所在的jar包, 提交給yarn去運行boolean result = job.waitForCompletion(true);System.exit(result ? 0 : 1);}
}

結果展示

Carlota:output marron27$ pwd
/Users/marron27/test/output
Carlota:output marron27$ cat part-r-00000 
13470253144	180	180	360
13509468723	7335	110349	117684
13560439638	918	4938	5856
13568436656	3597	25635	29232
13590439668	1116	954	2070
13630577991	6960	690	7650
13682846555	1938	2910	4848
13729199489	240	0	240
13736230513	2481	24681	27162
13768778790	120	120	240
13846544121	264	0	264
13956435636	132	1512	1644
13966251146	240	0	240
13975057813	11058	48243	59301
13992314666	3008	3720	6728
15043685818	3659	3538	7197
15910133277	3156	2936	6092
15959002129	1938	180	2118
18240717138	4116	1432	5548
18271575951	1527	2106	3633
18390173782	9531	2412	11943

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/535809.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/535809.shtml
英文地址,請注明出處:http://en.pswp.cn/news/535809.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

日常問題——hadoop啟動后發現namenode沒有啟動,但是排除了格式化過度的問題

hadoop啟動后發現namenode沒有啟動&#xff0c;網上說的格式化過度的問題我是沒有的&#xff0c;因為我只格式化過一次。之后查看日志 vim /opt/hadoop/logs/namenode對應的log文件 發現 2020-03-03 23:16:21,868 INFO org.apache.hadoop.metrics2.impl.MetricsSystemImpl: Na…

Zookeeper3.6.1常用的Shell命令

1、客戶端連接 zkCli.sh zkCli.sh -server host:port2、顯示節點信息 -s狀態 -w監聽器 -R遞歸 ls [-s] [-w] [-R] path3、創建節點 -s加序列號 -e臨時節點 create [-s] [-e] path [data]4、獲取節點值 -s狀態 -w監聽器 get [-s] [-w] path5、設置節點值 -s狀態 set [-s] […

CentOS7下MySQL5.7的安裝

1、下載MySQL 安裝包&#xff1a; wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpmyum -y localinstall mysql57-community-release-el7-11.noarch.rpm 2、在線安裝MySQL yum -y install mysql-community-server 3、啟動mysql 服務 systemct…

CentOS7下Hive的安裝配置

0、安裝前提 安裝配置jdk與hadoop安裝配置好mysql 1、下載上傳 下載hive&#xff0c;地址:http://mirror.bit.edu.cn/apache/hive/上傳到指定位置scp apache-hive-3.1.2-bin.tar.gz rootCarlota1:/usr/local/apps 2、解壓安裝 tar -zxvf apache-hive-3.1.2-bin.tar.gzmv a…

Hive常用的操作命令

Hive常用的交互命令 hive 進入數據庫hive -e 不進入hive的交互窗口執行sql語句hive -f 執行sql腳本hive -help 查看幫助 Hive常用數據庫的操作命令 show databases;查看hive中的所有數據庫use default;用default數據庫create database myhive ;創建數據庫create database if…

Hive常見的屬性配置

配置文件 默認配置文件&#xff1a;hive-default.xml 用戶自定義配置文件&#xff1a;hive-site.xml 用戶自定義配置會覆蓋默認配置。另外&#xff0c;Hive也會讀入Hadoop的配置&#xff0c;因為Hive是作為Hadoop的客戶端啟動的&#xff0c;Hive的配置會覆蓋Hadoop的配置。配…

什么是集群(cluster)

1、集群 1.1 什么是集群 簡單的說&#xff0c;集群(cluster)就是一組計算機&#xff0c;它們作為一個整體向用戶提供一組網絡資源。這些單個的計算機系統就是集群的節點(node)。一個理想的集群是&#xff0c;用戶從來不會意識到集群系統底層的節點&#xff0c;在他/她們看來&am…

Kafka:集群部署

0、環境準備 安裝jdk&#xff0c;配置環境提前安裝zookeeper 1、解壓安裝 將tar壓縮包上傳tar -zxvf kafka_2.12-2.5.0.tgz 2、配置變量環境 vi /etc/profile #kafka export KAFKA_HOME/usr/local/apps/kafka_2.12-2.5.0 export PATH$PATH:$KAFKA_HOME/binsource /etc/pr…

集群(cluster)amp;高可用性(HA)概念

1.1 什么是集群 簡單的說&#xff0c;集群&#xff08;cluster&#xff09;就是一組計算機&#xff0c;它們作為一個整體向用戶提供一組網絡資源。這些單個的計算機系統就是集群的節點&#xff08;node&#xff09;。一個理想的集群是&#xff0c;用戶從來不會意識到集群系…

Kafka:常用命令

啟動Kafka&#xff1a;kafka-server-start.sh -daemon $KAFKA_HOME/config/server.properties創建一個叫test的話題&#xff0c;有兩個分區&#xff0c;每個分區3個副本&#xff1a;kafka-topics.sh --zookeeper localhost:2181 --create --topic test --replication-factor 3 …

MySQL Cluster 群集安裝環境介紹

MySQL Cluster 群集安裝環境介紹 MySQL 群集支持的操作系統:* Linux (Red Hat, Novell/SUSE) * Sun Solaris * IBM AIX * HP-UX * Mac OS X MySQL 軟件:* MySQL Max 版本 (並不是指 MaxDB)* MySQL NDB Cluster 系統最低需求&#xff1a; OS&#xff1a; Linux ( Turbolinux…

八股文打卡day9——計算機網絡(9)

面試題&#xff1a;HTTP1.0和HTTP1.1的區別&#xff1f; 我的回答&#xff1a; 1.長連接&#xff1a;HTTP1.1引入了長連接的機制&#xff0c;connection&#xff1a;keep-alive。一個TCP連接可以進行多次請求和響應。而HTTP1.0每次請求響應一次都得建立連接、斷開連接。 引入…

使用ogg實現oracle到kafka的增量數據實時同步

Oracle Golden Gate軟件是一種基于日志的結構化數據復制備份軟件&#xff0c;它通過解析源數據庫在線日志或歸檔日志獲得數據的增量變化&#xff0c;再將這些變化應用到目標數據庫&#xff0c;從而實現源數據庫與目標數據庫同步。 0、本篇中源端和目標端的一些配置信息&#xf…

轉載:35歲前成功的12條黃金法則

習慣的力量是驚人的。習慣能載著你走向成功&#xff0c;也能馱著你滑向失敗。如何選擇&#xff0c;完全取決于你自己。 1.習慣的力量&#xff1a;35歲以前養成好習慣 你想成功嗎&#xff1f;那就及早培養有利于成功的好習慣。 習慣的力量是驚人的&#xff0c;35歲…

JDK源碼解析之 Java.lang.Object

Object類是Java中其他所有類的祖先&#xff0c;沒有Object類Java面向對象無從談起。作為其他所有類的基類&#xff0c;Object具有哪些屬性和行為&#xff0c;是Java語言設計背后的思維體現。 Object類位于java.lang包中&#xff0c;java.lang包包含著Java最基礎和核心的類&…

將z-blog改成英文blog所遇到的問題

1.將z-blog中文章日期中的“年,月,日”改成英文 相關模板:b_article-multi.htmlb_article-single.html默認用的時間標簽是<#article/posttime/longdate#> 即 "2007年1月13日" 這樣的形式你可以換成 <#article/posttime/shortdate#>即 "2…

JDK源碼解析之 Java.lang.String

String 類代表字符串。Java 程序中的所有字符串字面值&#xff08;如 “abc” &#xff09;都作為此類的實例實現。 字符串是常量&#xff1b;它們的值在創建之后不能更改。字符串緩沖區支持可變的字符串。因為 String 對象是不可變的&#xff0c;所以可以共享。 一、類定義 p…

看到一個blog的標語,有意思!

"上世紀80年代勇氣&#xff0c;90年代靠關系&#xff0c;現在必須靠知識能力&#xff01;掙錢靠1、興趣廣泛&#xff1b; 2、感覺敏銳&#xff1b; 3、集中力強&#xff1b; 4、個性不脆弱&#xff08;堅韌性&#xff09;&#xff1b; 5、能在瞬間了解因果關系&#xff1b…

JDK源碼解析之 Java.lang.AbstractStringBuilder

這個抽象類是StringBuilder和StringBuffer的直接父類&#xff0c;而且定義了很多方法&#xff0c;因此在學習這兩個類之間建議先學習 AbstractStringBuilder抽象類 該類在源碼中注釋是以JDK1.5開始作為前兩個類的父類存在的&#xff0c;可是直到JDK1.8的API中&#xff0c;關于S…

RHEL下安裝配置基于2臺服務器的MYSQL集群

一、介紹這篇文檔旨在介紹如何在RHEL下安裝配置基于2臺服務器的MySQL集群。并且實現任意一臺服務器出現問題或宕機時MySQL依然能夠繼續運行。 注意&#xff01;雖然這是基于2臺服務器的MySQL集群&#xff0c;但也必須有額外的第三臺服務器作為管理節點&#xff0c;但這臺服務器…