博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
单词计数WordCountApp.class
阅读量:5952 次
发布时间:2019-06-19

本文共 3343 字,大约阅读时间需要 11 分钟。

public class WordCountApp {    // 可以指定目录,目录下如果有二级目录的话,是不会执行的,只会执行一级目录.    private static final String INPUT_PATH = "hdfs://hadoop1:9000/abd";// 输入路径    private static final String OUT_PATH = "hdfs://hadoop1:9000/out";// 输出路径,reduce作业输出的结果是一个目录    // _SUCCESS:在linux中,带下划线的这些文件一般都是被忽略不去处理的.表示作业执行成功.    // _logs:产生的日志文件.    // part-r-00000:产生的是我们的输出的文件.开始以part开始.r:reduce输出的结果,map输出的结果是m,00000是序号    public static void main(String[] args) {        Configuration conf = new Configuration();// 配置对象        try {            FileSystem fileSystem = FileSystem.get(new URI(OUT_PATH), conf);            fileSystem.delete(new Path(OUT_PATH), true);            Job job = new Job(conf, WordCountApp.class.getSimpleName());// jobName:作业名称            job.setJarByClass(WordCountApp.class);            FileInputFormat.setInputPaths(job, INPUT_PATH);// 指定数据的输入            job.setMapperClass(MyMapper.class);// 指定自定义map类            job.setMapOutputKeyClass(Text.class);// 指定map输出key的类型            job.setMapOutputValueClass(LongWritable.class);// 指定map输出value的类型            job.setReducerClass(MyReducer.class);// 指定自定义Reduce类            job.setOutputKeyClass(Text.class);// 设置Reduce输出key的类型            job.setOutputValueClass(LongWritable.class);// 设置Reduce输出的value类型            FileOutputFormat.setOutputPath(job, new Path(OUT_PATH));// Reduce输出完之后,就会产生一个最终的输出,指定最终输出的位置            job.waitForCompletion(true);// 提交给jobTracker并等待结束        } catch (Exception e) {            e.printStackTrace();        }    }    /**     * 输入的key标示偏移量:这一行开始的字节. 输入的value:当前的行文本的内容. MapReduce执行过程:     * 在这里边,我们的数据输入来自于原始文件,数据输出写出到hdfs, 中间的一堆都是map输出产生的临时结果.存放在map运行的linux磁盘上的,     * 当经过shuffle时,reduce就会通过http把map端的对应数据给取过来.     * mapred-default.xml中mapredcue.jobtracker     * .root.dir,mapred.tmp.dir存储map产生的结果. 作业运行时产生这个目录,作业运行完之后它会删除目录.     */    public static class MyMapper extends            Mapper
{ // 源文件有两行记录,解析源文件会产生两个键值对.分别是<0,hello you>,<10,hello me>,所以map函数会被调用两次. // 在计算机存储的时候,是一维的结构. @Override protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { // 为什么要把hadoop类型转换为java类型? String line = value.toString(); String[] splited = line.split("\t"); // 使用hashMap写出去的优势:减少键值对出现的个数. Map
hashMap = new HashMap
(); for (String word : splited) { // 在for循环体内,临时变量word出现的此时是常量1 context.write(new Text(word), new LongWritable(1));// 把每个单词出现的次数1写出去. } } } // map函数执行结束后,map输出的
一共有4个.
,
,
,
// map把数据处理完之后,就会进入reduce. // 在进入shuffle之前,数据需要先进行分区.默认只有一个区. // 对每个不同分区中的数据进行排序,分组. // 排序后的结果:
,
,
,
// 分组后的结果(相同key的value放在一个集合中):
,
,
// 规约(可选) // map中的数据分发到reduce的过程称作shuffle public static class MyReducer extends Reducer
{ // 每一组调用一次reduce函数,一共调用了三次 @Override protected void reduce(Text key, Iterable
values, Context context) throws IOException, InterruptedException { // count标示单词key在整个文件出现的次数 // 分组的数量与reduce函数调用次数是相等的. // reduce函数调用次数与产生的
的数量抛开业务,没有任何关系! long count = 0L; for (LongWritable times : values) { count += times.get(); } context.write(key, new LongWritable(count)); } }}

 

转载于:https://www.cnblogs.com/xiaolong1032/p/4443148.html

你可能感兴趣的文章
Ubuntu Sub-process /usr/bin/dpkg
查看>>
详解DNS的常用记录(下):DNS系列之三
查看>>
linux的日志服务器关于屏蔽一些关键字的方法
查看>>
事情的两面性
查看>>
只要会营销,shi都能卖出去?
查看>>
sed单行处理命令奇偶行输出
查看>>
走向DBA[MSSQL篇] 从SQL语句的角度 提高数据库的访问性能
查看>>
VC++深入详解学习笔记1
查看>>
安装配置discuz
查看>>
CentOS7 64位小型操作系统的安装
查看>>
线程互互斥锁
查看>>
KVM虚拟机&openVSwitch杂记(1)
查看>>
win7下ActiveX注册错误0x80040200解决参考
查看>>
《.NET应用架构设计:原则、模式与实践》新书博客--试读-1.1-正确认识软件架构...
查看>>
2013 Linux领域年终盘点
查看>>
linux学习之查看程序端口占用情况
查看>>
相逢在栀枝花开的季节
查看>>
linux下git自动补全命令
查看>>
Ubuntu14.04LTS更新源
查看>>
Linux报“Unknown HZ value! (288) Assume 100”错误
查看>>