Hadoop技术原理与应用

Hadoop数据处理        (2020年大二上实训)

一、项目背景

本次实训内容为汽车销售数据统计分析项目。通过这个项目,加深对HDFS分布式文件系统和MapReduce分布式并行计算框架的理解,熟练掌握和应用,并且体验大数据企业实战项目的开发过程,积累实际项目开发的经验。

二、项目开发实战

(一)设计思路分析

1.任务七:

        统计分析不同车型销售数据我们的需求是统计某一个月份各个类型车辆的总销售量,在这里,我们以9月份为例进行统计,那么需要过滤出9月份的汽车总销售数组,然后按照类型分组,最后针对每组中的数据进行统计即可。Map阶段:首先,先写一个Map类继承于Mapper,重写map方法,在Map类下筛选出月份为“9”的月份,在这里用到了equals()方法来比较字符串中的数据是不是为“9”,还有用到了trim()方法去除空的部分,之后用context.write()方法输出key,value值Reduce阶段:之后,写的Reduce类继承于Reducer,重写rduce方法,在Reduce类下计算汽车的销售数量。首先定义一个存放销售总数的数据类型并赋值,然后用for()遍历整个数组进行计算总数,最后将计算的结果输出。Job阶段:创建main函数,new一个Job对象,新建出Job任务,分别设置Job运行的主类,设置Job运行时的Mapper和Reducer,设置Map的中间输出结果,设置Job的输出类型,设置Job处理的输入文件路径和输出文件路径,最后提交Job任务。

2.任务八:

        通过不同类型(品牌)汽车销售情况统计发动机型号和燃料种类若要统计不同品牌车辆的各个发动机型号和燃油种类,那么需要按照品牌、发动机型号和燃油种类进行分组,然后将分组之后的内容输出即可。Map阶段:在Map阶段首先先进行分组,需要按照品牌、发动机型号和燃油种类进行分组,csv表格中的第8列,第13列以及第16列分别表示品牌,发动机型号,燃油种类,先定义一个String类型的数组str[],数组中下标从0开始,所以品牌,发动机型号,燃油种类在数组中分别表示为str[7],str[12],str[15],之后context输出key,value值,即品牌,发动机型号和燃料种类。Reduce阶段:Reduce继承Reducer,重写reduce方法,由于此任务只需要统计不同品牌下发动机型号和燃油种类,不需要计算数量,因此不需要使用到for()以及计算的操作,只需要最后输出key,value时输出的值为一个文本格式的空白文本即可。Job阶段:创建main函数,new一个Job对象,新建出Job任务,分别设置Job运行的主类,设置Job运行时的Mapper和Reducer,设置Map的中间输出结果,设置Job的输出类型,设置Job处理的输入文件路径和输出文件路径,最后提交Job任务。

(二)代码设计编写

注://注释部分为代码解释说明

任务七: 统计分析不同车型销售数据

代码部分如下:

package com.jsnl;
import org.apache.hadoop.io.Text;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
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;
//写一个Map类继承Mapper类
class Map extends Mapper<Object, Text, Text, IntWritable> {
//重写map方法
@Override
protected void map(Object key, Text value,Context context
)
throws IOException, InterruptedException {
//分词操作,写入一个字符串数据并将数据中的各字符串用逗号分隔,(注:数组下标从0开始)
String[] str = value.toString().split(",");
/*if判断字符串非空,以及长度是否为39行
str[1]月,str[7]品牌, equals()
方法用于比较两个字符串的内容是否相等,比如表格第二列数组str
下标为1的字符串为“9”,
trim()去掉字符串首尾的空格*/
if(str != null && str.length == 39 && str[1].trim() != null
&& str[1].equals("9")&&str[7].trim() != null && str[11].trim() !=
null) {
//context输出key,value值,即输出为9月份,汽车品牌以及汽车销售数量的值
context.write(new Text(str[1]+","+str[7]), new
IntWritable(1));
}
}
}
//写一个类继承Reducer类
class Reduce extends Reducer<Text, IntWritable, Text,
IntWritable> {
//重写reduce方法
protected void reduce(Text key, Iterable<IntWritable>
value,Context context)
throws IOException, InterruptedException {
//定义一个int类型的变量sum,用来存放统计数量的值
int sum = 0;
//对IntWritable类型的数组或集合value进行遍历,然后用get()方法获取v的值累
加计算总数sum
for(IntWritable v : value) {
sum+=v.get();
}
//context输出key,value值
context.write(key, new IntWritable(sum));
}
}
//main()方法,启动运行的程序
public class CarSales {
public static void main(String[] args) throws Exception {
//创建job任务
Job job = Job.getInstance(new Configuration());
//指定任务入口
job.setJarByClass(CarSales.class);
//之后会有一个Exception产生,直接抛出
//任务的Mapper和输出
job.setMapperClass(Map.class);
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(IntWritable.class);
//任务的Reducer和输出
job.setReducerClass(Reduce.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class);
//指定任务的输入和输出
FileInputFormat.setInputPaths(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
//执行任务
job.waitForCompletion(true);
}
}

任务八:统计发动机型号和燃料种类

代码部分如下:

package com.jsnl;
import java.io.IOException;
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.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
//Map类继承Mapper类
class Map extends Mapper<Object, Text, Text, IntWritable> {
//重写map方法
protected void map(Object key, Text value, Context context)
throws IOException, InterruptedException {
//分词操作,写入一个字符串数据并将数据中的各字符串用逗号分隔,(注:数组下标从0
开始)
String []str = value.toString().split(",");//str[7]品牌,str[12]发动机型号,str
[15]燃料种类,trim()去掉字符串首尾的空格
if(str!=null&&str.length==39&&str[7].trim()!=null&&str[12].trim()!=null&&str[15].trim()!=null) {
//context输出key,value值,即品牌,发动机型号和燃料种类
context.write(new Text(str[7]+"\t"+str[12]+"\t"+(str[15])), new IntWritable(1));
}
}
}
//Reduce类继承Reducer类
class Recuce extends Reducer<Text, IntWritable, Text, Text> {
//重写reduce方法
protected void reduce(Text key, Iterable<IntWritable>
value,Context context)
throws IOException, InterruptedException {
//context输出key,value值,Text(" ")文本类型的空值
context.write(key, new Text(" "));
}
}
//主类,main()方法,启动运行的程序
public class TypesOfStatistics {
public static void main(String[] args) throws Exception {
//创建job任务
Job job = Job.getInstance(new Configuration());
//设置Job运行的主类
job.setJarByClass(TypesOfStatistics.class);
//任务Mapper和设置Job的输出类型
job.setMapperClass(Map.class);
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(IntWritable.class);
//任务Reduce和设置Job的输出类型
job.setReducerClass(Recuce.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class);
//设置Job处理的输入文件路径和输出文件路径
FileInputFormat.setInputPaths(job,new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
//执行Job任务
job.waitForCompletion(true);
}
}

(三)运行结果展示

任务七: 统计分析不同车型销售数

 

 三、实训感受

        通过为期一周的Hadoop实训,在老师的指导下完成了这 周的实训任务。通过一周的实训学习,大致了解了这个框架,大体 、能够自行编写一个简单的MapReduce程序。 实训第一天,老师给出任务,让我们对汽车销售数据进行统 计分析。第一天的任务是给出一个基本框架,在已有的代码上填 空。之后的第二天第三天以循序渐进的过程,给出的代码越来越 少,需要自己编写的代码越来越多,直到后面不给代码框架,完全自 己编写代码。老师通过指导后让我们以独立思考进行代码编程的 方式,能够提高我们的独立思考能力和编程能力。由于此前的实 验 没有理解透原理,没有深入分析代码含义,于是我开始尝试着分析 了一下map,reduce函数究竟是怎样写成的。此前在大 一学的Java基础知识不牢固以及对mapreduce原理的不够 熟悉,虽然搜索了相关资料,但错误还是难以避免。实验过程中遇 到了许多Java基础语法上的问题,比如类的继承,方法重载,强制 类型转换问题,hadoop中对mapreduce的原理还不够了解 。但最终通过老师指导,还有CSDN 网站以及百度的参考和自己的独立思考,最终都解决了出现的问 题。 因此,通过这次对汽车销售数据统计分析项目,学到了许多 。提高了我对Java代码的编写能力,加深了对Hadoop的相关 组件以及他们的原理的认识,基本了解了HDFS分布式文件系统 和MapReduce分布式并行计算框架,并且能够熟练掌握和应 用,还体验到了大数据企业实战项目的开发过程,积累实际项目开 发的经验。

 

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bug智造

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值