五 数据组织模式 2) 分区模式 代码

简单4个分区。

  1. package com.rocky.mr.partition;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.rocky.util.TimeUtils;
  5. import org.apache.hadoop.conf.Configurable;
  6. import org.apache.hadoop.conf.Configuration;
  7. import org.apache.hadoop.fs.FileSystem;
  8. import org.apache.hadoop.fs.Path;
  9. import org.apache.hadoop.io.IntWritable;
  10. import org.apache.hadoop.io.LongWritable;
  11. import org.apache.hadoop.io.Text;
  12. import org.apache.hadoop.mapreduce.Job;
  13. import org.apache.hadoop.mapreduce.Mapper;
  14. import org.apache.hadoop.mapreduce.Reducer;
  15. import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
  16. import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
  17. import org.apache.hadoop.mapreduce.lib.partition.HashPartitioner;
  18. import java.io.IOException;
  19. import java.net.URI;
  20. import java.net.URISyntaxException;
  21. /**
  22. * Created by Administrator on 2016/4/11.
  23. */
  24. public class MyPartition {
  25. public static final String clazz = "com.spring.aop.StorageManagerStatAspect";
  26. public static final String m_download = "com.systoon.scloud.master.controller.ImageController.download";
  27. public static final String m_upload = "com.systoon.scloud.master.controller.DirectUploadFile.directUploadFile";
  28. /** patrition param */
  29. public static Text word = new Text();
  30. public static Text partitionDownload = new Text("download"); // download 0
  31. public static Text partitionUpload = new Text("upload"); // upload 1
  32. public static Text partitionOther = new Text("others"); // others 2
  33. public static Text partitionCount = new Text("count"); // count 3
  34. public static class PMapper extends Mapper<LongWritable, Text, Text, Text>{
  35. @Override
  36. protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
  37. String line = value.toString();
  38. word.set("1");
  39. context.write(partitionCount, new Text("1"));
  40. if(line.contains(clazz)){
  41. if(line.contains(m_download)){
  42. String tempObject = line.split(clazz)[1];
  43. String tmp = tempObject.substring(1,tempObject.length());
  44. JSONObject jsonObject = JSON.parseObject(tmp);
  45. String method = jsonObject.get("method").toString();
  46. if( method.equals(m_download) ){
  47. context.write(partitionDownload, word);
  48. }
  49. } else if(line.contains(m_upload)) {
  50. String tempObject = line.split(clazz)[1];
  51. String tmp = tempObject.substring(1,tempObject.length());
  52. JSONObject jsonObject = JSON.parseObject(tmp);
  53. String method = jsonObject.get("method").toString();
  54. if( method.equals(m_upload) ){
  55. context.write(partitionUpload, word);
  56. }
  57. } else {
  58. context.write(partitionOther, word);
  59. }
  60. } else {
  61. context.write(partitionOther , word);
  62. }
  63. }
  64. }
  65. public static class PReduce extends Reducer<Text,Text,Text,Text>{
  66. @Override
  67. protected void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
  68. // long count = 0l;
  69. // if(key.toString().equals(partitionCount.toString())){
  70. // for (Text test:values){
  71. // count ++;
  72. // }
  73. // word.set(count+"");
  74. // context.write(key,word);
  75. // } else {
  76. // for (Text test:values){
  77. // context.write(key,test);
  78. // }
  79. // word.set(count+"");
  80. // context.write(key,word);
  81. // }
  82. long count = 0l;
  83. for (Text text:values){
  84. count ++;
  85. }
  86. word.set(count + "");
  87. context.write(key,word);
  88. }
  89. }
  90. public static class CustomizationPartition extends HashPartitioner<Text,Text> implements Configurable {
  91. private Configuration conf = null;
  92. public CustomizationPartition(){
  93. }
  94. @Override
  95. public Configuration getConf() {
  96. return conf;
  97. }
  98. @Override
  99. public void setConf(Configuration conf) {
  100. this.conf = conf;
  101. }
  102. public int getPartition(Text key, Text value, int numReduceTasks){
  103. if(key.toString().equals("download")){
  104. return 0;
  105. } else if(key.toString().equals("upload")){
  106. return 1;
  107. } else if(key.toString().equals("count")){
  108. return 2;
  109. } else {
  110. // key.toString().equals("others")
  111. return 3;
  112. }
  113. }
  114. }
  115. public static void main(String[] args) throws URISyntaxException, IOException, ClassNotFoundException, InterruptedException {
  116. Configuration conf = new Configuration();
  117. String outPath = "/test/mapReduce/partition"+ TimeUtils.getStringDate();
  118. // check
  119. final FileSystem filesystem = FileSystem.get(new URI(outPath), conf);
  120. if(filesystem.exists(new Path(outPath))){
  121. filesystem.delete(new Path(outPath), true);
  122. }
  123. Job job = new Job( conf,"rocky_partition");
  124. job.setJarByClass(MyPartition.class);
  125. job.setPartitionerClass(CustomizationPartition.class);
  126. job.setNumReduceTasks(4);
  127. job.setMapperClass(PMapper.class);
  128. job.setReducerClass(PReduce.class);
  129. job.setOutputKeyClass(Text.class);
  130. job.setOutputValueClass(Text.class);
  131. FileInputFormat.addInputPath(job, new Path("/test/mapReduce/source/statistics.log.2016-03-01"));
  132. // FileInputFormat.addInputPath(job, new Path("/test/mapReduce/source/statistics.log.2016-03-02"));
  133. FileOutputFormat.setOutputPath(job, new Path(outPath));
  134. System.exit(job.waitForCompletion(true)?0:1);// 是否正常退出
  135. }
  136. }

来自为知笔记(Wiz)

时间: 2024-10-03 15:53:34

五 数据组织模式 2) 分区模式 代码的相关文章

云计算设计模式(五)——计算资源整合模式

云计算设计模式(五)--计算资源整合模式 合并多个任务或操作成一个单一的计算单元.这种模式可以提高计算资源的利用率,并降低与云托管的应用程序进行计算处理相关的成本和管理开销. 背景和问题 云应用程序频繁执行各种操作.在某些解决方案也可能是有意义的最初遵循的关注点分离的设计原则,并把这些操作成托管和独立部署(例如,如在微软的Azure云服务,独立Azure网站不同的角色独立计算单元或单独的虚拟机).然而,尽管这种策略可以帮助简化溶液的逻辑设计,部署大量计算单元作为同一应用可以提高运行时的托管成本,

设计模式(五) : 创建型模式--建造者模式

建造者模式的意图是将产品的内部表象和产品的生产过程分割开来. 类图: 示意性代码: package com.javadesignpattern.builder; public interface Builder { public void buildPart1(); public void buildPart2(); public Product retrieveProduct(); } ? 1 2 3 4 5 6 7 package com.javadesignpattern.builder;

云计算设计模式(十五)——管道和过滤器模式

云计算设计模式(十五)——管道和过滤器模式 分解,执行复杂处理成一系列可重复使用分立元件的一个任务.这种模式可以允许执行的处理进行部署和独立缩放任务元素提高性能,可扩展性和可重用性. 背景和问题 一个应用程序可能需要执行各种关于它处理的信息不同复杂的任务.一个简单,但不灵活的方式来实施这个应用程序可以执行此处理为单一模块.然而,这种方法有可能减少用于重构代码,对其进行优化,或者重新使用它,如果是在应用程序中其他地方所需要的相同的处理的部件的机会. 图1通过使用单片式的方式示出了与处理数据的问题.

【读书笔记】设计模式第五章:行为型模式

本文主要分析了模板方法模式.命令模式.责任链模式.策略模式.迭代器模式,介绍它们的定义.优缺点.使用场景,以及实例代码.为了深刻地理解设计模式,最重要的还是动手编写代码. 我参照书中的例程重新构想了一些更加生动.易于理解的例子,希望大家喜欢. 代码可以通过以下链接进行浏览: http://git.oschina.net/caipeichao/java-design-pattern 这些代码都经过编译运行,保证没有错误. 模板方法 定义 定义一个操作中的算法框架,而将一些步骤延迟到子类中 角色:抽

设计模式(十五):Iterator迭代器模式 -- 行为型模式

1.概述 类中的面向对象编程封装应用逻辑.类,就是实例化的对象,每个单独的对象都有一个特定的身份和状态.单独的对象是一种组织代码的有用方法,但通常你会处理一组对象或者集合. 集合不一定是均一的.图形用户界面框架中的 Window 对象可以收集任意数量的控制对象 - Menu.Slider 和 Button.并且,集合的实现可以有多种方式:PHP 数字是一个集合,但也是一个散列表,一个链接列表,一个堆栈以及队列. 例子1:电视遥控器的频道遍历 2.问题 如何操纵任意的对象集合? 如一个列表(Lis

程序的载入和运行(五)——《x86汇编语言:从实模式到保护模式》读书笔记25

程序的载入和运行(五)--<x86汇编语言:从实模式到保护模式>读书笔记25 前面几篇博文最终把代码分析完了.这篇就来说说代码的编译.运行和调试. 1.代码的编译及写入镜像文件 之前我们都是在命令行输入命令进行编译和写入.源文件少的时候还不认为麻烦,当源文件多了,就会认为特别麻烦.有没有简单的方法呢? 当然有,就是用make工具. 1.1.什么是make工具 make是一个命令工具,它解释Makefile中的指令.在Makefile文件里描写叙述了整个project全部文件的编译顺序.编译规则

kafka的分区模式?

当别人问这个问题的时候,别人肯定是想你是否看过源码.是否针对不同场景改过kafka的分区模式 这是别人最想知道的是,你的message如何负载均衡的发送给topic的partition 我们用kafka的时候,可以动态指定partition,也可以不指定partition 当我们动态指定了partition的时候,kafka会将消息发送到指定的partition 如果没有指定partition 这就是关键了, 如何让这些消息,均衡的发送给每个partition 先看看发送消息的方式 kafka首

设计模式(五):PROTOTYPE原型模式 -- 创建型模式

1.定义 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 2.适用场景 原型模式的主要思想是基于现有的对象克隆一个新的对象出来,一般是有对象的内部提供克隆的方法,通过该方法返回一个对象的副本,这种创建对象的方式,相比我们之前说的几类创建型模式还是有区别的,之前的讲述的工厂模式与抽象工厂都是通过工厂封装具体的new操作的过程,返回一个新的对象,有的时候我们通过这样的创建工厂创建对象不值得,特别是以下的几个场景的时候,可能使用原型模式更简单也效率更高. • 1)当一个系统应该独立于

设计模式(五): 装饰者模式

装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能. 我们通过下面的实例来演示装饰器模式的用法.其中,我们将把一个形状装饰上不同的颜色,同时又不改变形状类. 介绍 意图:动态地给一个对象添加一些额外的职责.就增加功能来说,装饰器模式相比生成子类更为灵活. 主要解决:一般的,我们

JS创建对象模式及其对象原型链探究(五):组合使用构造函数模式和原型模式

组合使用构造函数模式和原型模式 构造函数模式用于定义实例属性,原型模式用于定义方法和共享的属性. 创建自定义类型的最常见方式,就是组合使用构造函数模式和原型模式. 1.创建对象 // 组合使用构造函数模式和原型模式 function Person(name, age, job){ this.name = name; this.age = age; this.job = job; this.friend = ["Jenny", "Court"]; } Person.p