MapReduce1,HashCode

MapReduce shuffle过程剖析及调优 MapReduce简介在Hadoop MapReduce中,框架会确保reduce收到的输入数据是根据key排序过的。数据从Mapper输出到Reducer接收,是一个很复杂的过程,框架处理了所有问题,并提供了很多配置项及扩展点。一个MapReduce的大致数据流如下图:更详细的MapReduce介绍参考Hadoop MapReduce原理与实例。Mapper的 阅读详情

Java基本类型

Writable

序列化大小(字节)

布尔型(boolean)

BooleanWritable

1

字节型(byte)

ByteWritable

1

整型(int)

IntWritable

4

VIntWritable

1~5

浮点型(float)

FloatWritable

4

长整型(long)

LongWritable

8

VLongWritable

1~9

双精度浮点型(double)

DoubleWritable

8

 

[root@master ~]# rz -E
rz waiting to receive.
[root@master ~]# ls
ac.sh                                        words.txt  文档
anaconda-ks.cfg                              公共       下载
dump.rdb                                     模板       音乐
initial-setup-ks.cfg                         视频       桌面
mysql57-community-release-el7-10.noarch.rpm  图片
[root@master ~]# cat words.txt
java,c,c++,sql,scale,python
mysql,springboot,redis
hadoop,hive,hbase,spark,flink
kafka,sqoop,flume,datax,kettle,flink
phoenix
mysql,springboot,redis
hadoop,hive,hbase,spark,flink
kafka,sqoop,flume,datax,kettle,flink
phoenix
mysql,springboot,redis
hadoop,hive,hbase,spark,flink
kafka,sqoop,flume,datax,kettle,flink
phoenix
mysql,springboot,redis
hadoop,hive,hbase,spark,flink
kafka,sqoop,flume,datax,kettle,flink
phoenix[root@master ~]# mv words.txt /usr/local/soft/data/
[root@master ~]# cd /usr/local/soft/data/
[root@master data]# ls
new_db.sql  student.sql         theZen.txt  words.txt
score.sql   theZenOfPython.txt  wordcount
[root@master data]# cat words.txt
java,c,c++,sql,scale,python
mysql,springboot,redis
hadoop,hive,hbase,spark,flink
kafka,sqoop,flume,datax,kettle,flink
phoenix
mysql,springboot,redis
hadoop,hive,hbase,spark,flink
kafka,sqoop,flume,datax,kettle,flink
phoenix
mysql,springboot,redis
hadoop,hive,hbase,spark,flink
kafka,sqoop,flume,datax,kettle,flink
phoenix
mysql,springboot,redis
hadoop,hive,hbase,spark,flink
kafka,sqoop,flume,datax,kettle,flink
[root@master data]# hdfs dfs -put words.txt /data/wc/input/
package com.shujia.MapReduce;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

import java.io.IOException;

public class Demo01WordCount {
    //Map任务
    /**
    *继承Mapper类,指定输入的K-V的类型以及输出K-V的类型
     * 然后重写map方法
    */
    public static class MyMapper extends Mapper<LongWritable, Text,Text, IntWritable> {
        @Override
        /**
         * key 偏移量
         * value 一行数据
         * context MR任务运行的是上下文环境,可以获取当前运行的配置等其他信息
         *          主要用于将map端构建好的K-V进行输出
         */
        protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, IntWritable>.Context context) throws IOException, InterruptedException {
           //自己的map逻辑
            //按分割符切分除每一个单词
            String[] splits = value.toString().split(",");
            for (String word : splits) {
                //以单词做为key,1作为value,构建好输出的K-V
                //再通过context输出
                /**
                 * java,c,c++,sql,scale,python
                 * 输出:java,1
                 * c,1
                 * c++,1
                 * sql,1
                 * scale,1
                 * python,1
                 */
                Text outPutKey = new Text(word);
                IntWritable outputValue = new IntWritable(1);
                context.write(outPutKey,outputValue);
            }
        }
    }
    /**
     *继承Reducer类,指定输入的K-V的类型(同map端的输出K-V类型保存一致)以及输出K-V的类型
     * 然后重写map方法
     */
    //Reduce任务
    public static class MyReducer extends Reducer<Text, IntWritable,Text,IntWritable>{
        @Override
        /**
         * key 经过shuffle过程,相同的K进入到同一个reduce
         * values 相同的Key对应的value的一个“集合”
         * context 主要用于输出数据到HDFS
         */
        protected void reduce(Text key, Iterable<IntWritable> values, Reducer<Text, IntWritable, Text, IntWritable>.Context context) throws IOException, InterruptedException {
            int sum=0; //用于保存最后的结果
            for (IntWritable value : values) {
               sum+=value.get();
            }
            //将最后的结果输出
          context.write(key,new IntWritable(sum));
        }
    }
    //Driver程序,主要负责配置和提交任务
    public static void main(String[] args) throws IOException, InterruptedException, ClassNotFoundException {
        Configuration conf = new Configuration();
        conf.set("fs.defaultFS", "hdfs://master:9000");
        //创建一个MapReduce的job
        Job job = Job.getInstance(conf);
        //配置任务
        job.setJobName("Demo01WordCount");
        //设置任务运行哪个类
        job.setJarByClass(Demo01WordCount.class);
        //设置Reduce的数量,默认是1,最终生成文件的数量同Reduce的数量一致
        job.setNumReduceTasks(3);

        //配置map端
        //指定map运行时哪一个类
        job.setMapperClass(MyMapper.class);
        //配置Map端输出的key类型
        job.setMapOutputKeyClass(Text.class);
        //配置Map端输出的value类型
        job.setMapOutputValueClass(IntWritable.class);

        //配置Reduce端
        //指定Reduce运行时哪一个类
        job.setReducerClass(MyReducer.class);
        //配置Reduce端输出的key类型
        job.setOutputKeyClass(Text.class);
        //配置Reduce端输出的value类型
        job.setOutputValueClass(IntWritable.class);

        //配置输入输出路径
        /**
         * hdfs dfs -mkdir /data/wc/input
         * hdfs dfs -put words.txt /data/wc/input
         */
        FileInputFormat.addInputPath(job,new Path("/data/wc/input"));
        Path path = new Path("/data/wc/output");
        FileSystem fs = FileSystem.get(conf);
        //判断输出路径是否存在,存在则删除
        if (fs.exists(path)){
            fs.delete(path,true);
        }
        //输出路径已存在,会报错
        FileOutputFormat.setOutputPath(job,path);

        //等待任务完成
        job.waitForCompletion(true);
    }
    /**
     * 1.将words.txt上传至虚拟机并使用HDFS命令上传至HDFS
     *  hdfs dfs -mkdir /data/wc/input
     *  hdfs dfs -put words.txt /data/wc/input
     *  2.将代码通过maven的package打包成jar包,并上传至虚拟机
     *  3.使用命令提交任务
     *  hadoop jar hadoop-1.0-SNAPSHOT.jar com.shujia.MapReduce.Demo01WordCount
     *  查看日志:在任务运行时会自动生成一个applicationId
     *  yarn logs -applicationId application_1647858149677_0004
     *  也可以通过historyserver去查看,因为任务真正运行在NodeManager中,日志可能会分散
     *  historyserver可以负责从Nodemanager中收集日志到Master中方便查看日志
     *  启动historyserver:在Master上启动即可
     *  mr-jobhistory-daemon.sh start historyserver
     *  http://master:19888
     */
}
[root@master data]# cd ..
[root@master soft]# ls
0??   hadoop-2.7.6  redis        shell01   zookeeper-3.4.6
A??   jdk1.8.0_171  redis-6.2.6  show
data  packages      shell        test.txt
[root@master soft]# mkdir jars
[root@master soft]# mv data/hadoop-1.0-SNAPSHOT.jar ./jars/
[root@master soft]# ls
0??   hadoop-2.7.6  packages     shell    test.txt
A??   jars          redis        shell01  zookeeper-3.4.6
data  jdk1.8.0_171  redis-6.2.6  show
[root@master soft]# cd jars/
[root@master jars]# ls
hadoop-1.0-SNAPSHOT.jar
[root@master jars]# pwd
/usr/local/soft/jars
[root@master jars]# hadoop jar hadoop-1.0-SNAPSHOT.jar com.shujia.MapReduce.Demo01WordCount
[root@master jars]# hdfs dfs -cat /data/wc/output/part-r-00000
c++	1
datax	4
hbase	4
hive	4
kettle	4
mysql	4
spark	4
package com.shujia;

public class HashCode {
    public static void main(String[] args) {
        String k1="spark";
        String k2="c++";
        String k3="datax";
        String k4="hbase";
        String k5="hive";
        String k6="kettle";
        String k7="mysql";
        int numReduceTasks = 3;
        System.out.println(k1.hashCode()%numReduceTasks);
        System.out.println(k2.hashCode()%numReduceTasks);
        System.out.println(k3.hashCode()%numReduceTasks);
        System.out.println(k4.hashCode()%numReduceTasks);
        System.out.println(k5.hashCode()%numReduceTasks);
        System.out.println(k6.hashCode()%numReduceTasks);
        System.out.println(k7.hashCode()%numReduceTasks);
    }
}
[root@master ~]# mr-jobhistory-daemon.sh start historyserver
starting historyserver, logging to /usr/local/soft/hadoop-2.7.6/logs/mapred-root-historyserver-master.out
[root@master ~]# yarn logs -applicationId application_1647858149677_0004

MapReduce实际案例、MapReduce参数、yarn集群 MapReduce实际案例、MapReduce参数、yarn集群MapReduce实际案例GroupingComparator求取top1MapReduce补充概念多job串联mapreduce参数优化资源相关参数容错相关参数效率和稳定性相关参数yarn集群yarn介绍yarn主要组件组件介绍组件作用yarn的架构yarn调度器FIFO Schedulercapacity schedulerFair Scheduler MapReduce实际案例 GroupingComparator求取top1 需求 求 阅读详情

相关推荐

Hadoop中MapReduce基本案例及代码(三)

分区Partitioner 分区操作是shuffle操作中的一个重要过程,作用就是将map的结果按照规则分发到不同reduce中进行处理,从而按照分区得到多个输出结果。 Partitioner是partitioner的基类,如果需要定制partitioner也需要继承该类HashPartitioner是mapreduce的默认partitioner。 计算方法是:which reducer=(key.hashCode() & Integer.MAX_VALUE) % numReduceTasks 注:默认情况下,reduceTask数量为1 很多时候MR自带的分区规则并不能满足我们需求,为了实

MapReduce的二次排序

  这里介绍二次排序的思路整理,并附上具体代码     首先要明确二次排序的基本概念:在我们所之前所熟悉的排序称为一次排序,即只对key进行排序       所以二次排序的概念在原来的基础上便不难理解,即对key进行排序的同时对value进行排序      (1)二次排序非标准版     所谓二排非标准版:即所有的第二次排序过程全部放到Reduce进行操作,将所有相同key传进来的        ...

Griezmann_7的博客 438

易康eCognition9.0分类|规则集和机器学习的方法的面向对象的多尺度分割分类

基于易康eCognition9.0软件的规则集和机器学习的方法的面向对象的多尺度分割分类

weixin_46493028的博客 1万+

MapReduce关于key的定义、hashCode()、equals(Object obj)、compareTo(CustomCombineKey other)

1. mapreduce中自定义mapout、reduceinput的key key需实现WritableComparable&lt;KEY&gt; 接口 1.1 重写下面的三个方法 1.2 重写hashCode()和equals(Object obj) 2. mapreduce何时调用hashCode()、equals(Object obj)、compareTo(CustomComb...

csdnmrliu的博客 800

eDP/DP接口简介

目前,在视频传输协议以及接口领域,外部接口主要是DP与HDMI两分天下,当然之前出现过很多接口-VGA, DVI等等,最新平台基本以这两个为主;笔记本内部接口就基本上使用eDP((Embedded Display Port))作为标准接口来驱动液晶屏了。那么问题来了,eDP和DP,是完全兼容的么?eDP,DP,HDMI,这三种接口的显示器,可以插在同一个接口上使用么?这篇文章,就会从硬件和一部分协议的角度分析一下这三大协议。

weixin_50518899的博客 2万+

了解你的GPU:深入探讨AMD SMI

2024年9月17日 作者:Matt Elliott对于使用AMD硬件的系统管理员和高级用户来说,性能优化和高效的资源监控至关重要。AMD系统管理界面命令行工具`amd-smi`正是为了解决这些需求而设计的。amd-smi是一个多功能的命令行工具,专门用于管理和监控AMD硬件,主要侧重于GPU。作为未来取代`rocm-smi`的工具,`amd-smi`有望成为跨广泛设备的AMD硬件管理的主要工具。

数字人生 4522

hadoop又见hashcode

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34396103的博客 164

电赛2024年H题智能小车基于MSPM0G3507主控MCU(利用8路灰度加上MPU6050的解决方式)

最后我觉得这个项目最重要的部分还是陀螺仪的精准度,如果一个陀螺仪的精准度高,这个项目就十分简单了,像mpu6050这种陀螺仪精准度就稍微差了一点,他有个最严重的问题就是温漂,偏航角会随着温度变化为变化,这一点在跑发挥项一的时候十分关键的,因为这个只差基督就会导致车子跑偏,导致无法完成 整个项目。如果条件足够的话建议可以换一个好一点的陀螺仪,然后就是灰度如果没有条件同样也可以换成红外。以上就是本次项目的一些小建议。

weixin_60991529的博客 6243

MapReduce 默认分区HashPartitioner

简析mapreduce 默认的分区方式 以下就是Hadoop MapReduce中对于默认分区的源码

gjf362的博客 2366

QGIS实用功能:加载天地图与下载指定区域遥感影像

本文聚焦 QGIS 软件实用功能,详细介绍在 QGIS 中加载天地图及其他常用底图(如 Google Maps、Bing Maps)的完整流程,涵盖天地图插件安装、密钥获取与配置、插件拓展使用等操作。同时,以 上海市瑞金二路街道为例,分步讲解下载指定区域遥感影像的方法,包括图层选择、坐标系设置、分辨率调整等关键参数配置。此外,还介绍了影像精准裁剪技巧,为 GIS 数据获取与处理提供实用指导,助力用户高效使用 QGIS 开展地理信息相关工作。

weixin_43679228的博客 7434

告别第三方工具!用Windows自带蓝牙玩转BLE设备调试(保姆级图文教程)

本文详细介绍了如何利用Windows自带的蓝牙功能进行BLE设备调试,无需第三方工具。从硬件准备、系统配置到实战操作,提供保姆级图文教程,帮助开发者高效完成设备发现、数据交互等全流程调试工作。特别适合物联网开发者和智能硬件爱好者。

o5p6q的博客 726

MapReduce中Shuffle机制下的Partition分区方法实现——针对执行后需要多个结果文件的需求

在现实需求中,我们时长会遇到将执行结果按照某些条件存放到不同的结果文件中,Partition分区即可实现这个功能。 Partition分区有默认Partition分区和自定义Partition分区两种,下面我们逐一介绍。 一、默认Partition分区: public class HashPartitioner<K, V> extends Partitioner<K, V> { //提供空参构造器 public HashPartitioner() {

m0_56066550的博客 418

Ubuntu18.04黑屏救急指南:从tty到图形界面的5种恢复方法(附网络配置技巧)

本文针对Ubuntu 18.04系统启动后出现黑屏并进入tty命令行的问题,提供了一套从紧急诊断到完全恢复图形化界面的系统性实战指南。文章详细讲解了五种核心恢复方法,包括重启显示管理器、重装ubuntu-desktop桌面环境、手动安装Xorg与LightDM等,并重点解决了纯命令行环境下的网络配置难题,帮助用户快速修复系统,恢复工作环境。

weixin_29243279的博客 359

hadoop源码阅读(四)(分区源码)

分区源码

m0_67991849的博客 600

网口电路/Bob Smith电路思考及测试

上表中的数据为实际数据,此时可以看出在结果比对中,分别为以上三种时,结果基本上变化很小,且网口一致性指标都是测试通过的,而且如果真的Bob Smith电路是有阻抗变换的作用的,我的以上操作(保留阻容、去掉电阻、去掉电阻电容)完全破环了阻抗平衡,但是实际上对网口一致性指标没有多大的影响,这是我认为该电路不具有阻抗变换的第一个原因。网口变压器的共模电感,就是电流型中的T10、T14、T17、T18,我们知道辐射超标一般都是共模电流导致的,而共模电感就是来消耗差分线路中的共模电流的,而对差模电流基本无影响。

domen_pan的博客 6056

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

中国移动后端面经总结

作者:JamieEcho 链接:https://www.nowcoder.com/discuss/520878?type=post&order=time&pos=&page=1&channel=-1&source_id=search_post_nctrack 来源:牛客网 AOP hashCode()和equals()的关系 如何判断一个类的两个对象的某个属性是否相同 synchronized和Lock的区别 什么情况下需要加锁,举个例子 (大概题意)如果有多个线程

qq_43748400的博客 663

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

大数据培训教程Shuffle机制

(2)如果1

zjjcchina的博客 541

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

MapReduce的运作详解之分区

分区的概念: Map阶段处理的数据,在向环形缓冲区写的时候 是以分区的方式写的 一般情况下,MR程序分区数有多少 reduceTask数量就应该有多少 ,一个分区的数据一个reduceTask去处理,reduceTask处理完成之后都会生成一个结果文件 ...

阳哥的博客 4121

MapReduce分区

MapReduce分区

qq_51180928的博客 1089

MapReduce快速入门系列(16) | MapReduce开发总结

此篇文章讲述的是MapReduce的开发总结,希望能够帮助到各位小可爱呀! 目录1. 输入数据接口:InputFormat2. 逻辑处理接口:Mapper3. Partitioner分区4. Comparable排序5. Combiner合并6. Reduce端分组:GroupingComparator7. 逻辑处理接口:Reducer8. 输出数据接口:OutputFormat 在编写Ma...

不温卜火 6047

Mapreduce之Partition

Partition了解 Partition位置 Partition主要作用就是将map的结果发送到相应的reduce。这就对partition有两个要求: 1)均衡负载,尽量的将工作均匀的分配给不同的reduce。 2)效率,分配速度一定要快。 patition类结构 1.Partitioner是partitioner的基类,如果需要定制partitioner也需要继承该类。 2...

weixin_43006131的博客 731

MapReduce,Yarn,Spark理解与执行流程

- 1-5的步骤较为简单,就是**创建一个container用于生成application master**。具体是资源管理器收到调用它的submitApplication()消息后,便将请求传递给 YARN调度器(scheduler)。调度器分配一个容器,然后资源管理器在节点管理器的管理下在容器中启动application master的进程 - 接下来,它接受来自共享文件系统的、在客户端计算的输入分片(步骤7)。然后**对每一个分片创建一个 map任务**对象以及由mapreduce.job.reduc

m0_75081815的博客 2103

(key.hashCode() & Integer.MAX_VALUE) % numReduceTasks 与最大值 保证非负数

/** Partition keys by their {@link Object#hashCode()}. */ @InterfaceAudience.Public @InterfaceStability.Stable public class HashPartitioner<K, V> extends Partitioner<K, V> { /** Use ...

C_time的博客 1629

MapReduce的应用

<br />一个对MapReduce的应用<br />   <br /> 1、一个简单的统计每个字符数量<br />   package sample; public class SimpleWordCounter { /* count()メソッドで指定された文字列内で各英字が何回 使われているかを保存する配列 */ private int[] charCount = new int[128]; /* 指定された文字列内で各英字が何回使われているかを

涛涌四海向大家学习,与大家携手共进…… 5201

MapReduce分区和reduceTask的数量

MapReduce分区和reduceTask的数量 1.MapReduce分区:相同key的数据发送到同一个reduce里面去。 mapTask处理的是文件切片filesplit。 注意:block的概念是在hdfs当中的,mapreduce当中,每一个mapTask处理的数据都是叫做一个文件切片。 暂时可以简单地认为,一个文件切片就是对应一个block块。还可以简单地认为,有多少个block块,就要启动多少个mapTask。 2.分区规则: HashPartitioner的getPartition方法

黄道婆的专栏 1526

MapReduce

MapReduce详解 MapReduce设计理念 map–>映射(key value) reduce–>归纳 mapreduce必须构建在hdfs之上一种大数据离线计算框架 在线:实时数据处理 离线:数据处理时效性没有在线那么强,但是相对也需要很快得到结果 mapreduce不会马上得到结果,他会有一定的延时 如果数据量小,使用mapreduce反而不合适 杀鸡用牛刀 原始数据–>map(Key,Value)–>Reduce 分布式计算 将大的数据切分成多个小数据,交给更

weixin_46074059的博客 1056
上一篇: ZooKeeper
下一篇: MapReduce2
小胖超凶哦!
博客等级 码龄5年 13粉丝 163原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值