MapReduce实验:计数器
如果有做这个实验的小伙伴希望可以探讨以下这个实验,这些步骤是我自己搞的,流程不知道哪里不对,最后的output没有输出结果,但其他的步骤都没有错误,希望有解答。
实验目的
基于MapReduce思想,编写计数器程序。
实验要求
能够理解MapReduce编程思想,然后会编写MapReduce版本计数器程序,并能执行该程序和分析执行过程。
MapReduce计数器是什么?
计数器是用来记录job的执行进度和状态的。它的作用可以理解为日志。我们可以在程序的某个位置插入计数器,记录数据或者进度的变化情况。
MapReduce计数器能做什么?
MapReduce 计数器(Counter)为我们提供一个窗口,用于观察 MapReduce Job 运行期的各种细节数据。对MapReduce性能调优很有帮助,MapReduce性能优化的评估大部分都是基于这些 Counter 的数值表现出来的。
该实验要求学生自己实现一个计数器,统计输入的无效数据。说明如下:
假如一个文件,规范的格式是3个字段,“\t”作为分隔符,其中有2条异常数据,一条数据是只有2个字段,一条数据是有4个字段。其内容如下所示:
jim 1 28
kate 0 26
tom 1
lily 0 29 22
编写代码统计文档中字段不为3个的异常数据个数。如果字段超过3个视为过长字段,字段少于3个视为过短字段。
实验步骤
1 准备文件
1)打开终端,在本地文件中新建TXT文件
2)进入此文件夹,touch 新建counters.txt文件,gedit 编辑文件
输入以下内容后保存
2 在Eclipse 中创建MapReduce项目
选择“File–>New–>Java Project”菜单,开始创建一个Java工程
注意环境选择 J2SE-1.5
3 为MapReduce项目添加所需要的JAR包
此步骤暂时不写
4完成项目创建点击结束按钮
4编写JAVA代码
在src 下创建包counter
右击src-new-package
包名 counter
创建JAVA类Counters,右击Counters-new-Class
package counter ;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Counter;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;
public class Counters {
public static class MyCounterMap extends Mapper<LongWritable, Text, Text, Text> {
public static Counter ct = null;
protected void map(LongWritable key, Text value,
org.apache.hadoop.mapreduce.Mapper<LongWritable, Text, Text, Text>.Context context)
throws java.io.IOException, InterruptedException {
String arr_value[] = value.toString().split("\t");
if (arr_value.length < 3) {
ct = context.getCounter("ErrorCounter", "toolong"); // ErrorCounter为组名,toolong为组员名
ct.increment(1); // 计数器加一
} else if (arr_value.length>=3) {
ct = context.getCounter("ErrorCounter", "tooshort");
ct.increment(1);
}
}
}
public static void main(String[] args) throws IOException, InterruptedException, ClassNotFoundException {
Configuration conf = new Configuration();
String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
if (otherArgs.length != 2) {
System.err.println("Usage: Counters <in> <out>");
System.exit(2);
}
Job job = new Job(conf, "Counter");
job.setJarByClass(Counters.class);
job.setMapperClass(MyCounterMap.class);
FileInputFormat.addInputPath(job, new Path(otherArgs[0]));
FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
程序运行,会在底部出现 usage:Counters […]
出现此步骤没事,因为没有指定文件
5 导出为JAR包项目
1)进行项目导出,右击Counters -Export- JAVA-Runnable JAR file 选择next
2)浏览路径 选择项目Counters-counter 浏览路径 /usr/local/hadoop/myapp/Counters.jar
后面点击OK就行
6 终端运行JAR包项目
1)打开终端,运行Hadoop
先进入hadoop 目录
开启hadoop
输入jps查看hadoop 是否运行成功,出现以下内容说明运行成功
在启动Hadoop之后,需要首先删除HDFS中与当前Linux用户hadoop对应的input和output目录(即HDFS中的“/user/hadoop/input”和“/user/hadoop/output”目录),这样确保后面程序运行不会出现问题,具体命令如下:
cd /usr/local/hadoop
./bin/hdfs dfs -rm -r input
./bin/hdfs dfs -rm -r output
然后,再在HDFS中新建与当前Linux用户hadoop对应的input目录,即“/user/hadoop/input”目录,具体命令如下:
把之前在Linux本地文件系统中新建的文件counters.txt(假设文件位于“/wd/”目录下,并且里面包含了一些英文语句),上传到HDFS中的“/user/hadoop/input”目录下,命令如下:
如果HDFS中已经存在目录“/user/hadoop/output”,则使用如下命令删除该目录:
cd /usr/local/hadoop
./bin/hdfs dfs -rm -r /user/hadoop/output
在这里插入图片描述
现在,就可以在Linux系统中,使用hadoop jar命令运行程序,命令如下:
显示结果
没有显示结果,不知道哪里不对,希望有大佬看看我的步骤。
如果要开始下一次执行JAR的文件的话需要删除output文件夹