MapReduce实验自定义计数器详细步骤

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文件夹

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值