`
zdk2116
  • 浏览: 10943 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
最近访客 更多访客>>
社区版块
存档分类
最新评论

hadoop 排序汇总

 
阅读更多

    前段时间写过一个利用python收集客户端的日志,并启动hadoop进行离线分析,最后用php展示的log日志分析系统,今天开始重新整理一下,python和php在这里就不提起了,就讲一下hadoop的使用。

    业务需求(部分):要求在一天的日志里,把最热门的url按照访问次数和流量大小排序分别统计出来(每个客户都有自己的域名,可以有多个)。

    log的内容格式:domain(域名) url(请求url) size(请求大小),每个字段以空格隔开。


    实现的部分代码如下:

    我这边做2次mapreduce,第一次,先把访问次数和流量大小合计起来,第二次再给它排序。

    第一遍的map实现伪代码:


         // 将域名和请求url作为key

 key.append(域名).append(分割符).append(请求url);  


         // 将访问次数1和流量做为value

         val.append("1").append(分割符).append(大小);


      第一遍reduce实现伪代码

          String[] datas = value.toString().split(分割符);

          sumTimes += Long.valueOf(datas[0]); // 访问次数

          sumSize += Long.valueOf(datas[1]);    // 流量 

 

     经过这次的mapreduce之后,它的输出是按照域名和请求url来排序的,要想让它按照流量或者访问次数排序,则必须经过第2次mapreduce,我们要自定义排序规则。在做2次mapreduce之前,我们得先做下本地reduce(我们这里是求合计可以先做本地reduce,如果是求平均值就要另想办法),这样可以较大幅度的提高性能(因为是经过合计之后的数据才发到别的节点上去,这样可以较大的减少数据传输和IO次数)。

      本地reduce其实就是一个reduce的一个实现类,实现原理跟第一次的reduce代码几乎一样,只是要注意一点,本地reduce的输入就是第一次reduce的输出,本地reduce的输出就是第2次map的输入。

      第2遍map实现和reduce其实都很简单,关键是一个自定义的排序类,如下:

          public class Sort implements WritableComparable<Sort> {

	private String domain = "";
	private long size = 0;
    
	/**
	 * Set the left and right values.
	 */
	public void set(String domain, String size) {
		this.domain = domain;
		if(size == null || size.trim().equals("")) size = "0";
		this.size = Long.parseLong(size);
	}

	
	public String getDomain() {
		return domain;
	}

	public long getSize() {
		return size;
	}
	
	@Override
	public int hashCode() {
		return this.domain.hashCode() * 157 + (int) this.size;
	}

	@Override
	public boolean equals(Object right) {
		if (right instanceof Sort) {
			Sort r = (Sort) right;
			return r.domain.equals(domain) && r.size == size;
		} else {
			return false;
		}
	}

	@Override
	public int compareTo(Sort o) {
		if (!this.domain.equals(o.domain)) {
			return domain.compareTo(o.domain) < 0 ? -1 : 1;
		} else if (size != o.size) {
			return size < o.size ? 1 : -1;
		} else {
			return 0;
		}
	}

	@Override
	public void readFields(DataInput in) throws IOException {
		this.domain = Text.readString(in);
		this.size = in.readLong() + Long.MIN_VALUE;
		
	}

	@Override
	public void write(DataOutput out) throws IOException {
		
		Text.writeString(out, this.domain);
		out.writeLong(this.size - Long.MIN_VALUE);

	}

}

   第2遍map实现类关键点:

       public class MapSize extends MapReduceBase implements Mapper<LongWritable, Text, Sort, Text> {

    private Sort sizeSort = new Sort();
    
    public void map(LongWritable key, Text value, OutputCollector<Sort, Text> output, Reporter reporter) throws IOException {
  		...
		// 流量
		sizeSort.set(key, 流量或者大小); //我这里省略写法,其实是第一遍分析之后产生2个文件输出分别为流量和访问次数
		output.collect(sizeSort, value);  
    }

}

    第2遍reduce实现关键点:

     public class Reduce extends MapReduceBase implements

Reducer<Sort, Text, NullWritable, Text> {
	private NullWritable n = NullWritable.get();

	public void reduce(Sort key, Iterator<Text> values,
			OutputCollector<NullWritable, Text> output, Reporter reporter)
			throws IOException {

	}
}

 

经过2次mapreduce之后如果setNumReduceTasks设置的个数为1,那这个结果就是我们想要的了,但是hadoop不可能只有一个节点在跑reduce,这个数通常要大一些,所以我们还得设置分区(其实第一遍分析的时候就要设置分区了)。

public class MyPartitioner implements Partitioner<Text, Writable> {	
	@Override
	public int getPartition(Text key, Writable value, int numPartitions) {
                 // 按照流量大小分区自定义分区规则,比方说一共有10台机器,
                 //流量的范围在0-1000000之间
                 // 那么可以这样划分每100000一个分区
                 return Math.abs( 流量大小 / (numPartitions * 100000)+ 1;
	}

	@Override
	public void configure(JobConf arg0) {

	}
}

 

  最后文件的输入名字自己定义一下(每个reduce一个输出文件),按照自己的规则把那些文件合并在一起就得到全局排序的结果了。排版有点乱,调不好,请见谅。

分享到:
评论

相关推荐

    hadoop技术总结

    - Shuffle过程:对Map阶段产生的中间键值对进行排序和分区。 - Reduce函数:接收相同键的中间键值对,进行聚合处理,生成最终结果。 5. **Hadoop优化**: - Reducer数量调整:过多或过少都会影响性能,需要根据...

    hadoop面试题汇总1

    Shuffle 阶段负责数据的排序和分区;Reduce 阶段则将经过 Map 处理的数据聚合,通过 Reduce 函数生成最终结果。 2. Combiner 和 Partitioner:Combiner 是一个本地化的 Reduce,可以在 Map 任务完成后对数据进行...

    细细品味Hadoop_Hadoop集群(第9期)_MapReduce初级案例

    这些中间结果会根据键进行排序,为下一步的Reduce阶段做准备。 Reduce阶段则负责聚合Map阶段生成的中间结果。Reducer接收来自所有Mapper的相同键的数据,并执行聚合操作,例如求和、平均值计算或者连接操作。这使得...

    Hadoop学习总结

    这一步骤通常用于聚合和汇总数据。 **Map-Reduce的过程解析** 1. **Shuffle**:Reducer在处理数据之前,会先进行shuffle阶段,将来自不同Mapper的相同键的数据进行排序和分区。 2. **Reduce**:在排序和分区之后...

    Hadoop the definition guide

    Map阶段进行数据的过滤和排序,而Reduce阶段则对结果进行汇总。 6. 分布式计算:描述中提到了“Scaling Out Map and Reduce”,这说明了Hadoop设计之初就考虑到了如何有效地在分布式环境中扩展Map和Reduce任务。...

    hadoop 入门

    - Reduce阶段:Reducer处理来自Mapper的键值对,执行聚合或汇总操作,产生最终结果。 2. **Hadoop 应用开发** 开发Hadoop应用通常涉及编写MapReduce程序。开发者需要实现`map()`和`reduce()`函数,分别定义数据...

    Hadoop源代码分析

    《Hadoop源代码分析》是一本深入探讨Hadoop核心组件MapReduce的专著。Hadoop是Apache软件基金会的一个开源项目,旨在提供分布式存储和计算框架,以处理和存储大量数据。MapReduce是Hadoop的核心计算模型,它通过将大...

    Hadoop学习时间轴

    - **Reduce阶段**:对Map阶段产生的键值对进行汇总,得到最终结果。 #### 2. Shuffle过程 Shuffle是MapReduce中的一个重要环节,主要包括排序、分区、组合等步骤。具体来说: - **排序**:Map任务完成后,会对输出...

    hadoop权威指南第三版完整版

    在Reduce阶段,来自不同Map任务的结果被汇总处理,最终生成输出结果。 - **Shuffle过程**:在Map阶段结束后到Reduce阶段开始前,有一个称为Shuffle的过程。这个过程中,Map任务的输出被排序和合并,然后发送给对应的...

    Hadoop学习笔记.pdf

    Map阶段对数据进行过滤和排序,而Reduce阶段则对数据进行汇总和合并。这种模型让开发者能够在不考虑底层分布式处理细节的情况下,专注于编写处理逻辑。 Hadoop的可扩展性表现在其能够方便地增加更多的节点,以增强...

    hadoop学习整理的文档

    HBase的表由行和列组成,数据按照行键排序,列族内数据按时间戳排序。 【Hive】: Hive提供了一种基于SQL的查询语言——HQL(Hive Query Language),用于对存储在Hadoop上的大型数据集进行批处理分析。Hive将SQL...

    hadoop开源项目分析

    - **Shuffle阶段**:对Map任务的输出进行排序和合并。 - **Reduce阶段**:对中间结果进行汇总处理。 - **优势**:MapReduce使得处理大规模数据成为可能,同时具有良好的容错能力和水平扩展性。 #### 三、Hadoop...

    hadoop map-reduce turorial

    Map函数将文本文件中的每一行分解为单词,为每个单词创建键值对(&lt;单词,1&gt;),Reduce函数则将相同的单词键值对汇总,计算出每个单词的总频次。 **用法**:用户通过指定输入文件路径和输出目录来启动Map-Reduce作业...

    Hadoop - Hadoop Streaming

    具体来说,Map 任务负责对输入数据进行初步处理,而 Reduce 任务则负责汇总中间结果以产生最终输出。 ### Streaming 命令选项 Hadoop Streaming 提供了一系列命令行选项,用于定制 MapReduce 作业的行为。这包括...

    Hadoop大数据实战手册

    - **数据模型**:以表的形式组织数据,每行拥有一个可排序的主键,每个单元格由行键、列族、列标识符和时间戳共同唯一确定。 - **架构**:包括RegionServer和HMaster等组件,RegionServer负责存储数据,HMaster...

    hadoop打造一个搜索引擎

    5. **结果排序**:介绍如何根据相关性对搜索结果进行排序,可能涉及TF-IDF、PageRank等算法的Hadoop实现。 总之,"hadoop打造一个搜索引擎"这一主题涵盖了大数据处理和信息检索的结合,涉及到Hadoop的分布式存储和...

    hadoop-2.7.6.zip

    2. Shuffle和Sort阶段:Map任务的输出被排序并分区,为Reduce任务做准备。 3. Reduce阶段:Reduce任务聚合Map阶段的结果,进行汇总或计算。 四、Hadoop 2.7.6的关键改进 1. YARN(Yet Another Resource Negotiator...

    Hadoop Share

    Map阶段将输入数据拆分成键值对并进行局部处理,Shuffle阶段负责数据排序和分区,Reduce阶段对Map阶段的结果进行汇总处理。这种并行计算模型能有效利用集群资源,处理大规模数据。 **Hive**: Hive是建立在Hadoop之...

    Hadoop_in_Action.pdf

    Map 阶段负责对数据进行过滤和排序,而 Reduce 阶段则负责汇总数据。 - **YARN**:自Hadoop 2.x 开始引入,作为资源管理系统,负责集群资源的调度和分配。YARN 的出现使得Hadoop 能够运行更多的应用程序类型,而不...

Global site tag (gtag.js) - Google Analytics