实验环境:本操作说明适合502机房Vmware和504机房Virtual Box
一 实验准备:
1)启动Hadoop伪分布式1台虚拟机,用XShell远程连接1台虚拟机hadoop,如果连接不成功参考《502机房主机win7系统与Vmare虚拟机Linux系统的网络连接配置操作说明》完成网络连接配置
2)启动Hadoop虚拟机,运行伪分布式Hadoop,依次执行start-dfs.sh和start-yarn.sh,启动分布式文件系统HDFS和资源调度器YARN
3)双击桌面快捷方式Eclipse Java 2019-06启Java集成开发环境Eclipse
二 实验步骤:
1)在win7下用Eclipese创建一个Java Project,Eclipese界面上面的菜单栏中选择File-》New-》JavaProject,在弹出的“New Java Project‘窗口中,输入Project Name项目名称WordCount,然后点击【Finish】按钮
2)鼠标右键点击Eclipese界面左边的WordCount项目,弹出菜单中选择Build Path-》Configure Build Path,在弹出的窗口选择Libraries,点击【Add External Jars】按钮,依次导入以下位置的jar包:
要导入的jar包的位置:
D:\Hadoop生态系统及开发\安装包\hadoop-2.6.0-cdh5.7.0\share\hadoop\common
D:\Hadoop生态系统及开发\安装包\hadoop-2.6.0-cdh5.7.0\share\hadoop\common\lib
D:\Hadoop生态系统及开发\安装包\hadoop-2.6.0-cdh5.7.0\share\hadoop\hdfs
D:\Hadoop生态系统及开发\安装包\hadoop-2.6.0-cdh5.7.0\share\hadoop\hdfs\lib
D:\Hadoop生态系统及开发\安装包\hadoop-2.6.0-cdh5.7.0\share\hadoop\mapreduce2
D:\Hadoop生态系统及开发\安装包\hadoop-2.6.0-cdh5.7.0\share\hadoop\mapreduce2\lib
注意:jar包千万不要一个个导入,学会用快捷键Ctrl+A全选目录中所有Jar包后,点【打开】按钮执行导入
3)再创建WordCount.java源代码文件,展开Eclipese界面左边的WordCount项目,鼠标右键点击项目里面的src目录,弹出菜单中选择New-》Class,在弹出的“New Java Class‘窗口中,输入Java类名WordCount,然后点击【Finish】按钮
4)在WordCount.java源码文件中编写源代码:
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.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import java.io.IOException;
public class WordCount
{
public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException
{
if(args.length != 2 || args == null)
{
System.out.println("please input Path!");
System.exit(0);
}
Configuration configuration = new Configuration();
Job job = Job.getInstance(configuration, WordCount.class.getSimpleName());
// 打jar包
job.setJarByClass(WordCount.class);
// 通过job设置输入/输出格式
job.setInputFormatClass(TextInputFormat.class);
job.setOutputFormatClass(TextOutputFormat.class);
// 设置输入/输出路径
FileInputFormat.setInputPaths(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
// 设置处理Map/Reduce阶段的类
job.setMapperClass(WordMap.class);
job.setReducerClass(WordReduce.class);
// 设置最终输出key/value的类型m
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
// 提交作业
job.waitForCompletion(true);
}
}
class WordMap extends Mapper<Object, Text, Text, IntWritable>
{
protected void map(Object key, Text value, Context context) throws IOException, InterruptedException
{
String[] lines = value.toString().split(" ");
for (String word : lines)
{
// 每个单词出现1次,作为中间结果输出
context.write(new Text(word), new IntWritable(1));
}
}
}
class WordReduce extends Reducer<Text, IntWritable, Text, IntWritable>
{
protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException
{
int sum = 0;
for (IntWritable count : values)
{
sum = sum + count.get();
//context.write(key, new IntWritable(sum));// 输出最终结果,放到这里会导致重复输出
}
context.write(key, new IntWritable(sum));// 输出最终结果
}
}
5)编译并导出Jar包文件WordCount.jar,鼠标右键点击Eclipese界面左边的WordCount项目,弹出菜单中选择Export,在弹出的Export窗口选择Java文件夹中的Jar File,点击【Next】按钮,选择导出Jar File的目标路径,例如可以选择桌面,设置Jar包文件名为WordCount,继续点击【Next】按钮,再继续点击【Next】按钮,最下面的Main Class,【Brows】按钮打开”Select Main Class“,选择WordCount类后点【OK】按钮,最后点【Finish】按钮完成Jar包文件的导出操作。
6)打开XShell菜单中的的Xftp(新建文件传输)操作界面,左边窗口找到WordCount.jar文件的存放位置(例如Win7系统桌面),右边窗口切换到Linux的/root目录,将WordCount.jar包从win7上传到Linux的/root目录
7)运行MapReduce作业:
a)执行cd切换导入/root目录,执行hadoop fs -ls -R / 查看HDFS是否有word.txt文件,如果没有就执行hadoop fs -put word.txt / 把要进行单词统计的文档word.txt上传到HDFS的根目录
b)执行hadoop jar WordCount.jar /word.txt /output 运行WordCount.jar包中的词频统计程序,将会输出word.txt的单词统计结果到/output,输出目录/output不能存在
c)执行 hadoop fs -cat /output/part-r-00000 查看词频统计的结果
参考文章MapReduce Java API编程实验https://blog.csdn.net/qq_35447918/article/details/102717659 继续执行后续的MapReduce程序示例