大数据之Hadoop学习——动手实战学习MapReduce编程实例

本文详细介绍了MapReduce编程,从理论基础到实战案例,包括自定义对象序列化、数据去重、排序、分区等。通过一系列实例,如手机用户流量统计、数据去重、排序和分组等,深入理解MapReduce的工作原理和应用。同时推荐了相关学习资源和书籍,适合大数据学习者参考。
摘要由CSDN通过智能技术生成

文章目录


这里放一个我学习MapReduce的编程实例项目吧,本来是想把这些分开写成多篇文章的,能够详细叙述我学习过程中感想。但无奈,时间不够,只好在Github上创建了该项目,在代码中由较为详细的注释,我想也足够了吧。

项目地址:josonle/MapReduce-Demo

该项目有些题目是参考了网上几篇博客,但代码实现是本人实现的。其次,所谓的MapReduce学习流程是参照老师上课所讲的PPT上的流程【某985大数据课程PPT】,我想老师以这样的流程授课肯定是有道理的。项目中也放了老师提供的几个参考Demo文件。

该项目还在更新中,有些代码还没实现,慢慢来吧。

版权声明:本文为博主原创文章,未经博主允许不得转载(https://blog.csdn.net/lzw2016/)


  • 18/12/29更新
    一、二所提到的知识点仅供参考,四中推荐的书籍建议看一看(如果想弄懂的话),三、五题目解答仅供参考,谢谢。
  • 19/1/4更新
    文章中有部分勘误,此处博客不方便改动。你觉得有问题的话,可以查看这个项目的文档(我觉得有问题的地方都在README.md中改动了)。

一、MapReduce理论基础

二、Hadoop、Spark学习路线及资源收纳


三、MapReduce编程实例

1.自定义对象序列化

需求分析

需要统计手机用户流量日志,日志内容实例:

flowdata.log

要把同一个用户的上行流量、下行流量进行累加,并计算出综合 。例如上面的13897230503有两条记录,就要对这两条记录进行累加,计算总和,得到:13897230503,500,1600,2100

报错:Exception in thread “main” java.lang.IllegalArgumentException: Wrong FS: hdfs://192.168.17.10:9000/workspace/flowStatistics/output, expected: file:///
解决:1、将core-site.xml 和hdfs-site.xml拷贝到项目里去就可以,原因是访问远程的HDFS 需要通过URI来获得FileSystem
	2、在项目中,Configuration对象设置fs.defaultFS 【推荐这个,**大小写别拼错,我就是拼错了找了半天**】

		String namenode_ip = "192.168.17.10";
		String hdfs = "hdfs://"+namenode_ip+":9000";
		Configuration conf = new Configuration();
		conf.set("fs.defaultFS", hdfs);
解答
一、正常处理即可,不过在处理500 1400 这种时灵活变通一下即可
public static class FlowMapper extends Mapper<Object, Text, Text, Text>{
   
		
		public void map(Object key,Text value,Context context) throws IOException, InterruptedException {
   
			String[] strs = value.toString().split("\t");
			Text phone = new Text(strs[0]);
			Text flow = new Text(strs[1]+"\t"+strs[2]);
			context.write(phone, flow);
		}
	}
	
	public static class FlowReducer extends Reducer<Text, Text, Text, Text>{
   
		public void reduce(Text key,Iterable<Text> values,Context context) throws IOException, InterruptedException {
   
			int upFlow = 0;
			int downFlow = 0;
			
			for (Text value : values) {
   
				String[] strs = value.toString().split("\t");
				upFlow += Integer.parseInt(strs[0].toString());
				downFlow += Integer.parseInt(strs[1].toString());
			}
			int sumFlow = upFlow+downFlow;
			
			context.write(key,new Text(upFlow+"\t"+downFlow+"\t"+sumFlow));
		}
	}

二、自定义一个实现Writable接口的可序列化的对象Flow,包含数据形式如 upFlow downFlow sumFlow

public static class FlowWritableMapper extends Mapper<Object, Text, Text, FlowWritable> {
   
		public void map(Object key,Text value,Context context) throws IOException, InterruptedException {
   
			String[] strs = value.toString().split("\t");
			Text phone = new Text(strs[0]);
			FlowWritable flow = new FlowWritable(Integer.parseInt(strs[1]),Integer.parseInt(strs[2]));
			context.write(phone, flow);
		}
	}
	public static class FlowWritableReducer extends Reducer<Text, FlowWritable, Text, FlowWritable>{
   
		public void reduce(Text key,Iterable<FlowWritable> values,Context context) throws IOException, InterruptedException {
   
			int upFlow = 0;
			int downFlow = 0;
			
			for (FlowWritable value : values) {
   
				upFlow += value.getUpFlow();
				downFlow += value.getDownFlow();
			}
			
			context.write(key,new FlowWritable(upFlow,downFlow));
		}
	}
	
	public static class FlowWritable implements Writable{
   
		private int upFlow,downFlow,sumFlow;

		public FlowWritable(int upFlow,int downFlow) {
   
			this.upFlow = upFlow;
			this.downFlow = downFlow;
			this.sumFlow = upFlow+downFlow;
		}
		
		public int getDownFlow() {
   
			return downFlow;
		}

		public void setDownFlow(int downFlow) {
   
			this.downFlow = downFlow;
		}

		public int getUpFlow() {
   
			return upFlow;
		}

		public void setUpFlow(int upFlow) {
   
			this.upFlow = upFlow;
		}

		public int getSumFlow() {
   
			return sumFlow;
		}

		public void setSumFlow(int sumFlow) {
   
			this.sumFlow = sumFlow;
		}
		
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值