hadoop序列化實(shí)現(xiàn)案例代碼
Hadoop序列化特點(diǎn)
- 緊湊:高效實(shí)用存儲空間
- 快速:讀寫數(shù)據(jù)額外開銷小
- 可擴(kuò)展:隨著通信協(xié)議的升級而可以升級
- 互操作:支持多種語言的交互
自定義Bean對象實(shí)現(xiàn)序列化
- 必須實(shí)現(xiàn)Writable接口
- 反序列化時,需要反射調(diào)用無參構(gòu)造函數(shù)
- 如果需要將自定義的bean放在key中傳輸,則還需要實(shí)現(xiàn)Comparable接口
案例
package com.chen.phoneproject; import org.apache.hadoop.io.Writable; import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; public class FlowBean implements Writable { private long upFlow; private long downFlow; private long sumFlow; 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; } public FlowBean() { super(); } public FlowBean(long upFlow, long downFlow) { super(); this.upFlow = upFlow; this.downFlow = downFlow; } public FlowBean(long upFlow, long downFlow, long sumFlow) { super(); this.upFlow = upFlow; this.downFlow = downFlow; this.sumFlow = sumFlow; } @Override public void write(DataOutput dataOutput) throws IOException { dataOutput.writeLong(upFlow); dataOutput.writeLong(downFlow); dataOutput.writeLong(sumFlow); } @Override public void readFields(DataInput dataInput) throws IOException { this.upFlow = dataInput.readLong(); this.downFlow = dataInput.readLong(); this.sumFlow = dataInput.readLong(); } @Override public String toString() { return "FlowBean{" + "upFlow=" + upFlow + ", downFlow=" + downFlow + ", sumFlow=" + sumFlow + '}'; } }
package com.chen.phoneproject; import lombok.extern.slf4j.Slf4j; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Mapper; import java.io.IOException; @Slf4j public class FlowCountMapper extends Mapper<LongWritable, Text,Text,FlowBean> { Text k = new Text(); @Override protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { log.info("---mapper---"+"key:"+key+",value:"+value); String line = value.toString(); String[] fields = line.split("\t"); String phoneNum = fields[1]; long upFlow = Long.parseLong(fields[3]); long downFlow = Long.parseLong(fields[4]); k.set(phoneNum); FlowBean bean = new FlowBean(upFlow,downFlow); context.write(k,bean); } }
package com.chen.phoneproject; import lombok.extern.slf4j.Slf4j; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Reducer; import java.io.IOException; @Slf4j public class FlowCountReducer extends Reducer<Text,FlowBean,Text,FlowBean> { @Override protected void reduce(Text key, Iterable<FlowBean> values, Context context) throws IOException, InterruptedException { log.info("---reduce---"+"key:"+key+",value:"+values); long sum_upFlow = 0; long sum_downFlow = 0; for (FlowBean flowBean:values){ sum_upFlow += flowBean.getUpFlow(); sum_downFlow += flowBean.getDownFlow(); } FlowBean result = new FlowBean(sum_upFlow,sum_downFlow,sum_downFlow + sum_upFlow); context.write(key,result); } }
package com.chen.phoneproject; import com.chen.mapreduce.WordcountDriver; import com.chen.mapreduce.WordcountMapper; import com.chen.mapreduce.WordcountReducer; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IntWritable; 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 FlowsumDriver { public static void main(String[] args) throws Exception { Configuration configuration = new Configuration(); Job job = Job.getInstance(configuration); job.setJarByClass(FlowsumDriver.class); job.setMapperClass(FlowCountMapper.class); job.setReducerClass(FlowCountReducer.class); job.setMapOutputKeyClass(Text.class); job.setMapOutputValueClass(FlowBean.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(FlowBean.class); FileInputFormat.setInputPaths(job,new Path(args[0])); FileOutputFormat.setOutputPath(job,new Path(args[1])); boolean result = job.waitForCompletion(true); System.exit(result ? 0 : 1); } }
總結(jié)
到此這篇關(guān)于hadoop序列化實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Hadoop序列化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot?使用AOP?+?Redis?防止表單重復(fù)提交的方法
Spring?Boot是一個用于構(gòu)建Web應(yīng)用程序的框架,通過AOP可以實(shí)現(xiàn)防止表單重復(fù)提交,本文介紹了在Spring?Boot應(yīng)用程序中使用AOP和Redis來防止表單重復(fù)提交的方法,需要的朋友可以參考下2023-04-04一文帶你深入了解Java的數(shù)據(jù)結(jié)構(gòu)
Java工具包提供了強(qiáng)大的數(shù)據(jù)結(jié)構(gòu)。這篇文章主要為大家詳細(xì)介紹了Java數(shù)據(jù)結(jié)構(gòu)中常用的幾種接口和類,感興趣的小伙伴可以跟隨小編一起了解一下2023-05-05通過FeignClient調(diào)用微服務(wù)提供的分頁對象IPage報(bào)錯的解決
這篇文章主要介紹了通過FeignClient調(diào)用微服務(wù)提供的分頁對象IPage報(bào)錯的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03基于springboot設(shè)置Https請求過程解析
這篇文章主要介紹了基于springboot設(shè)置Https請求過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-08-08出現(xiàn)SLF4J:?Failed?to?load?class?“org.slf4j.impl.StaticLog
本文主要介紹了出現(xiàn)SLF4J:?Failed?to?load?class?“org.slf4j.impl.StaticLoggerBinder“.的解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07Java對線程池做監(jiān)控的實(shí)現(xiàn)方法
本文主要介紹了Java對線程池做監(jiān)控的實(shí)現(xiàn)方法,監(jiān)控線程池可以幫助我們了解線程池的狀態(tài),如當(dāng)前活躍線程數(shù)、任務(wù)隊(duì)列長度、已完成任務(wù)數(shù)等,下面就一起來了解一下2024-07-07SpringBoot+Security 發(fā)送短信驗(yàn)證碼的實(shí)現(xiàn)
這篇文章主要介紹了SpringBoot+Security 發(fā)送短信驗(yàn)證碼的實(shí)現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-05-05Dubbo+zookeeper搭配分布式服務(wù)的過程詳解
Dubbo作為分布式架構(gòu)比較后的框架,同時也是比較容易入手的框架,適合作為分布式的入手框架,下面是簡單的搭建過程,對Dubbo+zookeeper分布式服務(wù)搭建過程感興趣的朋友一起看看吧2022-04-04