收藏 分享(赏)

Hadoop生态圈.doc

上传人:weiwoduzun 文档编号:2706994 上传时间:2018-09-25 格式:DOC 页数:138 大小:2.45MB
下载 相关 举报
Hadoop生态圈.doc_第1页
第1页 / 共138页
Hadoop生态圈.doc_第2页
第2页 / 共138页
Hadoop生态圈.doc_第3页
第3页 / 共138页
Hadoop生态圈.doc_第4页
第4页 / 共138页
Hadoop生态圈.doc_第5页
第5页 / 共138页
点击查看更多>>
资源描述

1、Hadoop 生态圈一、简介1 什么是 HADOOP1. HADOOP 是 apache 旗下的一套开源软件平台2. HADOOP 提供的功能:利用服务器集群,根据用户的自定义业务逻辑,对海量数据进行分布式处理3. HADOOP 的核心组件有A. HDFS(分布式文件系统)B. YARN(运算资源调度系统)C. MAPREDUCE(分布式运算编程框架)4. 广义上来说,HADOOP 通常是指一个更广泛的概念HADOOP 生态圈2 HADOOP 生态圈以及各组成部分的简介各组件简介:1 HDFS:分布式文件系统2 MAPREDUCE:分布式运算程序开发框架3 HIVE:基于大数据技术(文件系统+

2、运算框架)的 SQL 数据仓库工具4 HBASE:基于 HADOOP 的分布式海量数据库5 ZOOKEEPER:分布式协调服务基础组件6 Mahout:基于 mapreduce/spark/flink 等分布式运算框架的机器学习算法库7 Oozie:工作流调度框架8 Sqoop:数据导入导出工具9 Flume:日志数据采集框架3 HADOOP 集群HADOOP 集群具体来说包含两个集群:HDFS 集群和 YARN 集群,两者逻辑上分离,但物理上常在一起。HDFS 集群:负责海量数据的存储,集群中的角色主要有 NameNode / DataNodeYARN 集群:负责海量数据运算时的资源调度,集

3、群中的角色主要有 ResourceManager /NodeManager(那 mapreduce 是什么呢?它其实是一个应用程序开发包 )本集群搭建案例,以 5 节点为例进行搭建,角色分配如下:hdp-node-01 NameNode SecondaryNameNodehdp-node-02 ResourceManager hdp-node-03 DataNode NodeManagerhdp-node-04 DataNode NodeManagerhdp-node-05 DataNode NodeManager部署图如下:4 MAPREDUCE 使用mapreduce 是 hadoop 中

4、的分布式运算编程框架,只要按照其编程规范,只需要编写少量的业务逻辑代码即可实现一个强大的海量数据并发处理程序。1、 Demo 开发wordcount 需求:从大量(比如 T 级别)文本文件中,统计出每一个单词出现的总次数。2、 mapreduce 实现思路:Map 阶段:a) 从 HDFS 的源数据文件中逐行读取数据b) 将每一行数据切分出单词c) 为每一个单词构造一个键值对(单词,1)d) 将键值对发送给 reduceReduce 阶段:a) 接收 map 阶段输出的单词键值对b) 将相同单词的键值对汇聚成一组c) 对每一组,遍历组中的所有“值” ,累加求和,即得到每一个单词的总次数d) 将

5、(单词,总次数 )输出到 HDFS 的文件中二、HDFS1. HDFS 前言 设计思想分而治之:将大文件、大批量文件,分布式存放在大量服务器上,以便于采取分而治之的方式对海量数据进行运算分析; 在大数据系统中作用:为各类分布式运算框架(如:mapreduce ,spark ,tez,)提供数据存储服务 重点概念:文件切块,副本存放,元数据2. HDFS 的概念和特性首先,它是一个文件系统,用于存储文件,通过统一的命名空间目录树来定位文件。其次,它是分布式的,由很多服务器联合起来实现其功能,集群中的服务器有各自的角色;重要特性如下:(1 ) HDFS 中的文件在物理上是 分块存储(block )

6、 ,块的大小可以通过配置参数( dfs.blocksize)来规定,默认大小在 hadoop2.x 版本中是 128M,老版本中是 64M(2 ) HDFS 文件系统会给客户端提供一个 统一的抽象目录树 ,客户端通过路径来访问文件,形如:hdfs:/namenode:port/dir-a/dir-b/dir-c/file.data(3 ) 目录结构及文件分块信息(元数据)的管理由 namenode 节点承担namenode 是 HDFS 集群主节点,负责维护整个 hdfs 文件系统的目录树,以及每一个路径(文件)所对应的 block 块信息(block 的 id,及所在的 datanode 服

7、务器)(4 ) 文件的各个 block 的存储管理由 datanode 节点承担- datanode 是 HDFS 集群从节点,每一个 block 都可以在多个 datanode 上存储多个副本(副本数量也可以通过参数设置 dfs.replication)(5 ) HDFS 是设计成适应一次写入,多次读出的场景,且不支持文件的修改(注:适合用来做数据分析,并不适合用来做网盘应用,因为,不便修改,延迟大,网络开销大,成本太高 )3. HDFS 的工作机制(工作机制的学习主要是为加深对分布式系统的理解,以及增强遇到各种问题时的分析解决能力,形成一定的集群运维能力)注:很多不是真正理解 hadoop

8、 技术体系的人会常常觉得 HDFS 可用于网盘类应用,但实际并非如此。要想将技术准确用在恰当的地方,必须对技术有深刻的理解3.1 概述1. HDFS 集群分为两大角色:NameNode、DataNode2. NameNode 负责管理整个文件系统的元数据3. DataNode 负责管理用户的文件数据块4. 文件会按照固定的大小(blocksize)切成若干块后分布式存储在若干台 datanode 上5. 每一个文件块可以有多个副本,并存放在不同的 datanode 上6. Datanode 会定期向 Namenode 汇报自身所保存的文件 block 信息,而 namenode 则会负责保持文

9、件的副本数量7. HDFS 的内部工作机制对客户端保持透明,客户端请求访问 HDFS 都是通过向namenode 申请来进行3.2 HDFS 写数据流程3.2.1 概述客户端要向 HDFS 写数据,首先要跟 namenode 通信,以确认可以写文件,并获得接收文件 block 的 datanode。然后,客户端按顺序将文件逐个 block 传递给相应 datanode,并由接收到 block 的 datanode 负责向其他 datanode 复制 block 的副本3.2.2 详细步骤图3.2.3 详细步骤解析1、 client 跟 namenode 通信请求上传文件, namenode 检

10、查目标文件是否已存在,父目录是否存在2、 namenode 返回是否可以上传3、 client 请求第一个 block 该传输到哪些 datanode 服务器上4、 namenode 返回 3 个 datanode 服务器 ABC5、 client 请求 3 台 dn 中的一台 A 上传数据(本质上是一个 RPC 调用,建立 pipeline) ,A收到请求会继续调用 B,然后 B 调用 C,将整个 pipeline 建立完成,逐级返回客户端6、 client 开始往 A 上传第一个 block(先从磁盘读取数据放到一个本地内存缓存) ,以packet 为单位,A 收到一个 packet 就会

11、传给 B,B 传给 C; A 每传一个 packet 会放入一个应答队列等待应答7、当一个 block 传输完成之后,client 再次请求 namenode 上传第二个 block 的服务器。3.3. HDFS 读数据流程3.3.1 概述客户端将要读取的文件路径发送给 namenode,namenode 获取文件的元信息(主要是block 的存放位置信息)返回给客户端,客户端根据返回的信息找到相应 datanode 逐个获取文件的 block 并在客户端本地进行数据追加合并从而获得整个文件3.3.2 详细步骤图3.3.3 详细步骤解析1、跟 namenode 通信查询元数据,找到文件块所在的

12、 datanode 服务器2、挑选一台 datanode(就近原则,然后随机)服务器,请求建立 socket 流3、 datanode 开始发送数据(从磁盘里面读取数据放入流,以 packet 为单位来做校验)4、客户端以 packet 为单位接收,先在本地缓存,然后写入目标文件4. NAMENODE 工作机制学习目标:理解 namenode 的工作机制尤其是元数据管理机制,以增强对 HDFS 工作原理的理解,及培养 hadoop 集群运营中 “性能调优” 、 “namenode”故障问题的分析解决能力问题场景:1、集群启动后,可以查看文件,但是上传文件时报错,打开 web 页面可看到 nam

13、enode 正处于 safemode 状态,怎么处理?2、 Namenode 服务器的磁盘故障导致 namenode 宕机,如何挽救集群及数据?3、 Namenode 是否可以有多个? namenode 内存要配置多大? namenode 跟集群数据存储能力有关系吗?4、文件的 blocksize 究竟调大好还是调小好?诸如此类问题的回答,都需要基于对 namenode 自身的工作原理的深刻理解4.1 NAMENODE 职责NAMENODE 职责:负责客户端请求的响应元数据的管理(查询,修改)4.2 元数据管理namenode 对数据的管理采用了三种存储形式:内存元数据(NameSystem)

14、磁盘元数据镜像文件数据操作日志文件(可通过日志运算出元数据)4.2.1 元数据存储机制A、内存中有一份完整的元数据(内存 meta data)B、磁盘有一个“准完整”的元数据镜像(fsimage)文件 (在 namenode 的工作目录中)C、用于衔接内存 metadata 和持久化元数据镜像 fsimage 之间的操作日志(edits 文件)注:当客户端对 hdfs 中的文件进行新增或者修改操作,操作记录首先被记入 edits 日志文件中,当客户端操作成功后,相应的元数据会更新到内存 meta.data 中4.2.2 元数据手动查看可以通过 hdfs 的一个工具来查看 edits 中的信息b

15、in/hdfs oev -i edits -o edits.xmlbin/hdfs oiv -i fsimage_0000000000000000087 -p XML -o fsimage.xml4.2.3 元数据的 checkpoint每隔一段时间,会由 secondary namenode 将 namenode 上积累的所有 edits 和一个最新的 fsimage 下载到本地,并加载到内存进行 merge(这个过程称为 checkpoint)checkpoint 的附带作用namenode 和 secondary namenode 的工作目录存储结构完全相同,所以,当 namenode故

16、障退出需要重新恢复时,可以从 secondary namenode 的工作目录中将 fsimage 拷贝到namenode 的工作目录,以恢复 namenode 的元数据5. DATANODE 的工作机制问题场景:1、集群容量不够,怎么扩容?2、如果有一些 datanode 宕机,该怎么办?3、 datanode 明明已启动,但是集群中的可用 datanode 列表中就是没有,怎么办?以上这类问题的解答,有赖于对 datanode 工作机制的深刻理解5.1 概述1、 Datanode 工作职责:存储管理用户的文件块数据定期向 namenode 汇报自身所持有的 block 信息(通过心跳信息上

17、报)(这点很重要,因为当集群中发生某些 block 副本失效时,集群如何恢复 block 初始副本数量的问题)dfs.blockreport.intervalMsec3600000Determines block reporting interval in milliseconds.2、 Datanode 掉线判断时限参数datanode 进程死亡或者网络故障造成 datanode 无法与 namenode 通信,namenode 不会立即把该节点判定为死亡,要经过一段时间,这段时间暂称作超时时长。HDFS 默认的超时时长为 10 分钟 +30 秒。如果定义超时时间为 timeout,则超时时

18、长的计算公式为:timeout = 2 * heartbeat.recheck.interval + 10 * dfs.heartbeat.interval。而默认的 heartbeat.recheck.interval 大小为 5 分钟,dfs.heartbeat.interval 默认为 3 秒。需要注意的是 hdfs-site.xml 配置文件中的 heartbeat.recheck.interval 的单位为毫秒,dfs.heartbeat.interval 的单位为秒。所以,举个例子,如果 heartbeat.recheck.interval 设置为5000(毫秒) ,dfs.hea

19、rtbeat.interval 设置为 3(秒,默认) ,则总的超时时间为 40 秒。heartbeat.recheck.interval2000dfs.heartbeat.interval15.2 观察验证 DATANODE 功能上传一个文件,观察文件的 block 具体的物理存放情况:在每一台 datanode 机器上的这个目录中能找到文件的切块:/home/hadoop/app/hadoop-2.4.1/tmp/dfs/data/current/BP-193442119-192.168.2.120-1432457733977/current/finalized三、MAPREDUCEMap

20、reduce 是一个分布式运算程序的 编程框架 , 是用户开发 “基于 hadoop 的数据分析应用 ”的核心框架;Mapreduce 核心功能 是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在一个 hadoop 集群上;1.1 为什么要 MAPREDUCE(1 )海量数据在单机上处理因为硬件资源限制,无法胜任(2 )而一旦将单机版程序扩展到集群来分布式运行,将极大增加程序的复杂度和开发难度(3 )引入 mapreduce 框架后,开发人员可以将绝大部分工作集中在业务逻辑的开发上,而将分布式计算中的复杂性交由框架来处理设想一个海量数据场景下的 wordcoun

21、t 需求:单机版:内存受限,磁盘受限,运算能力受限分布式:1、 文件分布式存储(HDFS)2、 运算逻辑需要至少分成 2 个阶段(一个阶段独立并发,一个阶段汇聚)3、 运算程序如何分发4、 程序如何分配运算任务(切片)5、 两阶段的程序如何启动?如何协调?6、 整个程序运行过程中的监控?容错?重试?可见在程序由单机版扩成分布式时,会引入大量的复杂工作。为了提高开发效率,可以将分布式程序中的公共功能封装成框架,让开发人员可以将精力集中于业务逻辑。而 mapreduce 就是这样一个分布式程序的通用框架,其应对以上问题的整体结构如下:1、 MRAppMaster(mapreduce applica

22、tion master)2、 MapTask3、 ReduceTask1.2 MAPREDUCE 框架结构及核心运行机制1.2.1 结构一个完整的 mapreduce 程序在分布式运行时有三类实例进程:1、 MRAppMaster:负责整个程序的过程调度及状态协调2、 mapTask:负责 map 阶段的整个数据处理流程3、 ReduceTask:负责 reduce 阶段的整个数据处理流程1.2.2 MR 程序运行流程1.2.2.1 流程示意图1.2.2.2 流程解析1、 一个 mr 程序启动的时候,最先启动的是 MRAppMaster,MRAppMaster 启动后根据本次 job 的描述信

23、息,计算出需要的 maptask 实例数量,然后向集群申请机器启动相应数量的 maptask 进程2、 maptask 进程启动之后,根据给定的数据切片范围进行数据处理,主体流程为:a) 利用客户指定的 inputformat 来获取 RecordReader 读取数据,形成输入 KV 对b) 将输入 KV 对传递给客户定义的 map()方法,做逻辑运算,并将 map()方法输出的KV 对收集到缓存c) 将缓存中的 KV 对按照 K 分区排序后不断溢写到磁盘文件3、 MRAppMaster 监控到所有 maptask 进程任务完成之后,会根据客户指定的参数启动相应数量的 reducetask

24、进程,并告知 reducetask 进程要处理的数据范围(数据分区)4、 Reducetask 进程启动之后,根据 MRAppMaster 告知的待处理数据所在位置,从若干台maptask 运行所在机器上获取到若干个 maptask 输出结果文件,并在本地进行重新归并排序,然后按照相同 key 的 KV 为一个组,调用客户定义的 reduce()方法进行逻辑运算,并收集运算输出的结果 KV,然后调用客户指定的 outputformat 将结果数据输出到外部存储1.3 MapTask 并行度决定机制maptask 的并行度决定 map 阶段的任务处理并发度,进而影响到整个 job 的处理速度那么

25、, mapTask 并行实例是否越多越好呢?其并行度又是如何决定呢?1.3.1 mapTask 并行度的决定机制一个 job 的 map 阶段并行度由客户端在提交 job 时决定而客户端对 map 阶段并行度的规划的基本逻辑为:将待处理数据执行逻辑切片(即按照一个特定切片大小,将待处理数据划分成逻辑上的多个 split) ,然后 每一个 split 分配一个 mapTask 并行实例处理这段逻辑及形成的切片规划描述文件,由 FileInputFormat 实现类的 getSplits()方法完成,其过程如下图:1.3.2 FileInputFormat 切片机制1、切片定义在 InputFor

26、mat 类中的 getSplit()方法2、FileInputFormat 中默认的切片机制:a) 简单地按照文件的内容长度进行切片b) 切片大小,默认等于 block 大小c) 切片时不考虑数据集整体,而是逐个针对每一个文件单独切片比如待处理数据有两个文件:file1.txt 320Mfile2.txt 10M经过 FileInputFormat 的切片机制运算后,形成的切片信息如下: file1.txt.split1- 0128file1.txt.split2- 128256file1.txt.split3- 256320file2.txt.split1- 010M3、FileInputF

27、ormat 中切片的大小的参数配置通过分析源码,在 FileInputFormat 中,计算切片大小的逻辑:Math.max(minSize, Math.min(maxSize, blockSize); 切片主要由这几个值来运算决定minsize:默认值: 1 配置参数: mapreduce.input.fileinputformat.split.minsize maxsize:默认值:Long.MAXValue 配置参数:mapreduce.input.fileinputformat.split.maxsizeblocksize因此,默认情况下,切片大小=blocksizemaxsize(切

28、片最大值):参数如果调得比 blocksize 小,则会让切片变小,而且就等于配置的这个参数的值minsize (切片最小值):参数调的比 blockSize 大,则可以让切片变得比 blocksize 还大选择并发数的影响因素:1、 运算节点的硬件配置2、 运算任务的类型:CPU 密集型还是 IO 密集型3、 运算任务的数据量Comment dht1: JVM重用技术不是指同一 Job的两个或两个以上的 task可以同时运行于同一 JVM上,而是排队按顺序执行。1.4 map并行度的经验之谈如果硬件配置为 2*12core + 64G,恰当的 map并行度是大约每个节点 20-100个 ma

29、p,最好每个 map的执行时间至少一分钟。 如果 job的每个 map或者 reduce task的运行时间都只有 30-40秒钟,那么就减少该job的 map或者 reduce数,每一个 task(map|reduce)的 setup和加入到调度器中进行调度,这个中间的过程可能都要花费几秒钟,所以如果每个 task都非常快就跑完了,就会在 task的开始和结束的时候浪费太多的时间。配置 task的 JVM重用可以改善该问题:( mapred.job.reuse.jvm.num.tasks, 默认是 1,表示一个 JVM上最多可以顺序执行的 task数目(属于同一个 Job)是 1。也就是说一

30、个 task启一个 JVM) 如果 input的文件非常的大,比如 1TB,可以考虑将 hdfs上的每个 block size设大,比如设成 256MB或者 512MB1.5 ReduceTask并行度的决定reducetask的并行度同样影响整个 job的执行并发度和执行效率,但与 maptask的并发数由切片数决定不同,Reducetask 数量的决定是可以直接手动设置:/默认值是 1,手动设置为 4job.setNumReduceTasks(4);如果数据分布不均匀,就有可能在 reduce阶段产生数据倾斜注意: reducetask数量并不是任意设置,还要考虑业务逻辑需求,有些情况下,

31、需要计算全局汇总结果,就只能有 1个 reducetask尽量不要运行太多的 reduce task。对大多数 job来说,最好 rduce的个数最多和集群中的reduce持平,或者比集群的 reduce slots小。这个对于小集群而言,尤其重要。1.6 MAPREDUCE程序运行演示Hadoop的发布包中内置了一个 hadoop-mapreduce-example-2.4.1.jar,这个 jar包中有各种MR示例程序,可以通过以下步骤运行:启动 hdfs,yarn然后在集群中的任意一台服务器上启动执行程序(比如运行 wordcount):hadoop jar hadoop-mapredu

32、ce-example-2.4.1.jar wordcount /wordcount/data /wordcount/out2. MAPREDUCE 实践篇(1)2.1 MAPREDUCE 示例编写及编程规范2.1.1 编程规范(1 ) 用户编写的程序分成三个部分:Mapper ,Reducer ,Driver( 提交运行 mr 程序的客户端)(2 ) Mapper 的输入数据是 KV 对的形式(KV 的类型可自定义)(3 ) Mapper 的输出数据是 KV 对的形式(KV 的类型可自定义)(4 ) Mapper 中的业务逻辑写在 map()方法中(5 ) map()方法(maptask 进程

33、)对每一个 调用一次(6 ) Reducer 的输入数据类型对应 Mapper 的输出数据类型,也是 KV(7 ) Reducer 的业务逻辑写在 reduce()方法中(8 ) Reducetask 进程对每一组相同 k 的组调用一次 reduce()方法(9 ) 用户自定义的 Mapper 和 Reducer 都要继承各自的父类(10 )整个程序需要一个 Drvier 来进行提交,提交的是一个描述了各种必要信息的 job 对象1.7.2 wordcount 示例编写需求:在一堆给定的文本文件中统计输出每一个单词出现的总次数(1)定义一个 mapper 类/首先要定义四个泛型的类型/keyi

34、n: LongWritable valuein: Text/keyout: Text valueout:IntWritablepublic class WordCountMapper extends Mapper/map 方法的生命周期: 框架每传一行数据就被调用一次/key : 这一行的起始点在文件中的偏移量/value: 这一行的内容Overrideprotected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException /拿到一行数据转换为 stri

35、ngString line = value.toString();/将这一行切分出各个单词String words = line.split(“ “);/遍历数组,输出 for(String word:words)context.write(new Text(word), new IntWritable(1);(2)定义一个 reducer 类/生命周期:框架每传递进来一个 kv 组,reduce 方法被调用一次Overrideprotected void reduce(Text key, Iterable values, Context context) throws IOException

36、, InterruptedException /定义一个计数器int count = 0;/遍历这一组 kv 的所有 v,累加到 count 中for(IntWritable value:values)count += value.get();context.write(key, new IntWritable(count);(3)定义一个主类,用来描述 job 并提交 jobpublic class WordCountRunner /把业务逻辑相关的信息(哪个是 mapper,哪个是 reducer,要处理的数据在哪里,输出的结果放哪里)描述成一个 job 对象/把这个描述好的 job 提交

37、给集群去运行public static void main(String args) throws Exception Configuration conf = new Configuration();Job wcjob = Job.getInstance(conf);/指定我这个 job 所在的 jar 包/ wcjob.setJar(“/home/hadoop/wordcount.jar“);wcjob.setJarByClass(WordCountRunner.class);wcjob.setMapperClass(WordCountMapper.class);wcjob.setRedu

38、cerClass(WordCountReducer.class);/设置我们的业务逻辑 Mapper 类的输出 key 和 value 的数据类型wcjob.setMapOutputKeyClass(Text.class);wcjob.setMapOutputValueClass(IntWritable.class);/设置我们的业务逻辑 Reducer 类的输出 key 和 value 的数据类型wcjob.setOutputKeyClass(Text.class);wcjob.setOutputValueClass(IntWritable.class);/指定要处理的数据所在的位置File

39、InputFormat.setInputPaths(wcjob, “hdfs:/hdp-server01:9000/wordcount/data/big.txt“);/指定处理完成之后的结果所保存的位置FileOutputFormat.setOutputPath(wcjob, new Path(“hdfs:/hdp-server01:9000/wordcount/output/“);/向 yarn 集群提交这个 jobboolean res = wcjob.waitForCompletion(true);System.exit(res?0:1);2.2 MAPREDUCE 程序运行模式2.2.

40、1 本地运行模式(1 ) mapreduce 程序是被提交给 LocalJobRunner 在本地以单进程的形式运行(2 ) 而处理的数据及输出结果可以在本地文件系统,也可以在 hdfs 上(3 ) 怎样实现本地运行?写一个程序,不要带集群的配置文件(本质是你的 mr 程序的conf 中是否有 mapreduce.framework.name=local 以及 yarn.resourcemanager.hostname 参数)( 4) 本地模式非常便于进行业务逻辑的 debug,只要在 eclipse 中打断点即可如果在 windows 下想运行本地模式来测试程序逻辑,需要在 windows

41、中配置环境变量: HADOOP_HOME = d:/hadoop-2.6.1%PATH% = HADOOP_HOME bin并且要将 d:/hadoop-2.6.1 的 lib 和 bin 目录替换成 windows 平台编译的版本2.2.2 集群运行模式(1 ) 将 mapreduce 程序提交给 yarn 集群 resourcemanager,分发到很多的节点上并发执行(2 ) 处理的数据和输出结果应该位于 hdfs 文件系统(3 ) 提交集群的实现步骤:A、将程序打成 JAR 包,然后在集群的任意一个节点上用 hadoop 命令启动$ hadoop jar wordcount.jar c

42、n.itcast.bigdata.mrsimple.WordCountDriver inputpath outputpathB、直接在 linux 的 eclipse 中运行 main 方法(项目中要带参数:mapreduce.framework.name=yarn 以及 yarn 的两个基本配置)C、如果要在 windows 的 eclipse 中提交 job 给集群,则要修改 YarnRunner 类Comment dht2: Combiner的使用要非常谨慎因为 combiner在 mapreduce过程中可能调用也肯能不调用,可能调一次也可能调多次所以:combiner 使用的原则是:

43、有或没有都不能影响业务逻辑mapreduce程序在集群中运行时的大体流程:附:在 windows平台上访问 hadoop时改变自身身份标识的方法之二:3. MAPREDUCE中的 Combiner(1 ) combiner是 MR程序中 Mapper和 Reducer之外的一种组件(2 ) combiner组件的父类就是 Reducer(3 ) combiner和 reducer的区别在于运行的位置:Combiner是在每一个 maptask所在的节点运行Reducer是接收全局所有 Mapper的输出结果;(4) combiner的意义就是对每一个 maptask的输出进行局部汇总,以减小网

44、络传输量具体实现步骤:1、 自定义一个 combiner继承 Reducer,重写 reduce方法2、 在 job中设置: job.setCombinerClass(CustomCombiner.class)(5) combiner能够应用的前提是不能影响最终的业务逻辑而且,combiner 的输出 kv应该跟 reducer的输入 kv类型要对应起来3. MAPREDUCE 原理篇(2)3.1 mapreduce 的 shuffle 机制3.1.1 概述: mapreduce 中,map 阶段处理的数据如何传递给 reduce 阶段,是 mapreduce 框架中最关键的一个流程,这个流程

45、就叫 shuffle; shuffle: 洗牌、发牌 (核心机制:数据分区,排序,缓存) ; 具体来说:就是将 maptask 输出的处理结果数据,分发给 reducetask,并在分发的过程中, 对数据按 key 进行了分区和排序;3.1.2 主要流程:Shuffle 缓存流程:shuffle 是 MR 处理流程中的一个过程,它的每一个处理步骤是分散在各个 map task 和reduce task 节点上完成的,整体来看,分为 3 个操作:1、 分区 partition2、 Sort 根据 key 排序3、 Combiner 进行局部 value 的合并3.1.3 详细流程1、 mapta

46、sk 收集我们的 map()方法输出的 kv 对,放到内存缓冲区中2、 从内存缓冲区不断溢出本地磁盘文件,可能会溢出多个文件3、 多个溢出文件会被合并成大的溢出文件4、 在溢出过程中,及合并的过程中,都要调用 partitoner 进行分组和针对 key 进行排序5、 reducetask 根据自己的分区号,去各个 maptask 机器上取相应的结果分区数据6、 reducetask 会取到同一个分区的来自不同 maptask 的结果文件, reducetask 会将这些文件再进行合并(归并排序)7、 合并成大文件后,shuffle 的过程也就结束了,后面进入 reducetask 的逻辑运算

47、过程(从文件中取出一个一个的键值对 group,调用用户自定义的 reduce()方法)Shuffle 中的缓冲区大小会影响到 mapreduce 程序的执行效率,原则上说,缓冲区越大,磁盘 io 的次数越少,执行速度就越快 缓冲区的大小可以通过参数调整, 参数:io.sort.mb 默认 100M3.1.4 详细流程示意图3.2. MAPREDUCE 中的序列化3.2.1 概述Java 的序列化是一个重量级序列化框架(Serializable) ,一个对象被序列化后,会附带很多额外的信息(各种校验信息,header,继承体系。 。 。 。 ) ,不便于在网络中高效传输;所以,hadoop 自

48、己开发了一套序列化机制( Writable) ,精简,高效3.2.2 Jdk 序列化和 MR 序列化之间的比较简单代码验证两种序列化机制的差别:public class TestSeri public static void main(String args) throws Exception /定义两个 ByteArrayOutputStream,用来接收不同序列化机制的序列化结果ByteArrayOutputStream ba = new ByteArrayOutputStream();ByteArrayOutputStream ba2 = new ByteArrayOutputStrea

49、m();/定义两个 DataOutputStream,用于将普通对象进行 jdk 标准序列化DataOutputStream dout = new DataOutputStream(ba);DataOutputStream dout2 = new DataOutputStream(ba2);ObjectOutputStream obout = new ObjectOutputStream(dout2);/定义两个 bean,作为序列化的源对象ItemBeanSer itemBeanSer = new ItemBeanSer(1000L, 89.9f);ItemBean itemBean = new ItemBean(1000L, 89.9f);/用于比较 String 类型和 Text 类型的序列化差别Text atext = new Text(“a“);/ atext.write(dout);itemBean.write(dout);byte byteArray = ba.toByteArray();/比较序列化结果Sys

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报