实验5MapReduce初级编程实践(1)——编程实现⽂件合并和去重操作⼀、实验⽬的
1. 通过实验掌握基本的MapReduce编程⽅法;
2. 掌握⽤MapReduce解决⼀些常见的数据处理问题,包括数据去重、数据排序和数据挖掘等。
⼆、实验平台
1. 操作系统:Linux(建议Ubuntu16.04或Ubuntu18.04)
2. Hadoop版本:
3.1.3
三、实验内容
编程实现⽂件合并和去重操作
对于两个输⼊⽂件,即⽂件A和⽂件B,请编写MapReduce程序,对两个⽂件进⾏合并,并剔除其中重复的内容,得到⼀个新的输出⽂件C。下⾯是输⼊⽂件和输出⽂件的⼀个样例供参考。
输⼊⽂件A的样例如下:
20150101 x
20150102 y
20150103 x
20150104 y
20150105 z
20150106 x
输⼊⽂件B的样例如下:
20150101 y
20150102 y
20150103 x
20150104 z
20150105 y
根据输⼊⽂件A和B合并得到的输出⽂件C的样例如下:
20150101 x
20150101 y
20150102 y
20150103 x
20150104 y
20150104 z
20150105 y
20150105 z
20150106 x
四、实验步骤
进⼊ Hadoop 安装⽬录,启动 hadoop:
cd /usr/local/hadoop
sbin/start-dfs.sh
新建⽂件夹,创建⽂件 A、B:
sudo mkdir MapReduce &&cd MapReduce
sudo vim A
sudo vim B
编写 Java ⽂件实现 MapReduce:
sudo vim Merge.java
实现的 Java 代码如下:
import IOException;
import Configuration;
import Path;
import IntWritable;
import Text;
import Job;
import Mapper;
import Reducer;
import FileInputFormat;
import FileOutputFormat;
import GenericOptionsParser;
public class Merge {
/**
* @param args
* 对A,B两个⽂件进⾏合并,并剔除其中重复的内容,得到⼀个新的输出⽂件C
*/
//重载map函数,直接将输⼊中的value复制到输出数据的key上
public static class Map extends Mapper<Object, Text, Text, Text>{
private static Text text =new Text();
public void map(Object key, Text value, Context context)throws IOException,InterruptedException{
text = value;
context.write(text,new Text(""));
}
}
//重载reduce函数,直接将输⼊中的key复制到输出数据的key上
public static class Reduce extends Reducer<Text, Text, Text, Text>{
public void reduce(Text key, Iterable<Text> values, Context context )throws IOException,InterruptedException{  context.write(key,new Text(""));
}
}
public static void main(String[] args)throws Exception{
// TODO Auto-generated method stub
Configuration conf =new Configuration();
conf.set("fs.default.name","hdfs://localhost:9000");
String[] otherArgs =new String[]{"input","output"};/* 直接设置输⼊参数 */
if(otherArgs.length !=2){
}
Job job = Instance(conf,"Merge and duplicate removal");
job.setJarByClass(Merge.class);
job.setMapperClass(Map.class);
job.setCombinerClass(Reduce.class);
job.setReducerClass(Reduce.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class);
FileInputFormat.addInputPath(job,new Path(otherArgs[0]));
FileOutputFormat.setOutputPath(job,new Path(otherArgs[1]));
}
}
hadoop安装详细步骤linux
赋予⽤户相关权限:
sudo chown -R hadoop /usr/local/hadoop
添加编译所需要使⽤的 jar 包:
vim ~/.bashrc
添加下⾯⼀⾏到⽂件的最后:
export HADOOP_HOME=/usr/local/hadoop
export CLASSPATH=$($HADOOP_HOME/bin/hadoop classpath):$CLASSPATH 使更改⽴即⽣效:
source ~/.bashrc
编译 Merge.java:
javac Merge.java
打包⽣成的 class ⽂件为 jar 包:
jar -cvf Merge.jar *.class
创建 Hadoop 主⽬录为 /user/hadoop 并创建 input ⽂件夹:
/usr/local/hadoop/bin/hdfs dfs -mkdir -p /user/hadoop
/usr/local/hadoop/bin/hdfs dfs -mkdir input
若 intput 已存在则删除原有⽂件:
/
usr/local/hadoop/bin/hdfs dfs -rm input/*
上传 A、B ⽂件到 input ⽂件夹中:
/usr/local/hadoop/bin/hdfs dfs -put ./A input
/usr/local/hadoop/bin/hdfs dfs -put ./B input
使⽤之前确保 output ⽂件夹不存在:
/usr/local/hadoop/bin/hdfs dfs -rm -r output
使⽤我们刚⽣成的 Merge.jar 包:
/usr/local/hadoop/bin/hadoop jar Merge.jar Merge
查看输出结果:
/usr/local/hadoop/bin/hdfs dfs -cat output/*
输出如下:
hadoop@fzqs-Laptop:/usr/local/hadoop$ hdfs dfs -cat output/*
20170101 x
20170101 y
20170102 y
20170103 x
20170104 y
20170104 z
20170105 y
20170105 z
20170106 x
hadoop@fzqs-Laptop:/usr/local/hadoop$
此外,有想⽤ Python 写的可以参考我这篇博客:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。