有一批电话通信清单,保存了主叫和被叫的记录,记录格式下,主叫和被叫之间是以空格隔开的。
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里面程序代码,有wordcount ,partition,onejoin, score,health,dedup,程序. 有.java,也有jar. 提示必须先装上hadoop才能运行
Hadoop示例程序1把多个文件合并,有助于理解分布式文件系统
Hadoop的小程序,看代码比较方便,如果要运行,那么需要加很多jar build path,这些jar包大部分都是hadoop的jar。
Hadoop源码分析(完整版),详细分析了Hadoop源码程序,为学习Hadoop的人提供很好的入门指导
Hadoop是大数据时代不可或缺的一个分布式系统基础架构,用户可以轻松地在Hadoop上开发和运行处理海量数据的应用程序。那么对于初学者来说怎么能够更快的掌握Hadoop的使用技巧呢?本电子书汇聚了业界知名专家撰写的...
这是在自学的时候,当时所想到而写出来的小东西,功能是能把文件上传到hdfs上,并且能够下载下来.只有源码,hadoop环境要自己配置
在Hadoop 平台下,基于MapReduce 并行编程模型 来实现大数据高效的病毒扫描,特别是针对Hadoop 处理海量小文件效率低的问题,通
1.5.2 相同程序在MapReduce中的扩展 1.6 用Hadoop统计单词——运行第一个程序 1.7 Hadoop历史 1.8 小结 1.9 资源 第2章 初识Hadoop 2.1 Hadoop 的构造模块显示全部信息第一部分 Hadoop——一种分布式编程框架...
Hadoop 是一个由 Apache 基金会所开发的分布式系统基础架构,用户可以在不了解分布式底层细节的情况下,开发分布式程序。适用于用户进行大数据处理和存储的需求。下载后请按照官方文档进行安装和配置。
近百节课视频详细讲解,需要的小伙伴自行百度网盘下载,链接见附件,永久有效。 课程目录 000 上课方式和课程大纲介绍 001 Linux系统基本知识说明和启动Linux虚拟机 002 配置虚拟机IP地址和如何使用远程工具...
使用hadoop实现WordCount详细实验报告,配有环境变量配置截图以及实验运行及结果详细过程描述与截图
并通过Eclipse进行MapReduce程序的开发,步骤详细完整,在相关过程中配有完整代码和解释,全程无误,只需复制粘贴即可,小白新手按步骤一步一步来也能搭建Hadoop集群成功并进行MapReduce程序开发!!!喜欢请关注...
环境启动 hadoop hive2元数据库 sql导入 导入hivesql脚本,修改application.yml 启动主程序 HadoopApplication 基于Hadoop Hive健身馆可视化分析平台项目源码+数据库文件.zip启动方式 环境启动 hadoop hive2元数据库...
二、 课程的任务 通过本课程的学习,使学生学会搭建Hadoop完全分布式集群,掌握HDFS的原理和基础操作,掌握MapReduce原理架构、MapReduce程序的编写。为将来从事大数据挖掘研究工作以及后续课程的学习奠定基础。
而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了(relax)POSIX的要求,可以以流的形式访问(streaming access)文件系统中的数据。
Java语言对Hadoop的操作的简单小程序
伪分布模式 Hadoop守护进程运行在本地机器上,模拟一个小规模的的集群。可以使用HDFS和MapReduce。 c. 完全分布模式 Hadoop守护进程运行在一个集群上。启动所有的守护进程,具有hadoop完整的功能,可以使用HDFS、...
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_Server.exe服务器端程序: 使其处于待连接状态; 接下来启动Cloud服务, 点击Cloud按钮, 将弹出Hadoop_Client对话框, 4·点击Send按钮, 选择文件上传 当服务器完成对文件的分解加密处理后...
为了比较在相同的Hadoop分布式环境下这四种技术处理大量小文件时的性能,选用了典型的数据集,利用词频统计程序,来比较四种小文件处理技术的性能差异。实验研究表明,在不同需求下处理大量小文件的时候,选用适当的...