实验环境:
操作系统: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(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]));
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/*
成功输出:
标签:bin,job,编程,MapReduce,hadoop,初级,export,apache,import From: https://blog.csdn.net/2201_75467743/article/details/143721756