本博客属原创文章,转载请注明出处:http://guoyunsky.iteye.com/blog/1233714
请先阅读:
1.Hadoop MapReduce 学习笔记(一) 序言和准备
下一篇: Hadoop MapReduce 学习笔记(三) MapReduce实现类似SQL的SELECT MAX(ID)
然后是两个测试子类,主要区别在于生成不同的测试数据.我想有一个又浅入深的过程,比如我们一开始接触的MapReduce是WordCount,统计单个单词的个数.这里单词只是一列,相对数据库来说单词表只有一个单词字段.而实际中可能会有多列数据.如用户表:ID INT,USER_NAME VARCHAR(32),AGE INT.所以我引入了两个子类,从简单到复杂.
1.类似上面的单词表测试类,只有一个字段.
package com.guoyun.hadoop.mapreduce.study; import java.io.File; import java.io.FileWriter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * 单列数据的mapreduce测试,类似表 * CREATE TABLE TABLE_NAME( * ID INT; * ) * 有不同的子类去实现不同的功能,如求最大最小值,排序等 */ public class MyMapReduceSIngleColumnTest extends MyMapReduceTest{ public static final Logger log=LoggerFactory.getLogger(MyMapReduceSIngleColumnTest.class); public MyMapReduceSIngleColumnTest(long dataLength, String inputPath, String outputPath) throws Exception { super(dataLength, inputPath, outputPath); // TODO Auto-generated constructor stub } public MyMapReduceSIngleColumnTest(long dataLength) throws Exception { super(dataLength); // TODO Auto-generated constructor stub } public MyMapReduceSIngleColumnTest(String inputPath, String outputPath) { super(inputPath, outputPath); // TODO Auto-generated constructor stub } public MyMapReduceSIngleColumnTest(String outputPath) { super(outputPath); // TODO Auto-generated constructor stub } protected void generateDatas(long length) throws Exception{ FileWriter fw=null; File file=null; long generateValue=0; file=new File(inputPath); if(!file.getParentFile().exists()){ if(!file.getParentFile().mkdirs()){ throw new Exception("generate datas error,can not create dir:"+file.getParentFile().getAbsolutePath()); } } try { fw=new FileWriter(file); for(int i=0;i<length;i++){ generateValue=(long)(Math.random()*length)+1; if(generateValue>this.maxValue){ this.maxValue=generateValue; }else if(generateValue<this.minValue){ this.minValue=generateValue; } fw.write(generateValue+NEW_LINE); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ if(fw!=null){ fw.flush(); fw.close(); } } } }
2.类似上面的用户表,有多列数据,但我这里生成的只是两列,你可以下载自己做修改
package com.guoyun.hadoop.mapreduce.study; import java.io.DataInput; import java.io.DataOutput; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.io.WritableComparable; import org.apache.hadoop.mapreduce.Mapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * 针对一行有多列数据的MapReduce test * 类似Table: * CREATE TABLE TABLE_NAME( * ID INT, * NAME VARCHAR(32), * ... * ) * 由不同的子类实现不同的功能,如求ID的最大最小值,对ID排序等 */ public class MyMapReduceMultiColumnTest extends MyMapReduceTest { public static final Logger log=LoggerFactory.getLogger(MyMapReduceTest.class); public static final String DEFAULT_INPUT_PATH="testDatas/mapreduce/MRInput_MultiColumn"; public static final String DEFAULT_OUTPUT_PATH="testDatas/mapreduce/MRInput_MultiColumn"; public static final String SPLIT_TAB="\t"; private static final List<String> frameworkNames=new ArrayList<String>(); static{ frameworkNames.add("Hadoop"); frameworkNames.add("Hbase"); frameworkNames.add("Pig"); frameworkNames.add("Zookeeper"); frameworkNames.add("Chuwka"); frameworkNames.add("Avro"); frameworkNames.add("Sqoop"); frameworkNames.add("Cassandra"); frameworkNames.add("Hive"); frameworkNames.add("Mahout"); frameworkNames.add("Nutch"); frameworkNames.add("Lucene"); frameworkNames.add("Solr"); frameworkNames.add("Heritrix"); frameworkNames.add("Netty"); frameworkNames.add("Tomcat"); frameworkNames.add("Thrift"); frameworkNames.add("Ant"); frameworkNames.add("Log4j"); frameworkNames.add("CouchDB"); frameworkNames.add("Maven"); frameworkNames.add("Mina"); frameworkNames.add("OpenJPA"); frameworkNames.add("POI"); frameworkNames.add("Struts"); frameworkNames.add("Spring"); frameworkNames.add("Subversion"); frameworkNames.add("Tika"); } public MyMapReduceMultiColumnTest(long dataLength) throws Exception { super(dataLength); // TODO Auto-generated constructor stub } public MyMapReduceMultiColumnTest(String outputPath) throws Exception { super(outputPath); // TODO Auto-generated constructor stub } public MyMapReduceMultiColumnTest(String inputPath, String outputPath) { super(inputPath, outputPath); } public MyMapReduceMultiColumnTest(long dataLength, String inputPath, String outputPath) throws Exception { super(dataLength, inputPath, outputPath); } @Override protected void generateDatas(long length) throws Exception { FileWriter fw=null; File file=null; long generateValue=0; file=new File(inputPath); if(!file.getParentFile().exists()){ if(!file.getParentFile().mkdirs()){ throw new Exception("generate datas error,can not create dir:"+file.getParentFile().getAbsolutePath()); } } try { fw=new FileWriter(file); for(int i=0;i<length;i++){ generateValue=(long)(Math.random()*length)+1; if(generateValue>this.maxValue){ this.maxValue=generateValue; }else if(generateValue<this.minValue){ this.minValue=generateValue; } fw.write(this.generateFrameWork()+SPLIT_TAB+generateValue+NEW_LINE); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ if(fw!=null){ fw.flush(); fw.close(); } } } private String generateFrameWork(){ int index=(int)(Math.random()*frameworkNames.size()); return frameworkNames.get(index); } public static class MultiColumnWritable implements WritableComparable{ private String frameworkName=""; private long number=-1; public String getFrameworkName() { return frameworkName; } public void setFrameworkName(String frameworkName) { this.frameworkName = frameworkName; } public long getNumber() { return number; } public void setNumber(long number) { this.number = number; } public MultiColumnWritable() { super(); } public MultiColumnWritable(String frameworkName, long number) { super(); this.frameworkName = frameworkName; this.number = number; } @Override public int compareTo(Object obj) { int result=-1; if(obj instanceof MultiColumnWritable){ MultiColumnWritable mcw=(MultiColumnWritable)obj; if(mcw.getNumber()<this.getNumber()){ result =1; }else if(mcw.getNumber()==this.getNumber()){ result=0; } } return result; } @Override public void readFields(DataInput in) throws IOException { frameworkName=in.readUTF(); number=in.readLong(); } @Override public void write(DataOutput out) throws IOException { out.writeUTF(frameworkName); out.writeLong(number); } @Override public String toString() { return frameworkName+"\t"+number; } public static MultiColumnWritable copy(MultiColumnWritable obj){ return new MultiColumnWritable(obj.getFrameworkName(),obj.getNumber()); } } /** * Map,to get the source datas */ protected static class MultiSupMapper extends Mapper<LongWritable,Text,Text,MultiColumnWritable>{ private final Text writeKey=new Text("K"); private MultiColumnWritable writeValue=new MultiColumnWritable(); @Override protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { log.debug("begin to map"); String[] split=null; try { split=value.toString().split("\\t"); if(split!=null&&split.length==2){ writeValue.setFrameworkName(split[0].trim()); writeValue.setNumber(Long.parseLong(split[1].trim())); } } catch (NumberFormatException e) { log.error("map error:"+e.getMessage()); } context.write(writeKey, writeValue); } } public static void main(String[] args) throws Exception{ MyMapReduceTest test=new MyMapReduceMultiColumnTest(1000); } }
更多技术文章、感悟、分享、勾搭,请用微信扫描:
相关推荐
【标题】Hadoop MapReduce 实现 WordCount ...通过理解和实践 Hadoop MapReduce 的 WordCount 示例,开发者可以快速掌握 MapReduce 的基本工作原理,为进一步学习和应用大数据处理技术打下坚实基础。
本篇文章将详细讲解如何利用Hadoop MapReduce实现TF-IDF(Term Frequency-Inverse Document Frequency)算法,这是一种在信息检索和文本挖掘中用于评估一个词在文档中的重要性的统计方法。 首先,我们要理解TF-IDF...
Hadoop的核心组件包括HDFS(Hadoop Distributed File System)和MapReduce,这两个组件共同为大数据处理提供了强大的支持。 MapReduce是一种分布式计算模型,由Google提出,Hadoop对其进行了实现。在MapReduce中,...
总之,《Hadoop MapReduce实战手册》全面覆盖了MapReduce的基本概念、工作流程、编程模型以及在大数据处理中的实际应用,是学习和理解大数据处理技术的理想读物。通过深入阅读,读者可以提升在大数据环境下的编程和...
通过本书的学习,读者不仅能掌握MapReduce的基本操作,还能了解到如何通过实践提升Hadoop系统的效率和稳定性。书中提供的源码对于理解MapReduce的工作流程至关重要,读者可以通过实际运行和修改这些代码,加深对概念...
总之,《Hadoop MapReduce v2 Cookbook》第二版深入介绍了Hadoop MapReduce V2的相关技术和实践方法,适合于想要深入了解和掌握Hadoop MapReduce V2的开发者和技术人员阅读。通过本书的学习,读者不仅可以了解Hadoop...
Hadoop MapReduce v2 Cookbook (第二版), Packt Publishing
总之,这个项目旨在展示如何用Python和Hadoop MapReduce解决社交网络中的相似用户分析问题。虽然代码可能不够精致,但它提供了一个起点,让人们了解如何在实际问题中应用这两个工具。对于想要进一步学习大数据处理的...
结论: 本章介绍了 Hadoop MapReduce,同时发现它有以下缺点: ...2、有运行效率问题,MapReduce 需要将中间产生的数据保存到硬盘中,因此会有读写数据延迟问题。 3、不支持实时处理,它原始的设计就是以批处理为主。
而Hadoop MapReduce则是一个分布式计算框架,能够处理和存储海量数据。现在我们详细探讨这两个概念以及它们如何协同工作。 首先,让我们理解Apriori算法的基本原理。Apriori算法由Raghu Ramakrishnan和Gehrke在1994...
Hadoop MapReduce是Apache Hadoop框架的核心组件之一,它设计用于分布式处理大规模数据集,而v2的引入主要是为了解决v1在资源管理和效率上的局限性。 MapReduce的工作原理分为两个主要阶段:Map阶段和Reduce阶段。...
1. 复杂性:Hadoop MapReduce 的编程模型和执行机制相对复杂,需要一定的学习和实践经验。 2. 资源消耗:Hadoop MapReduce 需要大量的计算资源和存储资源,以支持大规模数据处理。 Hadoop MapReduce 是一种功能强大...
2. **日志输出**:MapReduce 提供了详细的日志信息,包括 Map 和 Reduce 任务的执行情况。这些日志通常存储在 `/tmp` 目录下,或者可以通过集群的日志服务器访问。 3. **使用 DebugFlag**:在提交作业时,可以设置 ...
Hadoop MapReduce 编程实战 ...通过了解 MapReduce 编程基础、MapReduce 项目实践、MapReduce 编程模型、Deduplication、MAC 地址统计和计数器的使用,我们可以更好地掌握 Hadoop MapReduce 的编程技术。
在大数据处理领域,Hadoop MapReduce 是一种广泛使用的分布式计算框架,它允许高效地处理海量数据。KMeans 是一种常见的无监督机器学习算法,用于聚类分析,将数据集中的对象按照相似性分组成不同的簇。现在我们来...
一个自己写的Hadoop MapReduce实例源码,网上看到不少网友在学习MapReduce编程,但是除了wordcount范例外实例比较少,故上传自己的一个。包含完整实例源码,编译配置文件,测试数据,可执行jar文件,执行脚本及操作...
2、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考资料学习借鉴。 3、本资源作为“参考资料”如果需要实现其他功能,需要能看懂代码,并且热爱钻研,自行调试。 基于...
Hadoop MapReduce广泛应用于大数据处理领域,如日志分析、网络流量分析、搜索引擎索引构建、机器学习算法训练、推荐系统构建等。它特别适用于那些需要处理PB级数据量的任务,由于其高可扩展性和容错性,能够在大规模...
2、该资源适合计算机相关专业(如计科、人工智能、大数据、数学、电子信息等)正在做课程设计、期末大作业和毕设项目的学生、或者相关技术学习者作为学习资料参考使用。 3、该资源包括全部源码,需要具备一定基础才能...