package org.apache.hadoop.examples;
import java.util.Random;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapred.*;
import org.apache.hadoop.mapred.lib.*;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;
/* 对输入文件按正则表达式查找,把结果写到输出文件上。
查找用到了RegexMapper,LongSumReducer,InverseMapper系统自带的
工具类。这个源代码运行了两个job,一个查找,一个是排序。
Extracts matching regexs from input files and counts them. */
public class Grep extends Configured implements Tool {
private Grep() {} // 单例模式singleton
public int run(String[] args) throws Exception {
if (args.length < 3) {
System.out.println("Grep <inDir> <outDir> <regex> [<group>]");
ToolRunner.printGenericCommandUsage(System.out);
return -1;
}
Path tempDir =
new Path("grep-temp-"+
Integer.toString(new Random().nextInt(Integer.MAX_VALUE)));
JobConf grepJob = new JobConf(getConf(), Grep.class);
try {
grepJob.setJobName("grep-search");
FileInputFormat.setInputPaths(grepJob, args[0]);
grepJob.setMapperClass(RegexMapper.class);//设置系统自带的mapper类来查找
grepJob.set("mapred.mapper.regex", args[2]);
if (args.length == 4)
grepJob.set("mapred.mapper.regex.group", args[3]);
grepJob.setCombinerClass(LongSumReducer.class);//设置系统自带的reducer来做合并
grepJob.setReducerClass(LongSumReducer.class);
//设置系统自带的reducer。
FileOutputFormat.setOutputPath(grepJob, tempDir);
grepJob.setOutputFormat(SequenceFileOutputFormat.class);//设置输出格式是二进制文件
grepJob.setOutputKeyClass(Text.class);//输出的key是Text类型
grepJob.setOutputValueClass(LongWritable.class);//输出的value是long类型
JobClient.runJob(grepJob);
JobConf sortJob = new JobConf(Grep.class);
sortJob.setJobName("grep-sort");
FileInputFormat.setInputPaths(sortJob, tempDir);
sortJob.setInputFormat(SequenceFileInputFormat.class);//设置输入的文件格式二进制文件
sortJob.setMapperClass(InverseMapper.class);//设置自带的排序mapper
sortJob.setNumReduceTasks(1); // write a single file
FileOutputFormat.setOutputPath(sortJob, new Path(args[1]));
sortJob.setOutputKeyComparatorClass // 输出结果是降序排列sort by decreasing freq
(LongWritable.DecreasingComparator.class);
JobClient.runJob(sortJob);
}
finally {
FileSystem.get(grepJob).delete(tempDir, true);
}
return 0;
}
public static void main(String[] args) throws Exception {
int res = ToolRunner.run(new Configuration(), new Grep(), args);
System.exit(res);
}
}
分享到:
相关推荐
在IT行业中,文本源代码是程序开发的基础,它是由程序员...以上是对"操作文本源代码"这一主题的详细解释,涵盖了从编写到管理源代码的多个方面。理解并熟练运用这些知识点,对于提升编程技能和团队协作效率至关重要。
在编译或解释之前,源代码需要被转换成机器可以理解的二进制形式,也就是目标代码(如`.obj`文件)。`.obj`文件是编译过程中的中间产物,包含了编译器处理源代码后的结果,但还不是可执行程序,通常需要链接器将其与...
此外,如果源代码中包含注释,那么这些注释将提供额外的信息,帮助我们理解作者的意图和代码的工作方式。同时,通过分析output.txt,我们可以了解程序运行时的状态,如错误信息、调试信息等。 总之,这个压缩包提供...
在Unix V7中,你可以看到许多至今仍被广泛采用的编程概念和工具,例如shell命令解释器、文本编辑器Vi(Visual Editor)、grep、sed等。这些工具的源代码揭示了它们的工作机制,对于学习软件工程、系统编程和工具设计...
在进行源代码分析时,可以借助一些工具,如`grep`、`make`、`gcc`以及IDE(如Eclipse或Qt Creator的集成开发环境),它们能帮助我们定位、编译和调试代码。同时,阅读Linux内核的官方文档和相关的技术博客也是必不可...
在IT行业中,源代码行数(Lines of Code, LOC)经常被用作衡量软件项目规模的一个指标。在C和C++编程中,由于这两种语言的灵活性和底层特性,计算代码行数并不像统计其他高级语言那样简单。通常,我们需要编写脚本...
该资源的英文版HTML格式教材可能涵盖了上述所有主题,通过学习并实践书中提供的源代码,可以深入理解Unix编程的精髓,提高在这一领域的技能。对于希望从事系统级编程、网络服务开发或对操作系统原理有深入了解的...
在Linux操作系统中,`find`命令是日常工作中非常常用的一个工具,它允许用户根据各种条件在文件系统中查找文件。`FindUtils`源代码包包含了...同时,源代码中的注释和设计决策也是学习软件工程和良好编程实践的好材料。
《Unix V7 操作系统源代码》是一份珍贵的学习资源,对于深入理解操作系统原理和Unix历史具有极高的价值。Unix Version 7(简称V7)是Unix系统发展过程中的一个重要里程碑,它在1979年由AT&T贝尔实验室发布,为后来的...
gg是grep的Go语言源代码它将搜索限制为指定的Go令牌类,例如标识符,程序包名称,数字,注释,关键字等。 由于gg知道要搜索的内容,因此可以进行智能匹配。 例如: 通过值而不是正则表达式搜索数字:使用“ gg v 255...
《莱昂氏UNIX源代码分析》是一本专为深入学习UNIX技术而编写的经典著作,旨在揭示UNIX操作系统的内部机制,让读者能够更好地理解和掌握这一技术。UNIX系统自诞生以来,以其简洁、高效的设计理念,成为了计算机科学...
在本压缩包“Linux系统管理及应用项目式教程shell编程部分的源代码.zip”中,包含的是关于Linux系统管理和shell编程的实践项目源代码。这些源代码是学习者深入理解Linux系统管理和shell脚本编写的重要参考资料。以下...
`metacpan-grep-front-end` 将这两者结合起来,使得用户可以在浏览器中方便地搜索Perl模块中的源代码,而无需在命令行中执行复杂的grep命令。 这个项目的核心在于其前端界面,它使用了现代Web技术来创建一个交互式...
本书的源代码包含了大量示例,旨在帮助读者掌握如何有效地利用Shell进行系统管理和自动化任务处理。UNIX Shell是UNIX系统中的一种命令解释器,它为用户提供了与操作系统交互的界面,同时也是编写脚本和自动化任务的...
在"商业编程-源码-Shell编程源代码 propsheethandler.zip"这个压缩包中,包含的是一个名为"propsheethandler"的Shell脚本项目,可能是用于处理特定业务场景的工具。 Shell脚本的基础元素包括变量、控制结构、函数和...
`grep_oz.tar.gz` 是一个包含开源grep实现源代码的压缩文件。grep是一个在文本文件或标准输入中搜索特定模式的命令行工具,广泛应用于Linux和Unix系统中。这个`grep_oz`版本可能是由某位开发者或者社区贡献者编写的...
在Linux系统中,通过源代码安装Memcached是一个常见的任务,特别是在需要特定版本或者自定义配置的情况下。Memcached是一个高性能、分布式的内存对象缓存系统,它用于存储和检索数据,通常用于减轻数据库负载。以下...
编程语言可以分为编译型语言和解释型语言两种,编译型语言需要编译器将源代码编译成机器代码,而解释型语言需要解释器来执行源代码。 Bash 编程是 shell 编程的一种,包括指令、翻译、程序控制语句等知识点。文件...