16_尚硅谷大数据之MapReduce_Hadoop序列化
Hadoop数据分析与应用 MapReduce(一)
技术讲解
实践练习
实践时间: 25 分钟
1. 使用 Hadoop 内置 jar 文件进行单词计数统计
3.1.1 MapReduce 的概念
MapReduce 是一种编程模型,用于大规模数据集(大于 1TB)的并行运算。 概念 Map(映射)和 Reduce(归约)是它们的主要思想,都是从函数式和矢量
3.1.4 MapReduce 执行流程
MapReduce 执行流程是先执行 Map 后执行 Reduce 的过程
3.1.4 MapReduce 执行流程
Map 任务处理
读取 HDFS 中的文件,每一行解析成一个 <k,v>,每一个键值对调用一次 map() 方法 覆盖 map() 方法,接收上一步产生的 <k,v> 进行处理,转换为新的 <k,v> 输出 对上一步输出的 <k,v> 进行分区,并默认分为一个区 对不同分区中的数据按照 k 进行排序和分组。分组指的是相同 key 的 value 放到一个集合中 对分组后的数据进行归约(可选)
public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException { Configuration conf = new Configuration(); Job job = Job.getInstance(conf); job.setJarByClass(MapReduceDemo.class); job.setMapperClass(WCMap.class); job.setReducerClass(WCReduce.class); job.setMapOutputKeyClass(Text.class); job.setMapOutputValueClass(LongWritable.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(LongWritable.class); Path inputPath = new Path("/data"); Path outputPath = new Path("/output"); FileInputFormat.setInputPaths(job, inputPath); FileOutputFormat.setOutputPath(job, outputPath); boolean waitForCompletion = job.waitForCompletion(true); System.exit(waitForCompletion?0:1);
大数据培训之 hadoop序列化详解(最新版)
北京尚学堂提供初学java的人肯定对java序列化记忆犹新。
最开始很多人并不会一下子理解序列化的意义所在。
这样子是因为很多人还是对java最底层的特性不是特别理解,当你经验丰富,对java 理解更加深刻之后,你就会发现序列化这种东西的精髓。
谈hadoop序列化之前,我们再来回顾一下java的序列化,也是最底层的序列化:在面向对象程序设计中,类是个很重要的概念。
所谓“类”,可以将它想像成建筑图纸,而对象就是根据图纸盖的大楼。
类,规定了对象的一切。
根据建筑图纸造房子,盖出来的就是大楼,等同于将类进行实例化,得到的就是对象。
一开始,在源代码里,类的定义是明确的,但对象的行为有些地方是明确的,有些地方是不明确的。
对象里不明确地方,是因为对象在运行的时候,需要处理无法预测的事情,诸如用户点了下屏幕,用户点了下按钮,输入点东西,或者需要从网络发送接收数据之类的。
后来,引入了泛型的概念之后,类也开始不明确了,如果使用了泛型,直到程序运行的时候,才知道究竟是哪种对象需要处理。
对象可以很复杂,也可以跟时序相关。
一般来说,“活的”对象只生存在内存里,关机断电就没有了。
一般来说,“活的”对象只能由本地的进程使用,不能被发送到网络上的另外一台计算机。
想象一下,对象怎么出现的,一般是new出来的,new出来的对象在内存里面,另外的计算机怎么可能使用我这台机器上的对象呢?如果要的话,序列化就是你必须要使用的东西。
序列化,可以存储“活的”对象,可以将“活的”对象发送到远程计算机。
把“活的”对象序列化,就是把“活的”对象转化成一串字节,而“反序列化”,就是从一串字节里解析出“活的”对象。
于是,如果想把“活的”对象存储到文件,存储这串字节即可,如果想把“活的”对象发送到远程主机,发送这串字节即可,需要对象的时候,做一下反序列化,就能将对象“复活”了。
有例子为证:393 44 45 46 47 48}public void setAge(Integer age) {this.age = age;}public Gender getGender() {return gender;}public void setGender(Gender gender) {this.gender = gender;}@Overridepublic String toString() {return "[" + name + ", " + age + ", " + g ender + "]";}将对象序列化存储到文件,术语又叫“持久化”。
Hadoop文件的序列化
Hadoop⽂件的序列化1. 为什么要序列化 如图,⼀个活着的对象只存在于内存中,⼀旦断电就会消失。
并且,在正常情况下,⼀个或者的对象⽆法直接通过⽹络发送到其他(远程)机器上。
⽽序列化可以克服上述问题,它能存储对象,并完成其⽹络传输的任务。
2. 什么是序列化 序列化是将对象转化为字节流的⽅法,或者说⽤字节流描述对象的⽅法。
与序列化相对的是反序列化,即将字节流转化为对象的⽅法。
序列化由两个⽬的: 1)进程间通信; 2)数据持久性存储。
3. 为什么不⽤Java的序列化机制 Java的序列化机制存在开销⼤、体积⼤和和它的引⽤机制所导致的⼤⽂件不能分割的缺点。
因此,Java的序列机制不适合Hadoop,Hadoop设计了⾃⼰的序列化机制。
4. Hadoop序列化机制的特点 Hadoop采⽤RPC来实现进程间通信,RPC的序列化机制具有以下特点: 1)紧凑:紧凑的格式可以充分利⽤带宽,加快传输速度; 2)快速:能减少序列化和反序列化的开销,这会有效地较少进程间通信的时间; 3)可扩展:可以逐步改变,是客户端与服务器直接相关的,可以随时加⼊⼀个新的参数⽅法调⽤; 4)互操作性:⽀持不同语⾔编写的客户端与服务器交换数据。
5. Hadoop序列化接⼝ Hadoop的序列化机制定义了两个接⼝:Writable接⼝和Comparable接⼝,它们可以合并为WritableComparable接⼝。
5.1 Writable类 Writable是Hadoop的核⼼,Hadoop通过它定义了Hadoop中基本的数据类型及其操作。
Writable类定义了两个⽅法:package org.apache.hadoop.io;import java.io.DataOutput;import java.io.DataInput;import java.io.IOException;public interface Writable {/*** 将对象转换为字节流并写⼊到输出流out中*/void write(DataOutput out) throws IOException;/*** 从输⼊流in中读取字节流反序列化为对象*/void readFields(DataInput in) throws IOException;} 5.2 Comparable类 所有实现了Comparable的对象都可以和⾃⾝相同类型的对象⽐较⼤⼩。
简述mapreduce数据处理流程
简述mapreduce数据处理流程MapReduce是一种用于大规模数据处理的编程模型,它由Google 首次提出,并且在开源项目Apache Hadoop中得到了广泛应用。
它的核心思想是将数据处理任务分为两个阶段:Map阶段和Reduce阶段。
下面将简述MapReduce的数据处理流程,并对其进行拓展。
1. 输入数据切片:在MapReduce任务开始之前,输入数据会被分割成多个小的数据块,每个数据块称为一个输入数据切片。
这样做的目的是为了能够并行地处理这些数据块,提高处理效率。
2. Map阶段:在Map阶段,每个输入数据切片会被传递给一个Map任务进行处理。
每个Map任务都会执行用户自定义的Map函数,该函数将输入数据切片转化为<key, value>对的集合。
Map函数可以根据具体需求进行数据筛选、转换、过滤等操作,并将处理结果输出为<key, value>对。
3. Shuffle阶段:在Map阶段结束后,Map任务的输出结果会通过网络传输到Reduce任务所在的节点。
这个过程称为Shuffle,其目的是将具有相同key的<key, value>对传递给同一个Reduce任务进行处理。
4. Sort阶段:在Shuffle阶段结束后,Map任务的输出结果会按照key值进行排序。
这样做的目的是为了方便Reduce任务进行后续的处理操作。
5. Reduce阶段:在Reduce阶段,每个Reduce任务会执行用户自定义的Reduce函数,该函数将具有相同key的<key, value>对进行合并、计算、汇总等操作,并将处理结果输出为最终的结果。
6. 输出结果:最后,所有Reduce任务的输出结果会被整合成一个最终的结果,并存储到指定的位置,供后续的分析和使用。
除了上述的基本流程,MapReduce还具有一些拓展的功能和特性,例如:- Combiner函数:在Map阶段的输出结果传递给Reduce阶段之前,可以使用Combiner函数进行局部汇总操作,以减少数据传输量和提高处理效率。
尚硅谷大数据技术之 Hadoop(生产调优手册)说明书
尚硅谷大数据技术之Hadoop(生产调优手册)(作者:尚硅谷大数据研发部)版本:V3.3第1章HDFS—核心参数1.1 NameNode内存生产配置1)NameNode内存计算每个文件块大概占用150byte,一台服务器128G内存为例,能存储多少文件块呢?128 * 1024 * 1024 * 1024 / 150Byte ≈9.1亿G MB KB Byte2)Hadoop2.x系列,配置NameNode内存NameNode内存默认2000m,如果服务器内存4G,NameNode内存可以配置3g。
在hadoop-env.sh文件中配置如下。
HADOOP_NAMENODE_OPTS=-Xmx3072m3)Hadoop3.x系列,配置NameNode内存(1)hadoop-env.sh中描述Hadoop的内存是动态分配的# The maximum amount of heap to use (Java -Xmx). If no unit # is provided, it will be converted to MB. Daemons will# prefer any Xmx setting in their respective _OPT variable.# There is no default; the JVM will autoscale based upon machine # memory size.# export HADOOP_HEAPSIZE_MAX=# The minimum amount of heap to use (Java -Xms). If no unit # is provided, it will be converted to MB. Daemons will# prefer any Xms setting in their respective _OPT variable.# There is no default; the JVM will autoscale based upon machine # memory size.# export HADOOP_HEAPSIZE_MIN=HADOOP_NAMENODE_OPTS=-Xmx102400m(2)查看NameNode占用内存[atguigu@hadoop102 ~]$ jps3088 NodeManager2611 NameNode3271 JobHistoryServer2744 DataNode3579 Jps[atguigu@hadoop102 ~]$ jmap -heap 2611Heap Configuration:MaxHeapSize = 1031798784 (984.0MB)(3)查看DataNode占用内存[atguigu@hadoop102 ~]$ jmap -heap 2744Heap Configuration:MaxHeapSize = 1031798784 (984.0MB)查看发现hadoop102上的NameNode和DataNode占用内存都是自动分配的,且相等。
Hadoop MapReduce简介
Hadoop MapReduce简介本节首先简单介绍大数据批处理概念,然后介绍典型的批处理模式MapReduce,最后对Map 函数和Reduce 函数进行描述。
批处理模式批处理模式是一种最早进行大规模数据处理的模式。
批处理主要操作大规模静态数据集,并在整体数据处理完毕后返回结果。
批处理非常适合需要访问整个数据集合才能完成的计算工作。
例如,在计算总数和平均数时,必须将数据集作为一个整体加以处理,而不能将其视作多条记录的集合。
这些操作要求在计算进行过程中数据维持自己的状态。
需要处理大量数据的任务通常最适合用批处理模式进行处理,批处理系统在设计过程中就充分考虑了数据的量,可提供充足的处理资源。
由于批处理在应对大量持久数据方面的表现极为出色,因此经常被用于对历史数据进行分析。
为了提高处理效率,对大规模数据集进行批处理需要借助分布式并行程序。
传统的程序基本是以单指令、单数据流的方式按顺序执行的。
这种程序开发起来比较简单,符合人们的思维习惯,但是性能会受到单台计算机的性能的限制,很难在给定的时间内完成任务。
而分布式并行程序运行在大量计算机组成的集群上,可以同时利用多台计算机并发完成同一个数据处理任务,提高了处理效率,同时,可以通过增加新的计算机扩充集群的计算能力。
Google 最先实现了分布式并行处理模式MapReduce,并于2004 年以论文的方式对外公布了其工作原理,Hadoop MapReduce 是它的开源实现。
Hadoop MapReduce 运行在HDFS 上。
MapReduce 简释如图1 所示,如果我们想知道相当厚的一摞牌中有多少张红桃,最直观的方式就是一张张检查这些牌,并且数出有多少张是红桃。
这种方法的缺陷是速度太慢,特别是在牌的数量特别高的情况下,获取结果的时间会很长。
图1 找出有多少张红桃MapReduce 方法的规则如下。
∙把这摞牌分配给在座的所有玩家。
∙让每个玩家数自己手中的牌中有几张是红桃,然后把这个数目汇报上来。
18_尚硅谷大数据之MapReduce_Hadoop数据压缩
优点:支持 split;具有很高的压缩率,比 gzip 压缩率都高;hadoop 本身支持,但不支 持 native;在 linux 系统下自带 bzip2 命令,使用方便。
缺点:压缩/解压速度慢;不支持 native。 应用场景:适合对速度要求不高,但需要较高的压缩率的时候,可以作为 mapreduce 作 业的输出格式;或者输出之后的数据比较大,处理之后的数据需要压缩存档减少磁盘空间并 且以后数据用得比较少的情况;或者对单个很大的文本文件想压缩减少存储空间,同时又需 要支持 split,而且兼容之前的应用程序(即应用程序不需要修改)的情况。
注:LZO是供HMdoop压缩数 据用的通用压缩编解码器。 其设计目标是达到与硬盘读 取速度相当的压缩速度,因 此速度是优先考虑的因素, 而不是压缩率。与gzip编解码 器相比,它的压缩速度是gzip 的5倍,而解压速度是gzip的2 倍。同一个文件用LZO压缩 后比用gzip压缩后大50%,但 比压缩前小25%~50%。这对 改善性能非常有利,mMp阶段 完成时间快4倍。
而来的数据进行解 压缩,则调用 createInputStream(InputStreamin)函数, 从而获得一个
CompressionInputStream,从而ห้องสมุดไป่ตู้底层的流读取未压缩的数据。
测试一下如下压缩方式:
DEFLATE gzip bzip2
press.DefaultCodec press.GzipCodec press.BZip2Codec
4.2 MR 支持的压缩编码
压缩格式 DEFAULT Gzip bzip2 LZO Snappy
hadoop 自带? 是,直接使用 是,直接使用 是,直接使用 否,需要安装 否,需要安装
大数据之mapreduce理论
MapReduce理论篇2.1 Writable序列化序列化就是把内存中的对象,转换成字节序列(或其他数据传输协议)以便于存储(持久化)和网络传输。
反序列化就是将收到字节序列(或其他数据传输协议)或者是硬盘的持久化数据,转换成内存中的对象。
Java的序列化是一个重量级序列化框架(Serializable),一个对象被序列化后,会附带很多额外的信息(各种校验信息,header,继承体系等),不便于在网络中高效传输。
所以,hadoop自己开发了一套序列化机制(Writable),精简、高效。
2.1.1 常用数据序列化类型常用的数据类型对应的hadoop数据序列化类型2.1.2 自定义bean对象实现序列化接口1)自定义bean对象要想序列化传输,必须实现序列化接口,需要注意以下7项。
(1)必须实现Writable接口(2)反序列化时,需要反射调用空参构造函数,所以必须有空参构造(3)重写序列化方法(4)重写反序列化方法(5)注意反序列化的顺序和序列化的顺序完全一致(6)要想把结果显示在文件中,需要重写toString(),且用”\t”分开,方便后续用(7)如果需要将自定义的bean放在key中传输,则还需要实现comparable接口,因为mapreduce框中的shuffle过程一定会对key进行排序详见3.2.1统计每一个手机号耗费的总上行流量、下行流量、总流量(序列化)。
2.2 InputFormat数据切片机制2.2.1 FileInputFormat切片机制1)job提交流程源码详解waitForCompletion()submit();// 1建立连接connect();// 1)创建提交job的代理new Cluster(getConfiguration());// (1)判断是本地yarn还是远程initialize(jobTrackAddr, conf);// 2 提交jobsubmitter.submitJobInternal(Job.this, cluster)// 1)创建给集群提交数据的Stag路径Path jobStagingArea = JobSubmissionFiles.getStagingDir(cluster, conf);// 2)获取jobid ,并创建job路径JobID jobId = submitClient.getNewJobID();// 3)拷贝jar包到集群copyAndConfigureFiles(job, submitJobDir);rUploader.uploadFiles(job, jobSubmitDir);// 4)计算切片,生成切片规划文件writeSplits(job, submitJobDir);maps = writeNewSplits(job, jobSubmitDir);input.getSplits(job);// 5)向Stag路径写xml配置文件writeConf(conf, submitJobFile);conf.writeXml(out);// 6)提交job,返回提交状态status = submitClient.submitJob(jobId, submitJobDir.toString(), job.getCredentials());2)FileInputFormat源码解析(input.getSplits(job))(1)找到你数据存储的目录。
Hadoop大数据开发基础Hadoop MapReduce高级编程
自定义键类型必须实现WritableComparable接口, WritableComparable接口自身又实现了Writable接口,所以Hadoop 中的键也可以作为值使用,但是实现Writable接口的值不能作为键使用 。
WritableComparable接口中不仅有readFields(DataInput in)方法和 write(DataOuput out)方法,还提供了一个compareTo(T o)方法,该 方法提供了三种返回类型
38
Hadoop MapReduce ——Combiner组件 如单词统计问题,若有1亿个单词,就会传输1亿个键值对,合理的使用 Combiner可以减少键值对的网络传输,提示效率。 Combiner发生在map端,通常与reduce有相同的实现 Combiner一般适用于求和,求最大值或最小值,不适用与求平均 值 声明Combiner类的时候必须继承Reducer
制格式
KeyValueInput 把行解析为键 第一个tab字符前 行 剩 下 的
Format
值对
的所有字符(Text)内
容
(Text)
5
Hadoop MapReduce ——Hadoop序列化特点
➢ 紧凑:高效使用存储空间。 ➢ 快速:读取数据的额外开销小。 ➢ 可扩展:可透明地读取老格式的数据。 ➢ 互操作:可以使用不同的语言读/写永久存储的数据。
相关参数说明如下: • f:打开的文件。 • bufferSize:要使用的缓冲区的大小。
26
Hadoop Java API——读写数据
27
Hadoop Java API——读写数据
28
目录
1
MapReduce输入输出格式
如何在Hadoop中使用MapReduce进行数据分析
如何在Hadoop中使用MapReduce进行数据分析在当今信息爆炸的时代,数据分析已经成为了企业和组织决策的重要工具。
而Hadoop作为一个开源的分布式计算框架,提供了强大的数据处理和分析能力,其中的MapReduce就是其核心组件之一。
本文将介绍如何在Hadoop中使用MapReduce进行数据分析。
首先,我们需要了解MapReduce的基本原理。
MapReduce是一种分布式计算模型,它将大规模的数据集划分成若干个小的数据块,然后通过Map和Reduce两个阶段进行并行处理。
在Map阶段,数据集会被分割成若干个键值对,每个键值对由一个键和一个值组成。
然后,Map函数会对每个键值对进行处理,生成一个新的键值对。
在Reduce阶段,相同键的值会被分组在一起,然后Reduce函数会对每个键的值进行聚合和处理,最终生成最终的结果。
在Hadoop中使用MapReduce进行数据分析的第一步是编写Map和Reduce函数。
在编写Map函数时,我们需要根据具体的数据分析任务来定义键值对的格式和生成方式。
例如,如果我们要统计某个网站的访问量,那么键可以是网站的URL,值可以是1,表示一次访问。
在Reduce函数中,我们需要根据具体的需求来定义对键的值进行聚合和处理的方式。
例如,如果我们要统计每个网站的总访问量,那么Reduce函数可以将所有的值相加得到最终的结果。
编写好Map和Reduce函数后,我们需要将数据加载到Hadoop中进行分析。
在Hadoop中,数据通常以HDFS(Hadoop Distributed File System)的形式存储。
我们可以使用Hadoop提供的命令行工具或者编写Java程序来将数据加载到HDFS 中。
加载完成后,我们就可以使用Hadoop提供的MapReduce框架来进行数据分析了。
在运行MapReduce任务之前,我们需要编写一个驱动程序来配置和提交任务。
在驱动程序中,我们需要指定Map和Reduce函数的类名、输入数据的路径、输出数据的路径等信息。
Hadoop大数据开发基础教案MapReduce进阶编程教案
Hadoop大数据开发基础教案-MapReduce进阶编程教案一、MapReduce编程模型1.1 课程目标理解MapReduce编程模型的基本概念掌握MapReduce程序的编写和运行过程掌握MapReduce中的数据序列化和反序列化1.2 教学内容MapReduce编程模型概述Mapper和Reducer的编写和运行序列化和反序列化1.3 教学方法讲解MapReduce编程模型的基本概念通过示例演示Mapper和Reducer的编写和运行讲解序列化和反序列化的实现方法1.4 教学资源MapReduce编程模型PPT示例代码1.5 教学评估学生能理解MapReduce编程模型的基本概念学生能编写简单的MapReduce程序学生能实现序列化和反序列化功能二、MapReduce高级特性2.1 课程目标理解MapReduce高级特性的概念和作用掌握MapReduce中的数据分区、分片和合并掌握MapReduce中的数据压缩和溢出处理2.2 教学内容MapReduce高级特性概述数据分区和分片数据压缩和溢出处理2.3 教学方法讲解MapReduce高级特性的概念和作用通过示例演示数据分区和分片的实现方法讲解数据压缩和溢出处理的实现方法2.4 教学资源MapReduce高级特性PPT示例代码2.5 教学评估学生能理解MapReduce高级特性的概念和作用学生能实现数据分区和分片功能学生能处理数据压缩和溢出问题三、MapReduce性能优化3.1 课程目标理解MapReduce性能优化的目标和原则掌握MapReduce中的任务调度和资源管理掌握MapReduce中的数据本地化和压缩策略3.2 教学内容MapReduce性能优化概述任务调度和资源管理数据本地化和压缩策略3.3 教学方法讲解MapReduce性能优化的目标和原则通过示例演示任务调度和资源管理的实现方法讲解数据本地化和压缩策略的实现方法3.4 教学资源MapReduce性能优化PPT示例代码3.5 教学评估学生能理解MapReduce性能优化的目标和原则学生能实现任务调度和资源管理功能学生能应用数据本地化和压缩策略进行性能优化四、MapReduce案例分析4.1 课程目标理解MapReduce在实际应用中的案例掌握MapReduce在文本处理、数据挖掘和图像处理等方面的应用掌握MapReduce在分布式文件系统上的数据处理能力4.2 教学内容MapReduce案例概述文本处理、数据挖掘和图像处理的MapReduce应用分布式文件系统上的数据处理4.3 教学方法讲解MapReduce在实际应用中的案例通过示例演示文本处理、数据挖掘和图像处理的MapReduce应用讲解分布式文件系统上的数据处理方法4.4 教学资源MapReduce案例分析PPT示例代码4.5 教学评估学生能理解MapReduce在实际应用中的案例学生能应用MapReduce进行文本处理、数据挖掘和图像处理学生能掌握MapReduce在分布式文件系统上的数据处理能力五、MapReduce编程实践5.1 课程目标掌握MapReduce编程实践的基本步骤能够编写并运行一个完整的MapReduce程序理解MapReduce编程实践中的常见问题和解决方法5.2 教学内容MapReduce编程实践概述编写MapReduce程序的基本步骤常见问题和解决方法六、Hadoop生态系统中的MapReduce6.1 课程目标理解Hadoop生态系统中MapReduce的位置和作用掌握Hadoop中MapReduce与其他组件的交互理解MapReduce在不同Hadoop发行版中的配置和使用6.2 教学内容Hadoop生态系统概述MapReduce在Hadoop中的角色MapReduce与HDFS、YARN等组件的交互不同Hadoop发行版的MapReduce配置6.3 教学方法讲解Hadoop生态系统的结构和组件通过图解和实例说明MapReduce在Hadoop中的作用比较不同Hadoop发行版中MapReduce的配置差异6.4 教学资源Hadoop生态系统PPTMapReduce在不同Hadoop发行版中的配置示例6.5 教学评估学生能理解Hadoop生态系统中MapReduce的位置和作用学生能描述MapReduce与HDFS、YARN等组件的交互过程学生能根据不同Hadoop发行版配置MapReduce七、使用MapReduce处理复杂数据类型7.1 课程目标理解复杂数据类型的概念和重要性掌握MapReduce中处理复杂数据类型的方法学会使用MapReduce处理序列文件、自定义对象等7.2 教学内容复杂数据类型的介绍序列文件的处理自定义对象的处理数据压缩技术7.3 教学方法讲解复杂数据类型的概念和应用场景通过示例演示如何使用MapReduce处理序列文件和自定义对象介绍数据压缩技术在MapReduce中的应用7.4 教学资源复杂数据类型PPT序列文件和自定义对象处理的示例代码数据压缩技术文档7.5 教学评估学生能理解复杂数据类型的概念和重要性学生能使用MapReduce处理序列文件和自定义对象学生能应用数据压缩技术优化MapReduce程序八、MapReduce中的数据流控制8.1 课程目标理解MapReduce中数据流控制的概念掌握MapReduce中shuffle和sort的过程学会使用MapReduce实现数据过滤和聚合8.2 教学内容数据流控制概述shuffle和sort过程数据过滤和聚合技术8.3 教学方法讲解数据流控制的概念和作用通过图解和示例说明shuffle和sort的过程介绍如何使用MapReduce实现数据过滤和聚合8.4 教学资源数据流控制PPTshuffle和sort过程的图解和示例代码数据过滤和聚合的示例代码8.5 教学评估学生能理解数据流控制的概念学生能描述shuffle和sort的过程学生能使用MapReduce实现数据过滤和聚合九、使用MapReduce进行数据分析9.1 课程目标理解MapReduce在数据分析中的应用掌握使用MapReduce进行词频统计、日志分析等常见数据分析任务学会设计适用于MapReduce的数据分析算法9.2 教学内容数据分析概述词频统计日志分析数据分析算法设计9.3 教学方法讲解数据分析的概念和MapReduce的应用场景通过示例演示如何使用MapReduce进行词频统计和日志分析介绍如何设计适用于MapReduce的数据分析算法9.4 教学资源数据分析PPT词频统计和日志分析的示例代码适用于MapReduce的数据分析算法设计文档9.5 教学评估学生能理解MapReduce在数据分析中的应用学生能使用MapReduce进行词频统计和日志分析学生能设计适用于MapReduce的数据分析算法十、MapReduce最佳实践和技巧10.1 课程十一、MapReduce调试和优化11.1 课程目标理解MapReduce程序调试的重要性掌握MapReduce程序的调试技巧学会优化MapReduce程序的性能11.2 教学内容MapReduce程序调试的重要性MapReduce程序调试技巧MapReduce程序性能优化11.3 教学方法讲解调试和优化MapReduce程序的重要性通过实例演示MapReduce程序的调试技巧介绍优化MapReduce程序性能的方法11.4 教学资源MapReduce程序调试和优化PPT MapReduce程序调试技巧实例代码MapReduce程序性能优化文档11.5 教学评估学生能理解调试MapReduce程序的重要性学生能掌握调试MapReduce程序的技巧学生能掌握优化MapReduce程序性能的方法十二、MapReduce在实际项目中的应用12.1 课程目标理解MapReduce在实际项目中的应用场景掌握MapReduce在数据处理、分析等实际项目中的应用学会将MapReduce应用到实际项目中12.2 教学内容MapReduce在实际项目中的应用场景MapReduce在数据处理、分析等实际项目中的应用将MapReduce应用到实际项目中的方法12.3 教学方法讲解MapReduce在实际项目中的应用场景通过实例演示MapReduce在数据处理、分析等实际项目中的应用介绍将MapReduce应用到实际项目中的方法12.4 教学资源MapReduce在实际项目中应用PPTMapReduce在数据处理、分析等实际项目中的应用实例代码将MapReduce应用到实际项目中的方法文档12.5 教学评估学生能理解MapReduce在实际项目中的应用场景学生能掌握MapReduce在数据处理、分析等实际项目中的应用学生能将MapReduce应用到实际项目中十三、Hadoop生态系统中的其他数据处理工具13.1 课程目标理解Hadoop生态系统中除MapReduce外的其他数据处理工具掌握Hadoop生态系统中其他数据处理工具的基本使用方法学会在Hadoop生态系统中选择合适的数据处理工具13.2 教学内容Hadoop生态系统中其他数据处理工具概述Hadoop生态系统中其他数据处理工具的基本使用方法在Hadoop生态系统中选择合适的数据处理工具的方法13.3 教学方法讲解Hadoop生态系统中其他数据处理工具的概念和作用通过实例演示Hadoop生态系统中其他数据处理工具的基本使用方法介绍在Hadoop生态系统中选择合适的数据处理工具的方法13.4 教学资源Hadoop生态系统中其他数据处理工具PPTHadoop生态系统中其他数据处理工具的基本使用方法实例代码在Hadoop生态系统中选择合适的数据处理工具的方法文档13.5 教学评估学生能理解Hadoop生态系统中除MapReduce外的其他数据处理工具学生能掌握Hadoop生态系统中其他数据处理工具的基本使用方法学生能在Hadoop生态系统中选择合适的数据处理工具十四、Hadoop集群管理和维护14.1 课程目标理解Hadoop集群管理和维护的重要性掌握Hadoop集群的配置、监控和故障排除方法学会Hadoop集群的日常管理和维护技巧14.2 教学内容Hadoop集群管理和维护的重要性Hadoop集群的配置、监控和故障排除方法Hadoop集群的日常管理和维护技巧14.3 教学方法讲解Hadoop集群管理和维护的重要性通过实例演示Hadoop集群的配置、监控和故障排除方法介绍Hadoop集群的日常管理和维护技巧14.4 教学资源Hadoop集群管理和维护PPTHadoop集群的配置、监控和故障排除方法实例代码Hadoop集群的日常管理和维护技巧文档重点和难点解析本文主要介绍了Hadoop大数据开发基础中的MapReduce进阶编程教案,内容包括MapReduce编程模型、高级特性、性能优化、案例分析、编程实践、数据流控制、数据分析、最佳实践和技巧、实际项目中的应用、Hadoop生态系统中的其他数据处理工具以及Hadoop集群管理和维护。
云计算Hadoop MapReduce
public class MyWritable implements Writable { private int counter; private long timestamp; public void write(DataOutput out) throws IOException { out.writeInt(counter); out.writeLong(timestamp); } public void readFields(DataInput in) throws IOException { counter = in.readInt(); timestamp = in.readLong(); } }
作业的初始化
• JobTracker接收到对submitJob()方法的调用后,创建一 个JobInProgress对象并通过它来管理和调度任务,调 用到FileSystem,把在JobClient端上传的所有任务文件 下载到本地的文件系统中的临时目录里。 • JobTracker使用jobAdded(job)把job放入一个内部的队 列中(jobInitQueue),交由作业调度器进行调度,并对 其进行初始化。 • JobInProgress.initTasks(),初始化TaskInProgress,任务 Task分两种: MapTask 和reduceTask,管理对象都是 TaskInProgress
MapReduce开发
• 气象数据集示例:求每年全球最高气温
– Map函数提供年份和气温 – Reduce函数输出全球气温记录中每年最高气温
Reduce输入 Map输出
Reduce输出
Mapper接口
• 泛型接口,参数分别代表输入键、输入值、输 出键、输出值 • 使用自定义可用于网络序列优化的基本类型, 不使用java基本类型
Hadoop中的数据排序与归并技巧
Hadoop中的数据排序与归并技巧在大数据处理中,数据的排序和归并是非常重要的步骤。
Hadoop作为一个分布式计算框架,提供了强大的工具和技术来处理大规模数据的排序和归并。
本文将介绍Hadoop中的数据排序与归并技巧。
一、Hadoop中的排序技巧在Hadoop中,数据排序是通过MapReduce编程模型来实现的。
首先,数据被分割成小的块,并由不同的Mapper处理。
每个Mapper将输入数据进行排序,并将排序后的结果输出给Reducer。
Reducer再对这些结果进行归并和排序,得到最终的有序输出。
为了提高排序的效率,可以采用一些技巧。
首先,可以使用自定义的排序算法,而不是默认的排序算法。
Hadoop提供了自定义排序接口,可以根据自己的需求实现排序算法。
例如,可以使用快速排序或归并排序等高效的排序算法来替代默认的排序算法。
其次,可以使用Combiner来进行局部排序。
Combiner是在Mapper和Reducer之间执行的一个可选的步骤,用于对Mapper的输出进行局部合并和排序。
它可以减少数据的传输量和网络带宽的消耗,从而提高整体的排序性能。
另外,可以使用二次排序来处理复杂的排序需求。
二次排序是指在排序的基础上,再对相同的键进行二次排序。
Hadoop提供了自定义的分组和排序接口,可以根据需要实现二次排序。
这在一些需要按照多个字段进行排序的场景中非常有用。
二、Hadoop中的归并技巧归并是将多个有序的数据集合并成一个有序的过程。
在Hadoop中,归并是由Reducer来完成的。
Reducer将多个Mapper的输出进行归并和排序,得到最终的有序输出。
为了提高归并的效率,可以采用一些技巧。
首先,可以使用合适的分区策略来减少数据的传输量。
Hadoop提供了多种分区策略,可以根据数据的特点选择合适的分区策略。
例如,可以根据键的哈希值进行分区,使得相同键的数据被发送到同一个Reducer进行归并。
其次,可以使用Combiner来进行局部归并。
hadoop中mapreduce的实现机制
hadoop中mapreduce的实现机制Hadoop中的MapReduce是一个编程模型,用于处理和生成大数据集。
这个模型被设计为高度容错,并且可以轻松地部署在由普通机器组成的集群上。
以下是MapReduce在Hadoop中的实现机制:1. 数据分割:首先,大数据集被分割成较小的数据块,这些数据块可以在集群中的不同节点上进行处理。
默认情况下,这些数据块的大小是128MB,但可以根据需要进行调整。
2. Map阶段:每个数据块都会分配给一个工作节点,并运行Map函数。
Map函数读取输入数据,执行用户定义的转换操作,并输出一系列键值对(key-value pairs)。
这些键值对会被分区函数(Partitioner)进行分区,以便它们可以在Reduce阶段被正确处理。
3. Shuffle阶段:MapReduce框架会对所有相同键的键值对进行排序,并将它们收集到一个工作节点上。
这是所谓的"shuffle"过程。
这个过程由框架自动完成,确保每个键只会被处理一次。
4. Reduce阶段:在shuffle阶段之后,每个键值对都会被发送到同一个Reduce工作节点上。
Reduce函数读取这些键值对,执行用户定义的归约操作,并输出最终的结果。
5. 结果输出:一旦Reduce阶段完成,结果就会写入到输出文件中。
默认情况下,结果会存储在HDFS中,但也可以存储在其他位置。
6. 故障处理:MapReduce在Hadoop中的另一个关键特性是其对失败节点的处理。
如果在处理过程中的任何节点失败,该节点的任务将被重新分配给其他可用节点。
此外,MapReduce还提供了备份和检查点机制,以确保数据的完整性和可靠性。
总的来说,Hadoop中的MapReduce是一个高度可扩展、容错的计算模型,可以处理大规模数据集。
通过将数据分割、并行处理和自动故障转移等任务交给框架处理,开发人员可以专注于实现Map和Reduce函数,而不需要关心分布式系统的复杂性。
02_尚硅谷大数据技术之Hadoop(入门)
02_尚硅⾕⼤数据技术之Hadoop(⼊门)尚硅⾕⼤数据技术之 Hadoop(⼊门)(作者:尚硅⾕⼤数据研发部)版本:V3.3第 1 章 Hadoop 概述1.1 Hadoop 是什么1) Hadoop是⼀个由Apache基⾦会所开发的分布式系统基础架构。
2)主要解决,海量数据的存储和海量数据的分析计算问题。
3)⼴义上来说,Hadoop通常是指⼀个更⼴泛的概念——Hadoop⽣态圈。
1.2 Hadoop 发展历史(了解)1)Hadoop创始⼈Doug Cutting,为了实现与Google类似的全⽂搜索功能,他在Lucene框架基础上进⾏优化升级,查询引擎和索引引擎。
2)2001年年底Lucene成为Apache基⾦会的⼀个⼦项⽬。
3)对于海量数据的场景,Lucene框架⾯对与Google同样的困难,存储海量数据困难,检索海量速度慢。
4)学习和模仿Google解决这些问题的办法:微型版Nutch。
5)可以说Google是Hadoop的思想之源(Google在⼤数据⽅⾯的三篇论⽂)GFS --->HDFSMap-Reduce --->MRBigTable --->HBase6)2003-2004年,Google公开了部分GFS和MapReduce思想的细节,以此为基础Doug Cutting等⼈⽤了2年业余时间实现了DFS和MapReduce机制,使Nutch性能飙升。
7)2005 年Hadoop 作为 Lucene的⼦项⽬ Nutch的⼀部分正式引⼊Apache基⾦会。
8)2006 年 3 ⽉份,Map-Reduce和Nutch Distributed File System (NDFS)分别被纳⼊到 Hadoop 项⽬中,Hadoop就此正式诞⽣,标志着⼤数据时代来临。
9)名字来源于Doug Cutting⼉⼦的玩具⼤象1.3 Hadoop 三⼤发⾏版本(了解)Hadoop 三⼤发⾏版本:Apache、Cloudera、Hortonworks。
Hadoop大数据开发基础教案MapReduce进阶编程教案
Hadoop大数据开发基础教案-MapReduce进阶编程教案第一章:MapReduce编程模型深入1.1 MapReduce编程模型简介1.2 深入了解Map和Reduce函数1.3 了解MapReduce的运行机制1.4 掌握自定义分区、排序和分组第二章:Hadoop YARN简介2.1 YARN的概念与作用2.2 YARN架构原理2.3 掌握YARN资源管理器操作2.4 理解YARN的工作流程第三章:MapReduce高级特性3.1 掌握自定义Combiner 和Reducer3.2 使用外部存储进行数据序列化和反序列化3.3 使用CombineTextInputFormat实现文件分片3.4 实现自定义分区器和排序器第四章:Hadoop HDFS高级操作4.1 HDFS高级配置4.2 掌握HDFS的高可用性4.3 HDFS的存储机制和数据恢复4.4 理解HDFS的文件权限和访问控制第五章:MapReduce性能优化5.1 MapReduce程序性能分析5.2 掌握MapReduce程序调优技巧5.3 Hadoop集群性能调优5.4 分析MapReduce的瓶颈和优化方法第六章:Hadoop生态系统中的其他工具6.1 Sqoop:大数据的导入和导出工具6.2 Hive:大数据的数据仓库工具6.3 HBase:分布式列式数据库6.4 Flink:分布式流处理框架第七章:使用MapReduce处理复杂数据类型7.1 了解复杂数据类型(如树结构、图形结构)7.2 掌握自定义序列化和反序列化复杂数据类型7.3 使用Avro、Protocol Buffers等复杂数据序列化工具7.4 实现复杂数据类型的MapReduce程序第八章:MapReduce算法优化8.1 掌握MapReduce算法设计原则8.2 了解MapReduce算法优化技巧8.3 分析MapReduce算法的时间复杂度和空间复杂度8.4 实现并行度优化、负载均衡等算法优化策略第九章:基于MapReduce的数据挖掘9.1 数据挖掘概念与方法9.2 使用MapReduce实现关联规则挖掘9.3 使用MapReduce实现聚类分析9.4 使用MapReduce实现分类算法第十章:Hadoop项目实战案例分析10.1 分析实战案例的需求和业务场景10.2 设计并实现基于Hadoop的实战项目10.3 分析项目中的性能瓶颈和优化策略10.4 总结实战项目的经验和教训第十一章:Hadoop生态系统扩展与趋势11.1 了解Hadoop生态系统的新技术和发展趋势11.2 探究Spark等替代MapReduce的计算框架11.3 学习Hadoop生态系统中的新型数据处理工具11.4 探讨Hadoop在云计算环境下的应用第十二章:云上的Hadoop部署和管理12.1 了解云服务提供商提供的Hadoop服务12.2 学习在云上部署和管理Hadoop集群的方法12.3 掌握云上Hadoop的自动扩展和故障恢复机制12.4 探讨云上Hadoop的最佳实践和安全性考虑第十三章:Hadoop性能监控和调试13.1 学习使用日志和指标进行Hadoop性能监控13.2 掌握使用可视化工具分析Hadoop集群性能13.3 了解Hadoop性能问题的常见原因和解决方案13.4 实践调试Hadoop程序的技巧第十四章:Hadoop安全与权限管理14.1 了解Hadoop的安全模型和认证机制14.2 学习配置Hadoop的访问控制和权限管理14.3 掌握使用Kerberos进行身份验证的步骤14.4 探讨Hadoop安全最佳实践和数据保护策略第十五章:Hadoop项目开发与团队协作15.1 学习Hadoop项目的开发流程和管理方法15.2 掌握使用Git等版本控制工具管理Hadoop代码15.3 了解Hadoop项目的测试和调试方法15.4 探讨团队合作和项目管理技巧重点和难点解析本教案覆盖了Hadoop大数据开发基础和MapReduce进阶编程的多个方面,重点和难点如下:重点:1. MapReduce编程模型的深入理解。
尚硅谷大数据课程大纲
尚硅谷大数据课程大纲
尚硅谷的大数据课程大纲主要包括以下几个部分:
1. Java SE:学习Java的基础语法和面向对象编程思想,以及常用的Java
开发工具。
2. MySQL:学习关系型数据库管理系统MySQL,包括数据库设计、SQL
语言、存储过程、触发器等。
3. Linux:学习Linux操作系统的基本命令和常用工具,以及在Linux环境
下部署和配置应用程序。
4. Maven:学习使用Maven进行项目管理和构建,了解Maven的依赖管理、项目构建、项目报告等功能。
5. Shell:学习Shell脚本编程,以及在Linux环境下使用Shell脚本来自动化管理任务。
6. Hadoop:学习使用Hadoop进行大数据处理和分析,了解Hadoop的分布式文件系统、MapReduce编程模型、Hive、HBase等组件。
7. Zookeeper:学习使用Zookeeper进行分布式系统的一致性协调和管理。
8. Hive:学习使用Hive进行数据仓库建设和管理,以及Hive的数据建模
和SQL查询。
9. Flume:学习使用Flume进行大数据采集和传输,了解Flume的数据采集、数据清洗、数据传输等功能。
10. 大数据实践项目:通过实际的大数据项目,综合运用所学知识解决实际问题,提升大数据处理和分析能力。
以上是尚硅谷大数据课程大纲的简要介绍,具体内容可能会根据不同的版本和讲师有所差异。
在Hadoop中实现数据排序的技巧
在Hadoop中实现数据排序的技巧Hadoop是一个开源的分布式计算框架,被广泛应用于大数据处理。
在Hadoop 中,数据排序是一个常见的需求,它能够帮助我们更好地理解和分析数据。
在本文中,我们将探讨在Hadoop中实现数据排序的一些技巧。
一、理解MapReduce模型在Hadoop中,数据排序是通过MapReduce模型来实现的。
MapReduce模型由两个主要的阶段组成:Map阶段和Reduce阶段。
在Map阶段中,数据被拆分成多个独立的块,并由多个Mapper并行处理。
在Reduce阶段中,Mapper的输出被合并和排序,最终得到最终的排序结果。
二、使用自定义比较器在Hadoop中,默认的排序方式是根据键的字典顺序进行排序。
然而,有时候我们需要根据自定义的规则进行排序,这时就需要使用自定义比较器。
自定义比较器可以通过实现WritableComparator类来实现。
例如,假设我们有一个包含学生信息的数据集,每个学生有姓名和分数两个字段。
我们想要按照分数从高到低进行排序。
我们可以创建一个自定义比较器,根据分数字段进行排序。
三、使用辅助键在某些情况下,我们可能需要对数据进行多次排序,而不仅仅是一次排序。
在这种情况下,我们可以使用辅助键来实现多级排序。
例如,我们有一个包含学生信息的数据集,每个学生有姓名、分数和班级三个字段。
我们首先想要按照班级进行排序,然后再按照分数进行排序。
我们可以使用辅助键来实现这个需求。
首先,我们可以将班级作为主键进行排序,然后在Reduce阶段中,再次使用分数作为辅助键进行排序。
四、使用Combiner函数在Hadoop中,Combiner函数可以用来在Map阶段的输出结果进行局部合并,以减少数据传输量。
在排序任务中,Combiner函数可以用来减少Reduce阶段的负载,提高性能。
例如,我们有一个包含大量重复数据的数据集,我们想要按照某个字段进行排序。
在Map阶段中,我们可以使用Combiner函数将相同字段值的数据进行合并,减少Reduce阶段的输入数据量。
大数据-hadoop-MapReduce计算流程
大数据-hadoop-MapReduce计算流程•MapReduce计算流程
1 首先是通过程序员所编写的MR程序通过命令行本地提交或者IDE远程提交
2 一个MR程序就是一个Job,Job信息会给Resourcemanger,向Resourcemanger注册信息
•3 在注册通过后,Job会拷贝相关的资源信息(从HDFS中)
4 紧接着会向Resourcemanger提交完整的Job信息(包括资源信息)
5a Resourcemanger 会通过提交的Job信息,计算出Job所需的资源,为Job分配Container资源
5b 计算资源会分发给对应的NodeManger,NodeManager会创建一个MRAppMaster
6 MRAppMaster初始化Job
7 获取输入切片信息
8 MRAppMaster向ResourceManager 请求资源
9a 启动计算资源(连接到对应的资源所在NodeManager)
9b 启动YARN Child
10 从文件系统中获取完整的Job信息
11 启动对应的Maptask或者ReduceTask 进程,执行计算。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2.1 序列化概述
1) 什么是序列化 序列化就是把内存中的对象,转换成字节序列(或其他数据传输协议)以便于存储(持 久化)和网络传输。 反序列化就是将收到字节序列(或其他数据传输协议)或者是硬盘的持久化数据,转换 成内存中的对象。 2) 为什么要序列化 一般来说, “活的”对象只生存在内存里,关机断电就没有了。而且“活的”对象只能 由本地的进程使用, 不能被发送到网络上的另外一台计算机。 然而序列化可以存储 “活的” 对象,可以将“活的”对象发送到远程计算机。 3) 为什么不用 Java 的序列化 Java 的序列化是一个重量级序列化框架(Serializable) ,一个对象被序列化后,会附带 很多额外的信息(各种校验信息,header,继承体系等) ,不便于在网络中高效传输。所以, hadoop 自己开发了一套序列化机制(Writable) ,特点如下: (1)紧凑:紧凑的格式能让我们充分利用网络带宽,而带宽是数据中心最稀缺的资 (2)快速:进程通信形成了分布式系统的骨架,所以需要尽量减少序列化和反序列化 的性能开销,这是基本的; (3)可扩展:协议为了满足新的需求变化,所以控制客户端和服务器过程中,需要直 接引进相应的协议,这些是新协议,原序列化方式能支持新的协议报文; (4)互操作:能支持不同语言写的客户端和服务端进行交互;
2.4 序列化案例实操
1)需求: 统计每一个手机号耗费的总上行流量、下行流量、总流量 2)数据准备
phone_data.txt
输入数据格式:
1363157993055 13560436666 C4-17-FE-BA-DE-D9:CMCC 120.196.100.99 18 15 1116 954 200
map array
MapWritable ArrayWritable
2.3 自定义 bean 对象实现序列化接口(Writable)
1)自定义 bean 对象要想序列化传输,必须实现序列化接口,需要注意以下 7 项。 (1)必须实现 Writable 接口 (2)反序列化时,需要反射调用空参构造函数,所以必须有空参构造 public FlowBean() { super(); } (3)重写序列化方法 @Override public void write(DataOutput out) throws IOException { out.writeLong(upFlow); out.writeLong(downFlow); out.writeLong(sumFlow); } (4)重写反序列化方法 @Override public void readFields(DataInput in) throws IOException { upFlow = in.readLong(); downFlow = in.readLong(); sumFlow = in.readLong(); } (5)注意反序列化的顺序和序列化的顺序完全一致 (6)要想把结果显示在文件中,需要重写 toString(),可用”\t”分开,方便后续用。 (7)如果需要将自定义的 bean 放在 key 中传输,则还需要实现 comparable 接口,因为 mapreduce 框中的 shuffle 过程一定会对 key 进行排序。 @Override public int compareTo(FlowBean o) { // 倒序排列,从大到小 return this.sumFlow > o.getSumFlow() ? -1 : 1; }
this.upFlow = upFlow; } public long getDownFlow() { return downFlow; } public void setDownFlow(long downFlow) { this.downFlow = downFlow; } public long getSumFlow() { return sumFlow; } public void setSumFlow(long sumFlow) { this.sumFlow = sumFlow; } } (2)编写 mapper package com.atguigu.mapreduce.flowsum; import java.io.IOException; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Mapper; public class FlowCountMapper extends Mapper<LongWritable, Text, Text, FlowBean>{ FlowBean v = new FlowBean(); Text k = new Text(); @Override protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { // 1 获取一行 String line = value.toString(); // 2 切割字段 String[] fields = line.split("\t"); // 3 封装对象 // 取出手机号码 String phoneNum = fields[1];
手机号码
上行流量 下行流量
输出数据格式
1356·0436666 1116 954 2070
手机号码
上行流量
下行流量
总流量
3)分析 基本思路: Map 阶段: (1)读取一行数据,切分字段 (2)抽取手机号、上行流量、下行流量 (3)以手机号为 key,bean 对象为 value 输出,即 context.write(手机号,bean); Reduce 阶段: (1)累加上行流量和下行流量得到总流量。 (2)实现自定义的 bean 来封装流量信息,并将 bean 作为 map 输出的 key 来传输 (3) MR 程序在处理数据的过程中会对数据排序(map 输出的 kv 对传输到 reduce 之前, 会排序),排序的依据是 map 输出的 key 所以,我们如果要实现自己需要的排序规则,则可以考虑将排序因素放到 key 中,让 key 实现接口:WritableComparable。 然后重写 key 的 compareTo 方法。 4)编写 mapreduce 程序 (1)编写流量统计的 bean 对象 package com.atguigu.mapreduce.flowsum; import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; import org.apache.hadoop.io.Writable; // 1 实现 writable 接口 public class FlowBean implements Writable{
// 取出上行流量和下行流量 long upFlow = Long.parseLong(fields[fields.length - 3]); long downFlow = Long.parseLong(fields[fields.length - 2]); v.set(downFlow, upFlow); // 4 写出 context.write(new Text(phoneNum), new FlowBean(upFlow, downFlow)); } } (3)编写 reducer package com.atguigu.mapreduce.flowsum; import java.io.IOException; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Reducer; public class FlowCountReducer extends Reducer<Text, FlowBean, Text, FlowBean> { @Override protected void reduce(Text key, Iterable<FlowBean> values, Context context) throws IOException, InterruptedException { long sum_upFlow = 0; long sum_downFlow = 0; // 1 遍历所用 bean,将其中的上行流量,下行流量分别累加 for (FlowBean flowBean : values) { sum_upFlow += flowBean.getSumFlow(); sum_downFlow += flowBean.getDownFlow(); } // 2 封装对象 FlowBean resultBean = new FlowBean(sum_upFlow, sum_downFlow); // 3 写出 context.write(key, resultBean); } } (4)编写驱动 package com.atguigu.mapreduce.flowsum; import java.io.IOException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path;
2.2 常用数据序列化类型
常用的数据类型对应的 hadoop 数据序列化类型 Java 类型 boolean byte int float long double string Hadoop Writable 类型 BooleanWritable ByteWritable IntWritable FloatWritable LongWritable DoubleWritable Text