MapReduce实现自定义分区的方法-创新互联

简介

在湟中等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供网站设计制作、成都网站设计 网站设计制作按需制作网站,公司网站建设,企业网站建设,成都品牌网站建设,营销型网站建设,外贸网站建设,湟中网站建设费用合理。

mapreduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算。

它通过把对数据集的大规模操作分发给网络上的每个节点实现可靠性,极大地方便了编程人员在不会分布式并行编程的情况下,将自己的程序运行在分布式系统上。

MapReduce自带的分区器是HashPartitioner
原理

先对map输出的key求hash值,再模上reduce task个数,根据结果,决定此输出kv对,被匹配的reduce任务取走。
MapReduce实现自定义分区的方法
自定义分分区需要继承Partitioner,复写getpariton()方法
自定义分区类:
MapReduce实现自定义分区的方法
注意:map的输出是键值对
其中int partitionIndex = dict.get(text.toString())partitionIndex是获取K的值

附:被计算的的文本

Dear Dear Bear Bear River Car Dear Dear  Bear Rive
Dear Dear Bear Bear River Car Dear Dear  Bear Rive

需要在main函数中设置,指定自定义分区类
MapReduce实现自定义分区的方法
自定义分区类:

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Partitioner;
import java.util.HashMap;
public class CustomPartitioner extends Partitioner {
   public static HashMap dict = new HashMap();
   //Text代表着map阶段输出的key,IntWritable代表着输出的值
   static{
     dict.put("Dear", 0);
     dict.put("Bear", 1);
     dict.put("River", 2);
     dict.put("Car", 3);
   }
   public int getPartition(Text text, IntWritable intWritable, int i) {
     //
     int partitionIndex = dict.get(text.toString());
     return partitionIndex;
   }
}

注意:map的输出结果是键值对,int partitionIndex = dict.get(text.toString());中的partitionIndex是map输出键值对中的键的值,也就是K的值。
Maper类:

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

import java.io.IOException;

public class WordCountMap extends Mapper {
   public void map(LongWritable key, Text value, Context context)
       throws IOException, InterruptedException {
     String[] words = value.toString().split("\t");
     for (String word : words) {
       // 每个单词出现1次,作为中间结果输出
       context.write(new Text(word), new IntWritable(1));
     }
   }
}

Reducer类:

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import java.io.IOException;
public class WordCountMap extends Mapper {
   public void map(LongWritable key, Text value, Context context)
       throws IOException, InterruptedException {
     String[] words = value.toString().split("\t");
     for (String word : words) {
       // 每个单词出现1次,作为中间结果输出
       context.write(new Text(word), new IntWritable(1));
     }
   }
}

main函数:

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import java.io.IOException;
public class WordCountMain {
   public static void main(String[] args) throws IOException,
       ClassNotFoundException, InterruptedException {
     if (args.length != 2 || args == null) {
       System.out.println("please input Path!");
       System.exit(0);
     }
     Configuration configuration = new Configuration();
     configuration.set("mapreduce.job.jar","/home/bruce/project/kkbhdp01/target/com.kaikeba.hadoop-1.0-SNAPSHOT.jar");
     Job job = Job.getInstance(configuration, WordCountMain.class.getSimpleName());
     // 打jar包
     job.setJarByClass(WordCountMain.class);
     // 通过job设置输入/输出格式
     //job.setInputFormatClass(TextInputFormat.class);
     //job.setOutputFormatClass(TextOutputFormat.class);
     // 设置输入/输出路径
     FileInputFormat.setInputPaths(job, new Path(args[0]));
     FileOutputFormat.setOutputPath(job, new Path(args[1]));
     // 设置处理Map/Reduce阶段的类
     job.setMapperClass(WordCountMap.class);
     //map combine
     //job.setCombinerClass(WordCountReduce.class);
     job.setReducerClass(WordCountReduce.class);
     //如果map、reduce的输出的kv对类型一致,直接设置reduce的输出的kv对就行;如果不一样,需要分别设置map, reduce的输出的kv类型
     //job.setMapOutputKeyClass(.class)
     // 设置最终输出key/value的类型m
     job.setOutputKeyClass(Text.class);
     job.setOutputValueClass(IntWritable.class);
     job.setPartitionerClass(CustomPartitioner.class);
     job.setNumReduceTasks(4);
     // 提交作业
     job.waitForCompletion(true);

   }
}

main函数参数设置:
MapReduce实现自定义分区的方法

另外有需要云服务器可以了解下创新互联cdcxhl.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


分享文章:MapReduce实现自定义分区的方法-创新互联
标题路径:http://scyanting.com/article/joooc.html