热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Hadoop中的MapReduce框架原理、自定义Partitioner步骤、在Job驱动中,设置自定义Partitioner、Partition分区案例

文章目录13.MapReduce框架原理13.3Shuffle机制13.3.2Partition分区13.3.2.3自定义Partitioner步骤13.3.2.3.1自定义类继承


文章目录

  • 13.MapReduce框架原理
    • 13.3Shuffle机制
      • 13.3.2Partition分区
        • 13.3.2.3自定义Partitioner步骤
          • 13.3.2.3.1自定义类继承Partitioner,重写getPartition()方法
          • 13.3.2.3.2在Job驱动中,设置自定义Partitioner
          • 13.3.2.3.3自定义Partition后,要根据自定义Partitioner的逻辑设置相应数量的ReduceTask
        • 13.3.2.4分区总结
        • 13.3.2.5案例分析
      • 13.3.3Partition 分区案例实操
        • 13.3.3.1需求
        • 13.3.3.2需求分析
        • 13.3.3.3 Partition 分区案例演示


13.MapReduce框架原理


13.3Shuffle机制


13.3.2Partition分区


13.3.2.3自定义Partitioner步骤


13.3.2.3.1自定义类继承Partitioner,重写getPartition()方法

public class CustomPartitioner extends Partitioner<Text, FlowBean> {&#64;Overridepublic int getPartition(Text key, FlowBean value, int numPartitions) {// 控制分区代码逻辑… …return partition; }
}

13.3.2.3.2在Job驱动中&#xff0c;设置自定义Partitioner

job.setPartitionerClass(CustomPartitioner.class);

13.3.2.3.3自定义Partition后&#xff0c;要根据自定义Partitioner的逻辑设置相应数量的ReduceTask

job.setNumReduceTasks(5);

13.3.2.4分区总结

&#xff08;1&#xff09;如果ReduceTask的数量> getPartition的结果数&#xff0c;则会多产生几个空的输出文件part-r-000xx&#xff1b;
&#xff08;2&#xff09;如果1 &#xff08;3&#xff09;如 果ReduceTask的数量&#61;1&#xff0c;则不管MapTask端输出多少个分区文件&#xff0c;最终结果都交给这一个ReduceTask&#xff0c;最终也就只会产生一个结果文件 part-r-00000&#xff1b;
&#xff08;4&#xff09;分区号必须从零开始&#xff0c;逐一累加。


13.3.2.5案例分析

例如&#xff1a;假设自定义分区数为5&#xff0c;则
&#xff08;1&#xff09;job.setNumReduceTasks(1); 会正常运行&#xff0c;只不过会产生一个输出文件
&#xff08;2&#xff09;job.setNumReduceTasks(2); 会报错
&#xff08;3&#xff09;job.setNumReduceTasks(6);大于5&#xff0c;程序会正常运行&#xff0c;会产生空文件


13.3.3Partition 分区案例实操


13.3.3.1需求

将统计结果按照手机归属地不同省份输出到不同文件中&#xff08;分区&#xff09;
&#xff08;1&#xff09;输入数据
在这里插入图片描述

1 13736230513 192.196.100.1 www.baidu.com 2481 24681 200
2 13846544121 192.196.100.2 264 0 200
3 13956435636 192.196.100.3 132 1512 200
4 13966251146 192.168.100.1 240 0 404
5 18271575951 192.168.100.2 www.baidu.com 1527 2106 200
6 84188413 192.168.100.3 www.baidu.com 4116 1432 200
7 13590439668 192.168.100.4 1116 954 200
8 15910133277 192.168.100.5 www.hao123.com 3156 2936 200
9 13729199489 192.168.100.6 240 0 200
10 13630577991 192.168.100.7 www.shouhu.com 6960 690 200
11 15043685818 192.168.100.8 www.baidu.com 3659 3538 200
12 15959002129 192.168.100.9 www.baidu.com 1938 180 500
13 13560439638 192.168.100.10 918 4938 200
14 13470253144 192.168.100.11 180 180 200
15 13682846555 192.168.100.12 www.qq.com 1938 2910 200
16 13992314666 192.168.100.13 www.gaga.com 3008 3720 200
17 13509468723 192.168.100.14 www.qinghua.com 7335 110349 404
18 18390173782 192.168.100.15 www.sogou.com 9531 2412 200
19 13975057813 192.168.100.16 www.baidu.com 11058 48243 200
20 13768778790 192.168.100.17 120 120 200
21 13568436656 192.168.100.18 www.alibaba.com 2481 24681 200
22 13568436656 192.168.100.19 1116 954 200

&#xff08;2&#xff09;期望输出数据
手机号 136、137、138、139 开头都分别放到一个独立的 4 个文件中&#xff0c;其他开头的放到一个文件中


13.3.3.2需求分析

1、需求&#xff1a;将统计结果按照手机归属地不同省份输出到不同文件中&#xff08;分区&#xff09;

2、数据输入
13630577991 6960 690
13736230513 2481 24681
13846544121 264 0
13956435636 132 1512
13560439638 918 4938

3、期望数据输出
文件1
文件2
文件3
文件4
文件5

4、增加一个ProvincePartitioner分区
136 分区0
137 分区1
138 分区2
139 分区3
其他 分区4

5、Driver驱动类
//指定自定义数据分区
job.setPartitionerClass ( ProvincePartitioner.class) ;
//同时指定相应数量的reduceTask
job.setNumReduceTasks ( 5);


13.3.3.3 Partition 分区案例演示

在这里插入图片描述创建一个partitioner2的文件夹&#xff0c;将writable里面4个java代码同时复制到partitioner2里面

在这里插入图片描述

在案例writable的基础上&#xff0c;增加一个分区类

package com.summer.mapreduce.partitioner;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Partitioner;public class ProvincePartitioner extends Partitioner<Text, FlowBean> {&#64;Overridepublic int getPartition(Text text, FlowBean flowBean, int numPartitions) {//获取手机号前三位prePhoneString phone &#61; text.toString();String prePhone &#61; phone.substring(0, 3);//定义一个分区号变量partition,根据prePhone设置分区号int partition;if("136".equals(prePhone)){partition &#61; 0;}else if("137".equals(prePhone)){partition &#61; 1;}else if("138".equals(prePhone)){partition &#61; 2;}else if("139".equals(prePhone)){partition &#61; 3;}else {partition &#61; 4;}//最后返回分区号partitionreturn partition;}
}

在这里插入图片描述
在驱动函数中增加自定义数据分区设置和ReduceTask设置

package com.summer.mapreduce.partitioner;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
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 FlowDriver {public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {//1 获取job对象Configuration conf &#61; new Configuration();Job job &#61; Job.getInstance(conf);//2 关联本Driver类job.setJarByClass(FlowDriver.class);//3 关联Mapper和Reducerjob.setMapperClass(FlowMapper.class);job.setReducerClass(FlowReducer.class);//4 设置Map端输出数据的KV类型job.setMapOutputKeyClass(Text.class);job.setMapOutputValueClass(FlowBean.class);//5 设置程序最终输出的KV类型job.setOutputKeyClass(Text.class);job.setOutputValueClass(FlowBean.class);//8 指定自定义分区器job.setPartitionerClass(ProvincePartitioner.class);//9 同时指定相应数量的ReduceTaskjob.setNumReduceTasks(5);//6 设置输入输出路径FileInputFormat.setInputPaths(job, new Path("D:\\inputflow"));FileOutputFormat.setOutputPath(job, new Path("D\\partitionout"));//7 提交Jobboolean b &#61; job.waitForCompletion(true);System.exit(b ? 0 : 1);}
}

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述

运行完后有五个分区&#xff0c;和预想值一样&#xff0c;over&#xff01;


推荐阅读
  • Hadoop MapReduce 实战案例:手机流量使用统计分析
    本文通过一个具体的Hadoop MapReduce案例,详细介绍了如何利用MapReduce框架来统计和分析手机用户的流量使用情况,包括上行和下行流量的计算以及总流量的汇总。 ... [详细]
  • 本文介绍了如何在 MapReduce 作业中使用 SequenceFileOutputFormat 生成 SequenceFile 文件,并详细解释了 SequenceFile 的结构和用途。 ... [详细]
  • 2018-2019学年第六周《Java数据结构与算法》学习总结
    本文总结了2018-2019学年第六周在《Java数据结构与算法》课程中的学习内容,重点介绍了非线性数据结构——树的相关知识及其应用。 ... [详细]
  • 本文详细探讨了JavaScript中的作用域链和闭包机制,解释了它们的工作原理及其在实际编程中的应用。通过具体的代码示例,帮助读者更好地理解和掌握这些概念。 ... [详细]
  • 本文介绍如何使用MFC和ADO技术调用SQL Server中的存储过程,以查询指定小区在特定时间段内的通话统计数据。通过用户界面选择小区ID、开始时间和结束时间,系统将计算并展示小时级的通话量、拥塞率及半速率通话比例。 ... [详细]
  • 实用正则表达式有哪些
    小编给大家分享一下实用正则表达式有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下 ... [详细]
  • 本文介绍如何从字符串中移除大写、小写、特殊、数字和非数字字符,并提供了多种编程语言的实现示例。 ... [详细]
  • 流处理中的计数挑战与解决方案
    本文探讨了在流处理中进行计数的各种技术和挑战,并基于作者在2016年圣何塞举行的Hadoop World大会上的演讲进行了深入分析。文章不仅介绍了传统批处理和Lambda架构的局限性,还详细探讨了流处理架构的优势及其在现代大数据应用中的重要作用。 ... [详细]
  • 本文介绍如何使用 Android 的 Canvas 和 View 组件创建一个简单的绘图板应用程序,支持触摸绘画和保存图片功能。 ... [详细]
  • 本文将探讨Java编程语言中对象和类的核心概念,帮助读者更好地理解和应用面向对象编程的思想。通过实际例子和代码演示,我们将揭示如何在Java中定义、创建和使用对象。 ... [详细]
  • 丽江客栈选择问题
    本文介绍了一道经典的算法题,题目涉及在丽江河边的n家特色客栈中选择住宿方案。两位游客希望住在色调相同的两家客栈,并在晚上选择一家最低消费不超过p元的咖啡店小聚。我们将详细探讨如何计算满足条件的住宿方案总数。 ... [详细]
  • 本文详细探讨了 org.apache.hadoop.ha.HAServiceTarget 类中的 checkFencingConfigured 方法,包括其功能、应用场景及代码示例。通过实际代码片段,帮助开发者更好地理解和使用该方法。 ... [详细]
  • 本文介绍如何通过整合SparkSQL与Hive来构建高效的用户画像环境,提高数据处理速度和查询效率。 ... [详细]
  • 2012年9月12日优酷土豆校园招聘笔试题目解析与备考指南
    2012年9月12日,优酷土豆校园招聘笔试题目解析与备考指南。在选择题部分,有一道题目涉及中国人的血型分布情况,具体为A型30%、B型20%、O型40%、AB型10%。若需确保在随机选取的样本中,至少有一人为B型血的概率不低于90%,则需要选取的最少人数是多少?该问题不仅考察了概率统计的基本知识,还要求考生具备一定的逻辑推理能力。 ... [详细]
  • 如何高效启动大数据应用之旅?
    在前一篇文章中,我探讨了大数据的定义及其与数据挖掘的区别。本文将重点介绍如何高效启动大数据应用项目,涵盖关键步骤和最佳实践,帮助读者快速踏上大数据之旅。 ... [详细]
author-avatar
白露zhang_166
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有