Hadoop知识点整理

2023-11-19

知识点大纲

一、初识Hadoop
1. mapreducer 和rdbms区别
2. 结构化数据,非结构化数据,半结构化数据
3. hadoop发展历程

二、关于MapReducer
1. 新老API对比
2. MapReducer 执行步骤
3. combiner函数
4. shuffle过程

三、HDFS
1. HDFS基本介绍
2. HDFS 设计目的
3. HDFS架构
4. HDFS组件
5. NameNode启动过程
6. 联邦和高可用
7. HDFS 读写流程
8. HDFS 保证完整性
9. 一致性模型
10. block的副本放置策略

四、Hadoop的I/O操作
1. 完整性
2. 压缩
3. 序列化

五、Hadoop YARN
1. yarn的架构
2. yarn job提交流程
3. yarn失败机制
4. yarn调度策略

六、二次排序和join
1. 二次排序
2. join

其他
MapReducer计数器
MapReducer的类型
hadoop 集群的安全性
map数量问题
推测执行


一、初识Hadoop

  1. mapreducer 和rdbms区别
  2. 结构化数据,非结构化数据,半结构化数据
  3. hadoop发展历程

  1. mapreducer和rdbms比较

这里写图片描述

  1. 结构化数据,非结构,半结构化数据

结构化数据:例如数据库表,xml;
半结构化数据:例如电子表格,日志文件等;
非结构化数据:例如纯文本,图像等;

  1. hadoop 发展历程

主要体现在发行版本上
这里写图片描述


hadoop的项目组成:
common,mapreducer,hdfs,yarn

yarn是资源管理,hdfs ha 是高可用解决单点问题,hdfs 联邦是分区管理。

hadoop1和hadoop2的区别是什么?
yarn,hdfs ha,hdfs联邦。


二、关于MapReducer

  1. 新老API对比
  2. MapReducer 执行步骤
  3. combiner函数
  4. shuffle过程

1. 新老API对比

新老API即时hadoop2和hadoop的API区别:
这里写图片描述

2. MapReducer 执行步骤

这里写图片描述

宏观上MapReducer的5个执行步骤:
1). input: 获取输入数据进行分片作为map的输入 ;
2). map:map过程对某种输入格式的一条记录解析成一条或多条记录;
3). shuffle:数据混洗,描述着数据从map task输出到reduce task输入的过程。如果没有reducer环节,也就没有shuffle了;
4). reducer:对系统key的数据进行合并;
5). output: 按照格式输出到指定目录。

3. combiner函数

首先理解为什么存在combiner函数,因为宽带资源宝贵,尽量减少map和reducer之间的数据传输以节省资源

combiner函数可以理解为map端的reducer

但是combiner函数的应用还需要看具体的场景,比如最大值,最小值,单词计数等,是可以的。但是平均数就不能用combiner了。

4. shuffle过程

这里写图片描述

shuffle主要分为map端shuffle和reducer端shuffle两个阶段。

map端shuffle:

1). inputSplit分配给一个Map之后,会产生输出,输出就先放在缓存里面,每个map有一个环形内存缓冲区,用于存储任务的输出,默认大小为100MB。一旦达到阈值0.8(io.sort.spil l.percent),一个后台线程就把 内容溢写到(spill)磁盘中,溢写过程的同时map仍然会继续输出,如果在此期间缓冲区被填满,map就会被阻塞,直至写磁盘过程完成。

2). 写磁盘前,要进行partition、sort和combine等操作。通过分区,将不同分区的数据分开处理,之后对不同分区的数据进行排序,如果有combine,还要对排序后的数据进行combine。等最后记录写完,将全部溢出文件合并为一个分区且排序的文件。在合并的时候,还要做一次combiner

3). 最后,将磁盘中的数据发送给对应reducer中。

reducer端shuffle:

1). reducer首先要知道哪个map执行完了,然后去它那把自己partition分区中的数据拿过来。在处理过程中,也是当内存中数据达到80M,就溢写到本地磁盘,然后merge合并。

2). 在溢写的时候,要sort排序,然后merge合并的时候,是根据key进行分组的。

3). 然后reducer通知map,已经执行完了,可以删除该partition数据了。

4). reducer执行完的结果保存到hdfs上。

注意:
1). partition按key取哈希取模来进行分区,如果是取模是1,那就啥子啊partition1中对应reducer 1。reducer都是编号的,对应的partition也是编号的,所以设置reducer个数,也就是设置map端的partition个数,有几个partition就有几个reducer。

2). combine是reducer逻辑代码,在map端做reducer来减轻传送占用网络压力。

3).关于reducer要知道哪个map执行完了这个问题。旧版是通过jobtracker和tasktracker获取。而新版是ApplicationMaster


三、HDFS

  1. HDFS基本介绍
  2. HDFS 设计目的
  3. HDFS架构
  4. HDFS组件
  5. NameNode启动过程
  6. 联邦和高可用
  7. HDFS 读写流程
  8. HDFS 保证完整性
  9. 一致性模型
  10. block的副本放置策略

1. HDFS基本介绍

a. HDFS是服务于Hadoop的分布式文件系统
b. 块的概念
HDFS也有块的概念,不过是更大的单元,默认是128MB。与单一磁盘上的文件系统相似,HDFS上的文件也被分为以块为大小的分块,作为单独的单元存储。

c. NameNode和DataNode
HDFS集群以Master-Slave模式运行,主要有两类节点:一个NameNode(即Master)和多个DataNode(即Slave)。
NameNode:它管理着文件系统的Namespace。它维护着文件系统树(filesystem tree)以及文件树中所有的文件和文件夹的元数据(metadata)。管理这些信息的文件有两个,分别是NameNode镜像文件(fsimage)和操作日志文件(edit log)。
DataNode:DataNode是文件系统的工作节点,他们根据客户端或者hiNameNode的调度存储和检索数据,并且定期向NameNode发送他们所存储块(block)的列表。

2. HDFS 设计目的

1). 解决超大文件,一台机器存储不下
2). 可以在廉价的pc上存储
3). 一次写入,多次读取
4). 高吞吐写入
5). 不支持修改,只支持追加

HDFS是为了处理大型数据的,主要是为达到到的数据吞吐量而设计的,这就看你要求以高延迟作为代价。

3. HDFS架构

这里写图片描述

HDFS架构分为:namenode,datanode,SecondaryNameNode

namenode是master主节点;

datanode是数据节点;

SecondaryNameNode是合并日志和镜像文件辅助namenode启动节点。一般建立了HA就不用SNN。

4. HDFS组件

  • Nameode(主节点):主要存储元数据和提供访问;
    元数据包括三部分:
    1). 文件夹,文件树(目录结构,权限,大小,block数量);
    2). 文件与blockid映射(一个文件由哪些block组成)
    3). blockid与datanode映射(也就是datanode上有哪些block)
    **注意:**1,2是永久保存在fsimage文件中,3的数据是namenode启动时有datanode汇报获取到内存中。

  • Datanode:真正存储数据的地方,datanode记录block存在磁盘具体地址;

  • SecondaryNameNode (检查点,后备点):
    当NameNode启动时,需要合并硬盘上的fsimage(HDFS的最新状态)和edits(fsimage创建后的),需要消耗大量的时间。
    这里的SecondaryNameNode定时去下载NameNode的fsimage文件和edits文件进行合并,同时namenode上启动新的edits,然后再将合并后的fsimage上传覆盖namenode,并开启一个新的edits日志,减少了hdfs启动时间。
    这里写图片描述

  • journalnode:用在HA模式下共享edits文件

  • fsimage&edits
    fsimage:保存最近一次checkpoint的时间的元数据,默认只有在NameNode启动时才会出现检查点。
    edits:实时把增加文件、重命名文件、删除目录等操作命令写入到edits文件中(操作日志)

5. NameNode启动过程

第一次启动NameNode
1).硬盘中间fsimage加载到内存中,hdfs文件如果修改,将写edit文件作为log,并将最新修改内容加载到内容中。
2).同时SecondaryNameNode,将不断地从namenode中下载并合并相应的fsimage+edits,并上传到namenode,nomenode修改原fsimage,替换为新的fsimage。
3). datanode向namenode进行注册。每个3秒,DataNode向namenode注册心跳的间隔时间。每小时datanode默认向namenode发送block report。汇报datanode的数据节点情况。

第二次启动
namenode硬盘中将新的fsimage加载到内存中,并进行改写edits,其他的与第一次启动相似。

HDFS nameNode启动过程:安全模式

在启动时,NameNode进入一个特殊的状态称之为安全模式。当NameNode进入安全模式之后数据库的复制将不会发生。在安全模式下,各个datanode会向NameNode发送最新的块列表信息,如果和记录的数据块个数对上了99%,然后停留30s(因为有可能网络延迟)之后就脱离安全模式。

在安全模式下可以读取数据。

6. 联邦和高可用

联邦: 因为一个namenode支持不了太大集群的数据,然后就用命名空间隔开,重新启动一个namenode两个互不干扰,互不通信,互相独立。

这里写图片描述

高可用 :hdfs的HA就是高可用,因为一个节点namenode有可能挂掉,我们可以启动一个备用的namenode,当他挂掉了,备用的顶上。


hdfs的HA 架构:

这里写图片描述

1). 有2个namenode,一个是active NN,另一个是standby NN。当Active NN失败时,standby NN将会启动,代替原来的active NN成为新的active NN,在成为新的active NN前,读取所有的JN里面的修改日志,这样就能高可靠与挂掉的NN的目录镜像树保持一致。

2). 为了保持standby NN与active NN的数据保持一致,他们之间交互通过JournalNode。任何的修改操作在active NN上执行时,JN进程同时也会记录修改log。

3). zookeeper:zk启动一个zkfc来管理zk临时节点。zk有永久文件和临时文件,做HA一般用临时的文件。当active NN挂掉以后,zk上面的文件自动取消了,然后zkfc检查到zk的文件没了,就把备用的注册成活的。

7. HDFS 读写流程:

写流程:

这里写图片描述

1). 客户端Client,向远程的nn发起写入文件请求;
2). nn会检查写入的文件是否已经存在,创建者是否有权限进行操作;
3). 写入文件时,DFSOutputstream 将多个文件分成多个数据包,并写入内部队列;
4). 然后开始以管道的形式将数据包写入所有副本中。数据包以流的形式写入第一个datanode,该datanode把数据包存储后,在将其传递给此管线中的下一个datanode,直到最后一个datanode,这种写数据的方式以流水线的形式;
5). DFSOutputsteam 也维护着一个数据包队列,等待datanode的确认回执,称为确认队列,收到所有DataNode返回的成功回执后,该数据包才会从确认队列删除;
6). 客户端完成数据写入后,对数据流调用close方法;
7). 该close操作将剩余的所有数据包写入DataNode管线,并联系到NameNode且发送文件写入完成信号。


对于第5步写入时故障处理:

如果传输过程中,有某个datanode出现故障了:
1). 首先关闭管线,以确保把队列中的所有数据包都添加回数据队列的最前端,以确保故障节点下游的datanode不会漏掉任何一个数据包;

2). 为存储在另一正常datanode的当前数据块指定一个新的标识,并将标识传送给NameNode(* 标记故障DataNode*,以便故障datanode在恢复后可以输出存储的部分数据块)
3). 从管线中删除数据节点并且把余下的数据块写入管线中另外正常的DataNode;
4).namenode发现块副本量不足是,会在另一个节点创建一个新的副本。

在写入数据的时候每个块生成hash,隐藏起来,用来后面做检查数据块是否正常,例如在读取数据时候,读取出数据块生成的hash与之前的hash对比,是不是一样,通过这个判断是否损坏。

读流程:

这里写图片描述

1). 客户端(client)用DistributeFileSystem的open()函数打开文件
2). DistributeFileSystem用RPC调用元数据节点,得到文件的数据块信息。
3). DistributeFileSystem 返回FSDataInputStream给客户端,用来读取数据。
4). 客户端调用stream的read()函数开始读取数据。
5). DFSInputStream连接保存次文件第一个数据块的最近的数据节点。数据从数据节点读到客户端(client)
6). 当此数据块读取完毕是,DFSInputStream关闭和此数据节点的理解。然后连接此文件下一个数据块的最近的数据节点。当客户端读取完毕数据的时候,调用FSDataInputStream的close函数关闭。

错误处理:在读取数据的过程中,如果客户端在于数据节点通信出现错误,则尝试理解包含次数据块的下一个数据节点。故障的数据节点将被记录,以后不再访问。

校验数据块是否正常:通过在写入时生成的hash,与之前的hash进行对比,是不是一样,通过这个判断是否损坏。

8. HDFS 保证完整性

1). hdfs在写入的时候生成一个块的校验和(hash值)保存在相同目录下隐藏起来;
2). 然后在读取数据时,读取块生成的hash和之前的对比是否一样,通过这个判断是否损坏;
3). 在启动的时候,也会检测数据块是否损坏,具体跟上面一样;
4).如果损坏就向namenode报告,然后从别的节点复制副本过,达到 完整性 。

3个方面:写入的时候,读取的时候,datanode启动一个后台进程

9. 一致性模型

读和写保证一致性

HDFS提供了一个方法来使所有缓存与数据节点强行同步,即对FSDataOutputStream调用sync()方法。在sync()返回成功后,HDFS能保证文件中直至写入的最后的数据对所有新的reader而言,都是可见且一致的

10. block的副本放置策略

这里写图片描述

hdfs的文件副本默认是3个,带上本身就是总共4个文件。


四、Hadoop的I/O操作

  1. 完整性
  2. 压缩
  3. 序列化

1. 完整性

数据完整性:存储在磁盘上的数据没有损坏。
hadoop是存储大量的数据的文件系统,受网络、硬件损坏等因素。数据损坏机率就比较大,所以我们要考虑数据完整性。

hadoop提供了一种“校验和”的机制来检测数据的完整性

hdfs是在写入的时候生成一个一个块的校验和保存在系统目录下隐藏文件。默认一个内容计算出的校验和最大是512字节。
每个DataNode后台会启动一个进程扫描自己加点上的数据块是否损坏,如果有损坏就报告给NameNode,而后那么那么node平衡副本数。通知DataNode删除损坏块。

常用的集中数据校验方式有奇偶校验,CRC校验、LRC校验、格雷码校验、和校验、异或校验等。
HDFS默认用crc-32位校验和,所以只占4字节。

2. 压缩

好处:是减少了存储文件所占磁盘空间,另一个加速数据在网络和磁盘上的传输。

常见的压缩算法:
这里写图片描述

压缩分片问题
因为压缩算法都是整体连贯计算的,所以你只读取一个块解压出来的数据就乱码,没有整体计算还原。
这种压缩情况下,mapreducer会判断后缀是否要spilt到块进行读取。显然整体压缩算法不支持单个解压,所以mapreducer只能顺序读取这个文件解压处理

在mapreducer中设置压缩算法经常用于shuffle调优,可以减少网络的传输压力。在mapreducer中设置。

3. 序列化

hadoop的rpc要求几个特点:
- 紧凑,快速序列化和反序列化
- 支持扩展
- 支持多种语言互操作

java的serialize序列化不能满足快速要求,所以hadoo自己开发了一套符合自己编码模型的序列化框架writable

hadoop的基本类型都是实现了WritableComparable(该接口继承了Writable接口)序列框架。

这里写图片描述

hadoop中的writable实现了满足大部分需求,但是在有些情况下,我们需要根据自己的需要构造一个新的实现,即定制的Writable。

SequenceFile&MapFile

SequenceFile:特点是Hadoop的一个主要数据文件类型,它提供key-value的存储,但与传统key-value存储(比如hash表,btree)不同的是,它是appendonly的,所以你不能对已存在的key进行写操作。

MapFile:MapFile是已经排序过的SequenceFile,有索引,可以按键查找。
MapFle是一个key-value对应的查找数据结构,由数据文件/data和索引文件/index组成,数据文件包含所有需要层次的key-value对,按key的顺序排列。索引文件包含一部分key值,用以指向数据文件的关键位置。


五、Hadoop YARN

  1. yarn的架构
  2. yarn job提交流程
  3. yarn失败机制
  4. yarn调度策略

Yarn 英文全称:Yet Another Resource Negotiator

1. yarn的架构

这里写图片描述

yarn架构主要为以下四部分:
a. 主节点:ResourceManager

  • 处理客户端请求
  • 启动或监控ApplicationMaster
  • 监控NodeManager
  • 资源的分配与调度

b. 应用管理器:ApplicationMaster

  • 负责数据的切分
  • 为应用程序申请资源并分配给内部任务
  • 任务的监控与容错

c. 从节点:NodeManager

  • 管理单个节点上的资源
  • 处理来自ResourceManager的命令
  • 处理来自ApplicationMaster的命令

d. 抽象资源:Container

  • 对任务运行环境进行抽象,封装CPU,内存等多维度的资源

2. yarn job提交流程

这里写图片描述

a. 作业提交

client调用job.waitForCompletion方法,向整个集群提交Mapreducer作业(第1步)。新的作业ID(应用ID)有资源管理器分配(第2步)。作业的client核实作业的输出,计算输入的split,将作业的资源(包括Jar包,配置文件,split信息)拷贝给HDFS(第3步)。最后,通过调用资源管理器的submitApplication()来提交作业(第4步)

b. 作业初始化

当资源管理器收到submitApplication()的请求时,就将该请求发给调度器(scheduler),调度器分配container,然后资源管理器在该container内启动应用管理器进程,由节点管理器监控(第5步)。

MapReducer作业的应用管理器是一个主类为MRAppMaster的java应用。其通过创造一些bookkeeping对象来监控作业的进度,得到任务的进度和完成报告(第6步)。然后其通过分布式文件系统得到由客户端计算还的输入split(第7步)。然后为每个输入split创建一个map任务,根据mapreducer.job.reducer创建reducer任务对象。

c. 任务分配

  • 如果作业很小(uber),应用管理器会选择在其自己的JVM中运行任务

  • 如果不是小任务,那么应用管理器向资源管理器请求container来运行所有的map和reducer(第8步)。这些请求时通过心跳来传输的,包括每个map任务的数据位置,比如存放输入split的主机名和机架(rack)。调度器利用这些信息来调度任务,尽管将任务分配给存储数据的节点,或者分配给和存放输入split的节点相同机架的节点。

d. 任务运行

当一个任务有资源管理器的调度器分配给一个ontainer后,应用管理器通过联系节点管理器来启动container(第9步)。任务有一个主类为YarnChild的java应用执行。在运行任务之前首先本地化任务需要的资源,比如作业配置,JAR文件,已经分布式缓存的所有文件(第10步)。最后,运行map或reducer任务(第11步)。

e. 进度和状态更新

YARN中的任务将其进度和状态(包括counter)返回给应用管理器,客户端每秒(通过mapreduce.client.progressmonitor.pollinterval设置)想应用管理器请求进度更新,展示给用户。

当客户端读到程序结束的状态,ApplicationMaster清除资源container

f. 作业完成

除了想应用管理器请求作业进度外,客户端没5分钟都会通过调用waitForCompletion()来检查作业是否完成。作业完成后,应用管理器和container会清理工作状态,OutputCommiter的作业清理方法也会被调用。作业的信息会被作业历史服务器存储以备之后用户核查。

注意点:

uber

uber是指小程序和ApplicationMaster运行在同一个JVM。
什么样的mapreducer算是小程序:
小于等于10个map并且reducer只有1个,并且输入的数据大小小于hdfs一个块的大小。

默认开启,可以配置关掉

3. yarn失败机制

a. map或者reducer任务失败机制

当map或者reducer运行有异常,反馈给ApplicationMaster,它会进行尝试重新启动map reducer,如果4次启动不起来就把这个节点上的任务标记成失败,失败数量超过一定数,整个mapreducer任务就停止了。

b. applicationMaster运行失败

ResourceManager首先在另外一个新的容器中启动衣蛾ApplicationMaster。默认是没有保存之前运行任务的状态,所以ApplicationMaster要重新运行任务,这里我们可以优化设置让它重启的时候恢复之前状态,不过要消耗点效率和内存资源。然后客户端程序读取进度状态和是否完成的时候,由于超时,所以它要重新去ResourceManager读取一下新ApplicationMaster地址。重新定位下。

c. 节点管理器运行失败

重新把失败的节点任务分到读取hdfs其他副本机器上运行,保证本地性。

d. 资源管理器运行失败

如果ResourceManager挂掉了,你的应用就不能提交了,你需要重新启动ResourceManager节点,但是正在运行的没有影响。

yarn调度策略

a. 先进先出(FIFO):

一个任务独占集群,就是个队列哪个先来那个就独占资源。这样导致本来小任务作业也会在等着,效率太低。

b. 公平调度:

每个任务平分集群资源,在FIFO基础上做了一个资源平均分配,一开始是提交了一个作业,那么这个作业就占用了整个集群资源,当另外一个作业到来时只能等着它释放完一点,它用一点,慢慢达到平衡,这样会造成后面的任务进来后发现集群还有资源,为什么我的mr程序运行不了。

例如:有两个任务:人工集群总共10G,第一个任务占内存2G,第二个任务占内存8G,如果使用的是公平调度,则每个任务平均5G。第一个任务正常执行消耗2G,虽然此时集群还有8G,但是第二个任务不能正常执行,因为第二个任务只能有5G的使用权限。

c. 容器调度:这个是可伸缩的,可以配置每个任务资源大小。

注意点:
1). yarn内存时用来调度策略的,用container隔离着;你用多少内存,container就包含多少。事业上yarn是粗粒度资源调度框架。
2).资源调度是对不同用户而言,
例如:如果分配了资源后,同一个用户还提交第二任务,如果这个用户先前得到的资源可以够第二任务运行,那么第二个任务可以运行,否则等待。


六、二次排序和join

  1. 二次排序
  2. join

1. 二次排序

二次排序需要自定义的四个组件:

1). 自定义一个key

为什么要自定义自定义一个key,我们知道MapReducer中排序就是按照key来排序的。我们想要实现按照两个字段进行排序,默认的方式肯定不行,所以要自定义一个新的key,key里面有两个属性,也就是我们要排序的两个字段。

首先,实现writableComparable接口,因为key是可序列化并且可以比较的。其次,重载相关的方法,例如序列化、反序列化相关的方法write()、readFields()。重载在分区的时候要用到的hashCode()方法。

注意:下面说道的Partitioner类,也是用来分区的,用hashCode()方法和Paritioner类进行分区都是可以的,使用其中一个即可。重载排序用的compareTo()方法。

2). 分区函数类

进行分发是在分区函数中定义的,这个类继承Paritioner类,重载其中的分区方法getPartition()。

在main()函数里面给job添加上即可,例如:job.setPartitionerClass(xxx.Class)

注意:这个类的作用和新key中的hashCode()方法作用一样,所以如果在新key的hashCode()方法中写了分区的实现,这个分区类是可以省略的。

自定义分区实例: Hadoop自定义分区Partitioner

3). 比较函数类

这个类决定着key的排序规则,是一个比较器,需要继承WritableComparator类,并且重载其中的compare()方法。

在main()函数里给job添加上即可,例如:job.setSortComparatorClass(XXX.class);

注意: 这个类的作用跟自定义key的compareTo方法一样,如果在自定义的key中重载了compareTo()方法,这个类是可以省略的。

4). 分组函数类

通过分区类,我们重新定义了key的分区规则,但是多个key不同的也可以进入一个reducer中,这不是我们想要的。我们想要分区函数来定义什么样的key可以进入相应的reducer来执行,因为也涉及到比较,所以这个类也需要继承WritableComparator,也可以实现RawComparator,并且重载其中的compare()方法。

分组是reduce端的shuffle执行的。如果用combine的话,在map端的combine也有执行。

在main()函数中给job加上即可,如:job.setGroupingComparatorClass(XXX.class)。

自定义分组实例:MapReduce自定义分组Group

二次排序 重要理解:

1). map最后阶段进行partition分区,一般使用job.setPartitionerClass设置的类,如果没有自定义key的hashCode()方法进行分区;

2). 每个分区内部调用job.setSortComparatorClass设置key的比较函数类进行排序,如果没有则使用key的实现的compareTo方法;

3). 当reducer接收到所有map传输过来的数据之后,调用job.setSortComparatorClass设置的key比较函数类对所有数据进行排序,如果没有则使用key的实现compareTo方法;

4). 紧接着使用job.setGroupingComparatorClass设置的分组函数类,进行分组,同一个key的value放在一个迭代器里面。如果未指定GroupingComparatorClass则使用key的实现的compareTo方法来对其分组。

MapReducer详细过程

通过二次排序的几个自定义类,我们可以了解shuffle的详细过程。

这里写图片描述

1). 首先,MapReducer框架通过getSplits()方法实现对原始文件的切片之后,每一个切片对应着一个MapTask,
2). InputSplit输入到map()函数进行处理;
中间结果经过环形缓冲区的排序,然后分区、自定义二次排序(如果有的话)和合并。如果有combine,则进行map端的reduce操作,对数据按照key值进行分组,再进行reducer操作;
3). 再通过Shuffle操作将数据传输到reducer.Task
端;
4).先对数据按照key值进行分组,然后每处理完一个分组之后就会去调用一次reducer()函数;
5). reducer端也存在着缓冲区,数据也会在缓冲区和磁盘中进行合并排序等操作;
6). 最终输出结果。

二次排序的实例实现:Hadoop二次排序及MapReduce处理流程实例详解

2. join

三种策略:
a. 重分区连接(Repartition join)——reducer端连接。使用场景:连接两个或多个大型数据集。

基本思路:
1). Map端读取所有的文件,并在输出的内容里加上标示,代表数据是从哪个文件里面来的。
2). 在reducer处理函数中,按照标识对数据进行处理。
3). 然后根据Key去join来求出结果直接输出。

这里写图片描述

reducer端连接的实例:MapReduce 表连接之Reduce端Join

b. 复制连接(Replication join)——map端连接。使用场景:待连接的数据集中有一个数据集小到完全可以放在缓存中。

基本思路:
1). 需要join的两个文件,一个层次在HDFS中,一个使用DistributedCache.addCacheFile()将小表分发到各个map端
2). 在map端函数里读取该文件,进行join
3). 将结果输出到reducer
4). DistributedCache.addCacheFile()需要在作业提交前设置

map端连接的实例:MapReduce表连接操作之Map端join

c. 半连接(Semi-join)——另一个map端连接。使用场景:待连接的数据集中有一个数据集非常大,但同时这个数据集的连接键可以被过滤成小到可以放在内存中。

基本思路:
1). 利用DistributedCache将较小的表的连接键数据分发到各个节点上,生成set集合
2). 在map端函数执行时,对每个数据的连接键进行判断是否在set集合中,如果不存在就过滤。使这条数据不用参与shuffle过程。这是join的shuffle调优的一种做法

半连接的实例:MapReduce表连接之半连接SemiJoin


其他


MapReducer计数器

1. MapReducer计数器是什么?

计数器是用来记录job的执行进度和状态。它的作用可以理解为日志。我们可以在程序的某个位置插入计数器,记录数据或者进度的变化情况。

2. MapReducer计数器能做什么?

MapReducer计数器(Counter)为我们提供一个窗口,用于观察MapReducer Job运行期的各种细节数据。对MapReducer性能调优很有帮助,MapReducer性能优化的评估大部分都是基于这些Counter的数值表现出来的。

3. MapReducer有哪些内置计数器?

1). 任务计数器

2). 文件系统计数器

3). FileInputFormat计数器

4). FileOutputFormat技术器

5). 作业计数器

4. 自定义计数器

这里写图片描述

这里写图片描述

这里写图片描述

设置计数器的时候有两个名字,一个是属于哪个组,一个是真正的计数器名字,设置计数器是为了跟踪代码调优。

可以参考自定义计数器的实例:Hadoop自定义计数器Counter

MapReducer的类型

Hadoop的Mapreducer中,map和reducer函数遵循如下常规格式:
map:(k1,v1)→list(k2,v2)

reducer:(k2,list(v2))→list(k3,v3)

如果使用combiner函数,它与reduce函数的形式相同(它是Reducer的一个实现),不同之处是它的输出类型是中间的键/值对类型(K2和V2),这些中间值可以输入reduce函数:

map:(k1,v1)→list(k2,v2)
combiner:(k2,list(v2))→list(k2,v2)
reducer:(k2,list(v2))→list(k3,v3)

combine函数与reduce函数通常是一样的,在这种情况下,k3与k2类型相同,v3与v2类型相同。

hadoop 集群的安全性

hadoop负责登录用户验证kerberos负责登录用户验证

开启kerberos需要安装kdc或者KMS。
我们用户先请求kerberos取到登录票据,然后去hadoop出示自己的票据,证明自己合法,然后操作hadoop,用户请求Kerberos需要登录名和密码。

大概步骤:认证,授权,请求hadoop服务。

Kms和HDFS配合使用的作用是在补全hdfs权限管控的安全漏洞,正常使用hdfs时,用户感觉不到文件加密的存在,所以叫“hdfs透明加密”

map数量问题

map数量取决于:

1). 如果想增加map个数,则设置mapred.map.tasks为较大的值。
2). 如果想减少map个数,则设置mapred.min.split.size为一个较大的值。
3). 如果输入中有很多小文件,依然想减少map个数,则需要将小文件merger为大文件,然后使用准则2。

详情可以参考:mapreducer中map进程的数量是怎样控制

推测执行

推测执行就是AP发现其他reduce任务,或者map任务都执行完了,这个任务还没执行完。这时在之前结束执行块的机器上重启一个任务。两个任务同时执行,谁先执行就用谁的结果。

缺点:浪费资源,一般关掉推测执行。关键是,如果某个任务是数据倾斜造成这个任务运行慢,如果用推测执行,再启动一个,就浪费资源,而且也不一定能执行成功。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Hadoop知识点整理 的相关文章

随机推荐

  • Failed to connect to https://changelogs.ubuntu.com/meta-release-lts. Check your Internet connection

    ssh连接ubuntu之后出现Failed to connect to https changelogs ubuntu com meta release lts Check your Internet connection 解决方法如下 1
  • 命令行窗口-隐藏黑窗口

    要想cmd运行时隐藏黑窗口 最好的方法是使用vbs文件实现 1 新建run vbs 编辑内容 set ws WScript CreateObject WScript Shell ws Run run bat 0 run bat放到同目录下
  • 银联与支付宝

    摘要 银联终于要结束12年的垄断生涯 在银联12年的发展过程中 最为引人注目的就是和支付宝的多年恩怨 这十年 双方经历了从最初的会面 到不欢而散 再到各自成长和冲突 十年后 银联和支付宝都已经成为各自领域的全球顶级玩家 但是目前仍未达成实质
  • Qt项目ui文件中新添加的控件在代码中不识别的问题解决

    今天在学Qt框架的信号槽 然后发现在ui中加的控件 通过ui gt 找不到 没有识别 于是上网查找了一下问题 解决方法 添加ui控件后 执行程序 退出程序 将debug目录下的ui XXXX h拷贝到程序目录下 重新打开就可以使用新添加的控
  • 偷偷学习shell脚本之循环语句和转义字符

    目录 一 for循环语句 二 while循环语句 三 until循环语句 四 结束循环 break和continue 五 IFS字段分隔符 补充 六 转义字符 面对列表重复任务时 if语句难以满足需求 按着顺序编写 又非常耗时间 这时候就需
  • 【阅读笔记】联邦学习实战——联邦学习医疗健康应用案例

    联邦学习实战 联邦学习医疗健康应用案例 前言 1 医疗健康数据概述 2 联邦医疗大数据与脑卒中预测 2 1 联邦数据预处理 2 2 联邦学习脑卒中预测系统 3 联邦学习在医疗影像中的应用 3 1 肺结节案例描述 3 2 数据概述 3 3 联
  • 超越所有MIM模型的BEiT v2来了!微软使用矢量量化视觉Tokenizers的掩码图像建模!

    写在前面 蒙面图像建模 MIM 通过恢复损坏的图像patch 在自监督表示学习中展示了令人印象深刻的结果 然而 大多数方法仍然对低级图像像素进行操作 这阻碍了对表示模型的高级语义的利用 在这项研究中 作者提出使用语义丰富的视觉标记器作为掩码
  • 【论文精读】ViLT: Vision-and-Language Transformer Without Convolution or Region Supervision

    Hierarchical Text Conditional Image Generation with CLIP Latents 前言 Abstract 1 Introduction 2 Background 2 1 Taxonomy of
  • Android编译之常用配置及mk模板使用(汇总一)

    Android编译之常用配置及mk模板使用 引言 编译选项 1 eng 2 user 3 userdebug 模块编译常量宏 常用模块编译模板 1 编译一个APK 2 编译一个Java 共享库和静态库 3 编译一个Native 共享库和静态
  • 利用python做数据分析

    数据分析是指对数据进行控制 处理 整理 分析的过程 在这里 数据 是指结构化的数据 例如 记录 多维数组 Excel 里的数据 关系型数据库中的数据 数据表等 1 为什么要用python做数据分析 很多人都有兴趣选择python作为数据分析
  • 阿里P7大牛亲自教你!妈妈再也不用担心我的面试,讲的明明白白!

    第一次观看我文章的朋友 可以关注 点赞 转发一下 每天分享各种干货技术和程序猿趣事 前言 随着移动终端的快速发展 Android开发人员也越来越多 Android开发市场也进入了一个饱和的状态 Android开发人员也面临着难找一份好工作的
  • 虚拟机 服务器死机,VMware虚拟机开机卡死黑屏,进不了系统解决办法

    Vmware虚拟机Linux Ubuntu CentOS windowns开机启动卡死黑屏 想重置虚拟机又没有拍摄快照 重新装一次虚拟机 别着急 这里有个方法可以试一试 VMware 15 5 0 build 14665864 物理机操作系
  • python怎么算数据平均数,python怎样求10个数的平均数

    python怎样求10个数的平均数 发布时间 2021 03 12 09 18 47 来源 亿速云 阅读 100 作者 小新 这篇文章主要介绍了python怎样求10个数的平均数 具有一定借鉴价值 感兴趣的朋友可以参考下 希望大家阅读完这篇
  • Java JDBC快速上手

    一 JDBC介绍 JDBC Java DataBase Connectivity Java的数据库连接 JDBC 本质上是由sun公司开发的一套操作数据库的接口 规范 各个数据库厂商要想使用Java连接自己的数据库 都必须按照JDBC接口的
  • r如何让新增加的列出现在第一列 r如何调整新增加的列的位置

    https www cnblogs com liujiaxin2018 p 16211983 html 1 任意位置插入列 复制代码 gt a lt letters 1 5 gt b lt LETTERS 1 5 gt c lt sampl
  • 单元测试方法

    目录 一 单元测试概述 目录 一 单元测试概述 1 单元测试是什么呢 2 我们目前测试方法是怎么进行的 存在什么问题 3 Junit单元测试框架 4 JUnit优点 二 单元测试实现步骤 1 需求 使用单元测试进行业务方法预期结果 正确性测
  • AltiumDesigner下载安装

    原文来自公众号 工程师看海 AltiumDesigner的特点是交互人性化 上手简单 显示画面美观 是很多硬件工程师入门之选 在我的公众号 后台回复 altium designer 可以得到altium designer的安装包和和谐方法
  • 【ES】QueryBuilder构造ES查询条件:精准匹配、模糊搜索、范围查询、and、or

    private QueryBuilder getQueryBuilder termsQuery key obj1 obj2 一次匹配多个值 matchQuery key Obj 单个匹配 field不支持通配符 前缀具高级特性 multiM
  • Mysql分库分表方案

    Mysql分库分表方案 Mysql分库分表方案 1 为什么要分表 当一张表的数据达到几千万时 你查询一次所花的时间会变多 如果有联合查询的话 我想有可能会死在那儿了 分表的目的就在于此 减小数据库的负担 缩短查询时间 mysql中有一种机制
  • Hadoop知识点整理

    知识点大纲 一 初识Hadoop 1 mapreducer 和rdbms区别 2 结构化数据 非结构化数据 半结构化数据 3 hadoop发展历程 二 关于MapReducer 1 新老API对比 2 MapReducer 执行步骤 3 c