MapReduce初级编程实践:编程实现文件合并和去重操作

实验环境:

操作系统:Linux(Centos7);  

Xsell 7

Hadoop版本:3.4.0(这里的版本根据自己的修改,可能小部分版本的Hadoop不适用于本文实验)

对于两个输入文件,即文件A和文件B,请编写MapReduce程序,对两个文件进行合并,并剔除其中重复的内容,得到一个新的输出文件C。下面是输入文件和输出文件的一个样例供参考。

输入文件A的样例如下:

20170101     x

20170102     y

20170103     x

20170104     y

20170105     z

20170106     x

输入文件B的样例如下:

20170101      y

20170102      y

20170103      x

20170104      z

20170105      y

根据输入文件A和B合并得到的输出文件C的样例如下:

20170101      x

20170101      y

20170102      y

20170103      x

20170104      y

20170104      z

20170105      y

20170105      z

20170106      x

具体步骤:

1、首先启动hadoop

start-all.sh

2、新建文件夹以及相应的文件A.txt和B.txt

mkdir MapReduce

 进入该文件夹

cd MapReduce

创建文件并存储

vi A.txt

 输入数据:

20170101     x

20170102     y

20170103     x

20170104     y

20170105     z

20170106     x

vi B.txt

输入数据:

20170101      y

20170102      y

20170103      x

20170104      z

20170105      y

(切记要保存后退出!!!)

3、然后编码JAVA文件

vi MapReduce1.java

编写内容如下:(记得修改连接) 

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;
import org.apache.hadoop.util.GenericOptionsParser;
public class MapReduce1 {
	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(""));
		}
	}
	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{
		Configuration conf = new Configuration();
conf.set("fs.default.name","hdfs://hadoop01:9000");//这里的hadoop01:9000根据自己的去修改
		String[] otherArgs = new String[]{"input","output"}; 
		if (otherArgs.length != 2) {
			System.err.println("Usage: wordcount <in><out>");
			System.exit(2);
			}
		Job job = Job.getInstance(conf,"Merge and duplicate removal");
		job.setJarByClass(MapReduce1.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]));
		System.exit(job.waitForCompletion(true) ? 0 : 1);
	}
}

4、赋予权限

sudo chown -R root MapReduce

这里的root为用户名,可以更改为你使用的用户名,后面的MapReduce则是存放文件的文件夹。

(为后面的创建目录做准备)

5、 配置环境

//进入所修改的目标
vim ~/.bashrc
//所需要添加的内容
export HADOOP_HOME=/export/servers/hadoop  //这里的路径改为你的hadoop安装目录即可
export CLASSPATH=$($HADOOP_HOME/bin/hadoop classpath):$CLASSPATH  
//使更改生效
source ~/.bashrc

 6、编译

(此时仍然在创建的MapReduce文件夹中)

javac MapReduce1.java

7、打包为jar包

jar -cvf MapReduce1.jar *.class

8、输入与输出

创建目录(需要与前面赋予权限的用户名相同,我前面是root,所以这里也是root)

这里我还在MapReduce文件夹中,所以用的这个,你也可以直接转到hadoop的bin目录下使用hdfs指令来完成。

/export/servers/hadoop/bin/hdfs dfs -mkdir -p /user/root

先删除原来的input和output文件夹(如果原本没有可以跳过) 

注意:一开始一定要没有,否则影响实验运行,导致最后生成jar包失败,即output文件夹内容错误或没有变化。

/export/servers/hadoop/bin/hdfs dfs -rm input/*
/export/servers/hadoop/bin/hdfs dfs -rm -r output

创建input文件夹

/export/servers/hadoop/bin/hdfs dfs -mkdir input

上传输入文件

/export/servers/hadoop/bin/hdfs dfs -put ./A.txt input
/export/servers/hadoop/bin/hdfs dfs -put ./B.txt input

使用生成的jar包

/export/servers/hadoop/bin/hadoop jar MapReduce1.jar MapReduce1

 查看输出

/export/servers/hadoop/bin/hdfs dfs -cat output/*

 成功输出:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值