`
snake_hand
  • 浏览: 575758 次
社区版块
存档分类
最新评论

Hadoop小程序

 
阅读更多

有一批电话通信清单,保存了主叫和被叫的记录,记录格式下,主叫和被叫之间是以空格隔开的。

13400001111 10086
13500002222 10000
13600003333 114
13700004444 12580
13711111111 10086
13822222222 12580
13922225555 12580
18622220000 114
18800000000 114

现在需要做一个倒排索引,记录拨打给被叫的所有主叫号码,记录的格式如下,主叫号码之间以|分隔。

10000    13500002222|
10086    13400001111|13711111111|
114    13600003333|18622220000|18800000000|
12580    13700004444|13822222222|13922225555|

 

1、算法思路

源文件——》Mapper(分隔原始数据,以被叫作为key,以主叫作为value)——》Reducer(把拥有相同被叫的主叫号码用|分隔汇总)——》输出到HDFS

2、Hadoop程序

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;





public class App_2 extends Configured implements Tool{
    
    @Override
    public int run(String[] arg0) throws Exception {
        Configuration conf = getConf();
        Job job = new Job(conf,"App_2");
        job.setJarByClass(App_2.class);
        FileInputFormat.addInputPath(job, new Path(arg0[0]));
        FileOutputFormat.setOutputPath(job, new Path(arg0[1]));
        
        job.setMapperClass(CallMapper.class);
        job.setReducerClass(CallReducer.class);
        
        job.setOutputFormatClass(TextOutputFormat.class);
        
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(Text.class);
        job.waitForCompletion(true);
        return job.isSuccessful()?0:1;
    }
    
    
    enum Counter{
        SKIPLINE,//记录出错的行数
    }
    
    /**
     *Mapper<LongWritable,Text,Text,Text>
     *LongWritable,Text 是输入数据的key和value  如:清单的每一行的首字符的偏移量作为key,整一行的内容作为value
     *Text,Text    是输出数据的key和value
     *
     */
    public static class CallMapper extends Mapper<LongWritable,Text,Text,Text> {
        
        //map(LongWritable key,Text value,Context context)
        //LongWritable key,Text value,和CallMapper类的输入数据的key、value对应
        //Context 上下文环境
        public void map(LongWritable key,Text value,Context context) throws IOException, InterruptedException {
            try {
                String line = value.toString();
                String[] call = line.split(" ");
                String caller = call[0];//主叫
                String callee = call[1];//被叫
                
                Text outKey = new Text(callee);
                Text outValue = new Text(caller);
                
                context.write(outKey, outValue);//被叫作为key,主叫作为value输出
            } catch(ArrayIndexOutOfBoundsException e) {
                context.getCounter(Counter.SKIPLINE).increment(1);//出错,行数+1
                return;
            }
            
        }
    }
    
    /**
     *Reducer<Text,Text,Text,Text>
     *Text,Text,是输入数据的key和value,对应Mapper中的输出数据
     *Text,Text    是最终输出数据的key和value
     *
     */
    public static class CallReducer extends Reducer<Text,Text,Text,Text>{
        
        //reduce(Text key,Text value,Context context)
        //Text key,Iterable<Text> values,和CallMapper类的输出数据的key、value对应,其中values是对应key的所有主叫的集合
        //Context 上下文环境
        public void reduce(Text key,Iterable<Text> values,Context context) throws IOException, InterruptedException {
            String result = "";
            String temp = "";
            //对主叫用|分隔
            for(Text value : values) {
                temp = value.toString();
                result += (temp + "|");
            }
            
            Text outValue = new Text(result);
            //最终输出:被叫    用|分隔的主叫
            context.write(key, outValue);
        }
    }
    
    public static void main(String[] args) throws Exception{
        int res = ToolRunner.run(new Configuration(), new App_2(), args);
        System.exit(res);
        
    }
    
}

 

3、可以在eclipse中运行程序,输入两个参数,一个是通话清单文件所在路径,一个是结果输出目录

4、也可以将程序打成jar包,用命令执行。

[coder@h1 hadoop-0.20.2]$ bin/hadoop jar /home/coder/call.jar /user/coder/in/call.txt /user/coder/output

注意:/user/coder/in/call.txt 和/user/coder/output都是HDFS中的路径

 

 

分享到:
评论

相关推荐

    hadoop初级程序源代码

    这是关于hadoop里面程序代码,有wordcount ,partition,onejoin, score,health,dedup,程序. 有.java,也有jar. 提示必须先装上hadoop才能运行

    Hadoop示例程序合并文件

    Hadoop示例程序1把多个文件合并,有助于理解分布式文件系统

    Hadoop应用程序

    Hadoop的小程序,看代码比较方便,如果要运行,那么需要加很多jar build path,这些jar包大部分都是hadoop的jar。

    Hadoop源码分析(完整版)

    Hadoop源码分析(完整版),详细分析了Hadoop源码程序,为学习Hadoop的人提供很好的入门指导

    【推荐】大数据时代,你不得不知的Hadoop使用技巧

    Hadoop是大数据时代不可或缺的一个分布式系统基础架构,用户可以轻松地在Hadoop上开发和运行处理海量数据的应用程序。那么对于初学者来说怎么能够更快的掌握Hadoop的使用技巧呢?本电子书汇聚了业界知名专家撰写的...

    基于hadoop的网盘程序

    这是在自学的时候,当时所想到而写出来的小东西,功能是能把文件上传到hdfs上,并且能够下载下来.只有源码,hadoop环境要自己配置

    基于Hadoop平台的-并行特征匹配算法-研究

    在Hadoop 平台下,基于MapReduce 并行编程模型 来实现大数据高效的病毒扫描,特别是针对Hadoop 处理海量小文件效率低的问题,通

    Hadoop实战中文版

    1.5.2 相同程序在MapReduce中的扩展 1.6 用Hadoop统计单词——运行第一个程序 1.7 Hadoop历史 1.8 小结 1.9 资源 第2章 初识Hadoop 2.1 Hadoop 的构造模块显示全部信息第一部分 Hadoop——一种分布式编程框架...

    hadoop-3.3.6.tar.gz - hadoop 3.3.6 安装包

    Hadoop 是一个由 Apache 基金会所开发的分布式系统基础架构,用户可以在不了解分布式底层细节的情况下,开发分布式程序。适用于用户进行大数据处理和存储的需求。下载后请按照官方文档进行安装和配置。

    Hadoop从入门到上手企业开发

    近百节课视频详细讲解,需要的小伙伴自行百度网盘下载,链接见附件,永久有效。 课程目录 000 上课方式和课程大纲介绍 001 Linux系统基本知识说明和启动Linux虚拟机 002 配置虚拟机IP地址和如何使用远程工具...

    使用hadoop实现WordCount实验报告.docx

    使用hadoop实现WordCount详细实验报告,配有环境变量配置截图以及实验运行及结果详细过程描述与截图

    Hadoop集群搭建部署与MapReduce程序关键点个性化开发.doc

    并通过Eclipse进行MapReduce程序的开发,步骤详细完整,在相关过程中配有完整代码和解释,全程无误,只需复制粘贴即可,小白新手按步骤一步一步来也能搭建Hadoop集群成功并进行MapReduce程序开发!!!喜欢请关注...

    基于Hadoop Hive健身馆可视化分析平台项目源码+数据库文件.zip

    环境启动 hadoop hive2元数据库 sql导入 导入hivesql脚本,修改application.yml 启动主程序 HadoopApplication 基于Hadoop Hive健身馆可视化分析平台项目源码+数据库文件.zip启动方式 环境启动 hadoop hive2元数据库...

    Hadoop大数据开发实战-教学大纲.pdf

    二、 课程的任务 通过本课程的学习,使学生学会搭建Hadoop完全分布式集群,掌握HDFS的原理和基础操作,掌握MapReduce原理架构、MapReduce程序的编写。为将来从事大数据挖掘研究工作以及后续课程的学习奠定基础。

    hadoop-0.1.0

    而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了(relax)POSIX的要求,可以以流的形式访问(streaming access)文件系统中的数据。

    Java-API-Operate-Hadoop.rar_hadoop_hadoop api

    Java语言对Hadoop的操作的简单小程序

    Hadoop完全分布式配置.txt

    伪分布模式 Hadoop守护进程运行在本地机器上,模拟一个小规模的的集群。可以使用HDFS和MapReduce。 c. 完全分布模式 Hadoop守护进程运行在一个集群上。启动所有的守护进程,具有hadoop完整的功能,可以使用HDFS、...

    Hadoop实战中文版.PDF

    71.5.2 相同程序在MapReduce中的扩展 91.6 用Hadoop统计单词——运行第一个程序 111.7 Hadoop历史 151.8 小结 161.9 资源 16第2章 初识Hadoop 172.1 Hadoop的构造模块 172.1.1 NameNode 172.1.2 ...

    操作系统课设——Hadoop文件系统

    首先运行Hadoop_Server.exe服务器端程序: 使其处于待连接状态; 接下来启动Cloud服务, 点击Cloud按钮, 将弹出Hadoop_Client对话框, 4·点击Send按钮, 选择文件上传 当服务器完成对文件的分解加密处理后...

    论文研究-Hadoop中处理小文件的四种方法的性能分析.pdf

    为了比较在相同的Hadoop分布式环境下这四种技术处理大量小文件时的性能,选用了典型的数据集,利用词频统计程序,来比较四种小文件处理技术的性能差异。实验研究表明,在不同需求下处理大量小文件的时候,选用适当的...

Global site tag (gtag.js) - Google Analytics