Hadoop总结

目录

HDFS 

1.角色

2.读写流程

3.小文件的弊处和调优

Mapreduce 

1.mapreduce整个过程,包括shuffle

2.hadoop中mapreduce的优化

3.mapreduce和spark的shuffle的区别

Yarn

1.角色

2.工作机制

3.调度器

4.yarn-local,yarn-client

Hadoop其他综合性问题

Hadoop宕机

 Hadoop解决数据倾斜方法

集群资源分配参数(项目中遇到的问题)

HDFS在上传文件的时候,如果其中1个块突然损坏了怎么办?

哪些场景才能使用Combiner呢?

评述hadoop运行原理?

Hadoop性能调优

 描述一下hadoop中,有哪些地方使用了缓存机制,作用分别是什么?

 Hadoop如何实现高并发?

用mapreduce实现sql语句 select count(x) from a group by b?

用mapreduce如何实现两张表连接,有哪些方法?

combiner, partition作用?

举一个简单的例子说明mapreduce是怎么来运行的 ?

MapReduce中排序发生在哪几个阶段??这些排序是否可以避免,为什么?

请列出hadoop进程名

 Hive语句实现WordCount

给定A,B两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,找出A,B文件共同的url

一亿条数据获取前1000个最大的值

为什么Hadoop默认文件大小是128M?


HDFS 


1.角色

DataNode:数据节点

NameNode:处理客户端读写请求,内存中存放元数据fsimage和元数据操作记录日志edits,管理hdfs命名空间,管理DataNode,保持心跳

SecondaryNameNode:是NameNode的冷备份,是其小弟,定时(默认一小时)为NameNode汇总fsimage和edits并输送给NameNode。

2.读写流程

3.小文件的弊处和调优

弊处:

(1)影响NameNode的寿命,因为文件元数据存储在NameNode的内存中

(2)Map任务过多,比如每个小的文件都会生成一个Map任务

(3)JVM开关浪费时间

调优:

(1)合并小文件:对小文件进行归档(Har自定义Inputformat小文件存储成SequenceFile文件。

(2)采用ConbinFileInputFormat来作为输入,解决输入端大量小文件场景。

(3)对于大量小文件Job,可以开启JVM重用

Mapreduce 


1.mapreduce整个过程,包括shuffle

 shuffle就是map方法之后,reduce方法之前。shuffle是对map方法后的输出进行不断归并排序最后根据reduce个数进行分区,将不同分区输送给对应reduce的过程。上图是4个Map,3个Reduce。

mapreduce整体流程:

a.如果输入数据的压缩形式是可以分片的话,就对数据进行分片操作,128M/片。

b.每个分片对应一个map任务来处理。Map方法之后,数据首先进入到分区方法,把数据标记好分区,然后把数据发送到环形缓冲区;环形缓冲区默认大小100m,环形缓冲区达到80%时,进行溢写;溢写前对数据进行排序排序按照对key的索引进行字典顺序排序,排序的手段快排;溢写产生大量溢写文件,需要对溢写文件进行归并排序;对溢写的文件也可以进行Combiner操作,前提是汇总操作,求平均值不行。最后将文件按照分区存储到磁盘,等待Reduce端拉取。

c.每个Reduce拉取Map端对应分区的数据。拉取数据后先存储到内存中,内存不够了,再存储到磁盘。拉取完所有数据后,采用归并排序将内存和磁盘中的数据都进行排序。在进入Reduce方法前,可以对数据进行分组操作

上述中红色部分为shuffle过程。

2.hadoop中mapreduce的优化

对过多溢出小文件的优化方式如上HDFS中所述。

提高环形内存缓冲区大小设置

提高环形内存缓冲区溢出比例设置(90%)

对于map输入端数据,压缩数据,减少网络IO的的时间,选择可分片的压缩形式(LOZP,Bzip2,),在map之后,reduce之前,数据最重要的特性是快,选择压缩形式Snappy,LOZP。

归并溢出文件时设置一次性归并更多数量的文件,减少归并次数。

合理设置Map数量和Reduce数量。太少,会导致Task等待,延长处理时间;太多,会导致 Map、Reduce任务间竞争资源,造成处理超时等错误。

合理设置NodeManager的内存大小,以及单个任务、MapTask、ReduceTask 默认内存大小。一般一个128M数据片对应一个1G的MapTask的内存。

3.mapreduce和spark的shuffle的区别

Yarn


1.角色

ResourceManager:管理所有节点资源的监控、分配、管理

ApplicationMaster:具体应用的调度和协调。向ResourceManager申请NodeManager里的Cantainers,监工NodeManager干活

NodeManager:定时向ResourceManager汇报当前节点各资源(CPU/内存等)的状况,同时为Application干活。

2.工作机制

a.Client向ResourceManager发起应用申请的请求,里面包括了应用的jar包以及环境信息以及数据切片。

b.ResouceManager在一个NodeManager上开启了一个Container来运行ApplicationMaster

c.AM根据应用信息向ResourceManger申请NM上的Containers去运行任务(先运行MapTasks再运行ReduceTasks)并监控NM的任务运行,运行过程中与Client保持直接联系。

d.NMs向AM汇报完成后,AM向Client和RM汇报完成并向RM申请注销自己并允许containers被回收。

3.调度器

三种调度模式,默认使用的是Capacity Schedule 容量模式调度器。Apache使用容量模式,CDH使用公平模式。公平模式需要更多内存。

FIFO:队列,任务先进先出,同一时间队列只有一个任务在进行

Capacity Scheduler容量:多队列,优先进行先发布的任务

Fair Sceduler公平:多队列,所有任务公平分配资源,同时进行

生产中,除了采用以业务分类来对应多队列的方式外,还可以对任务分等级,对优先级高的任务优先保障。

4.yarn-local,yarn-client

Hadoop其他综合性问题


Hadoop宕机

1)如果MR造成系统宕机。此时要控制Yarn同时运行的任务数,和每个任务申请的最大内存。调整参数:yarn.scheduler.maximum-allocation-mb(单个任务可申请的最多物理内存量,默认是8192MB)
2)如果写入文件过量造成NameNode宕机。那么调高Kafka的存储大小,控制从Kafka到HDFS的写入速度。高峰期的时候用Kafka进行缓存,高峰期过去数据同步会自动跟上。

 Hadoop解决数据倾斜方法

数据倾斜的表现:

作业中大部分都完成了,但是总有几个reduce一直在运行。这是因为这几个reduce中的处理的数据要远远大于其他的reduce,可能是因为对键值对任务划分的不均匀造成的数据倾斜。

解决方向:

1)提前在map进行combine,减少传输的数据量
在Mapper加上combiner相当于提前进行reduce,即把一个Mapper中的相同key进行了聚合,减少shuffle过程中传输的数据量,以及Reducer端的计算量。
如果导致数据倾斜的key 大量分布在不同的mapper的时候,这种方法就不是很有效了。
2)导致数据倾斜的key 大量分布在不同的mapper
(1)局部聚合加全局聚合。
第一次在map阶段对那些导致了数据倾斜的key 加上1到n的随机前缀,这样本来相同的key 也会被分到多个Reducer中进行局部聚合,数量就会大大降低。
第二次mapreduce,去掉key的随机前缀,进行全局聚合。
思想:二次mr,第一次将key随机散列到不同reducer进行处理达到负载均衡目的。第二次再根据去掉key的随机前缀,按原key进行reduce处理。
这个方法进行两次mapreduce,性能稍差。
(2)增加Reducer,提升并行度
JobConf.setNumReduceTasks(int)
(3)实现自定义分区
根据数据分布情况,自定义散列函数,将key均匀分配到不同Reducer

(4)简要介绍1种实现方式,假设表A 和表B连接,表A 数据倾斜,只有1个key倾斜,首先
对A进行采样,统计出最倾斜的key,将A表分隔为A1 只有倾斜 key, A2 不包含倾斜key, 然后分别与 表B 连接。最后将结果合并, union

集群资源分配参数(项目中遇到的问题)

集群有30台机器,跑mr任务的时候发现5个map任务全都分配到了同一台机器上,这个可能是由于什么原因导致的吗?
解决方案:

可能是一个NM上开了多个Container

yarn.scheduler.fair.assignmultiple 这个参数 默认是开的,需要关掉。该参数解释:是否允许NodeManager一次分配多个容器。

HDFS在上传文件的时候,如果其中1个块突然损坏了怎么办?

其中1个块坏了,只要有其它块存在,会自动检测还原。

哪些场景才能使用Combiner呢?

(1)Combiner的输出是Reducer的输入,Combiner绝不能改变最终的计算结果。所以从我的想法来看,Combiner只应该对于那种Reduce的输入key/value与输出key/value类型完全一致,且不影响最终结果的场景。如累加,最大值等,求平均值的场景就不可以。
2. combiner最基本是实现本地key的聚合,对map输出的key排序,value进行迭代。
3. combiner的目的是减少map网络流量。combiner的对象是对于map。combiner具有和reduce相似的功能。只不过combiner合并对象,是对于一个map。reduce合并对象,是对于多个map。

评述hadoop运行原理?

(1)、有hdfs 负责数据存放,是Hadoop的分布式文件存储系统
(2)、将文件分解为多个Block,每个Block保存多个副本。提供容错机制,副本丢失或者宕机时自动恢复。默认每个Block保存3个副本,128M为1个Block。由mapreduce负责计算,Map(映射)和Reduce(归约)

Hadoop性能调优

上面“hadoop中mapreduce的优化”调优的经验

外加下面具体参数名称:

调优的大头:mapred.map.tasks、mapred.reduce.tasks设置mr任务数(默认都是1)

 描述一下hadoop中,有哪些地方使用了缓存机制,作用分别是什么?

在mapreduce提交job的获取id之后,会将所有文件存储到分布式缓存上,这样文件可以被所有的mapreduce共享。 

 Hadoop如何实现高并发?

(1)分段加锁机制+内存双缓冲机制
(2)多线程并发吞吐量的百倍优化
(3)缓冲数据批量刷磁盘+网络优化
参考:https://www.codercto.com/a/38917.html

用mapreduce实现sql语句 select count(x) from a group by b?

用mapreduce如何实现两张表连接,有哪些方法?

combiner, partition作用?

partition是输入的分片数据就进行打标分区,hash分配来尽量保证reduce处理数据量差不多

combiner是对一个map方法输出结果进行排序汇总,减少map输出结果的网络IO传输。

举一个简单的例子说明mapreduce是怎么来运行的 ?

WordCount案例

MapReduce中排序发生在哪几个阶段??这些排序是否可以避免,为什么?

一个MapReduce作业由Map阶段和Reduce阶段两部分组成,这两阶段会对数据排序,从这个意义上说,MapReduce框架本质就 是一个Distributed Sort。在Map阶段,在Map阶段,Map Task会在本地磁盘输出一个按照key排序(采用的是快速排序)的文件(中间可能产生多个文件,但最终会合并成一个),在Reduce阶段,每个 Reduce Task会对收到的数据排序,这样,数据便按照Key分成了若干组,之后以组为单位交给reduce()处理。很多人的误解在Map阶段,如果不使用 Combiner便不会排序,这是错误的,不管你用不用Combiner,Map Task均会对产生的数据排序(如果没有Reduce Task,则不会排序, 实际上Map阶段的排序就是为了减轻Reduce端排序负载)。由于这些排序是MapReduce自动完成的,用户无法控制,因此,在hadoop 1.x中无法避免,也不可以关闭,但hadoop2.x是可以关闭的。

总结:归并排序是MapReduce灵魂,不可避免也不应关闭。但Hadoop2.x可关闭。

请列出hadoop进程名

 Hive语句实现WordCount

(1)load data local inpath '/home/hadoop/demo.txt' overwrite into table file_data PARTITION(file_name='/home/hadoop/demo.txt');

(2)select word,count(*) from (

select explode(split(sentence,' ')) word from file_data

) t group by word;

给定A,B两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,找出A,B文件共同的url

可以估计每个文件的大小为50亿×64=298G,远远大于内存限制的4G。所以不可能将其完全加载到内存中处理。考虑采取分而治之的方法。

  1. 将文件存储到hdfs中,这样每个文件为64M或者是128M
  2. 分别对两个文件的url进行去重、排序输出,这样能排除a文件中相同的url,b文件也一样
  3. 对a、b两个文件处理后的结果进行wordcount,并且在reduce中判断单词个数,个数为2的时候输出,这样就找到了a、b文件中的相同url。
  4. 此计算步骤中的每一步加载到内存中的文件大小都不会超过64M,远远小于4G。

一亿条数据获取前1000个最大的值

方法一:分块,比如分1W块,每块1W个,然后分别找出每块最大值,从这最大的1W个值中找最大1K个,那么其他的9K个最大值所在的块即可扔掉,从剩下的最大的1K个值所在的块中找前1K个即可。
              问题:­
               1.这种分块方法的最优时间复杂度。­
               2.如何分块达到最优。比如也可分10W块,每块1000个数。则问题规模可降到原来1/100。但事实上复杂度并没降低。­
               3.还有没更好更优的方法解决这个问题。­

方法二:topk,强调使用treemap是为了节省内存计算空间。

为什么Hadoop默认文件大小是128M?

HDFS的块比磁盘的块大,其目的是为了最小化寻址开销。如果块设置得足够大,从磁盘传输数据的时间会明显大于定位这个块开始位置所需的时间。因而,传输一个由多个块组成的文件的时间取决于磁盘传输速率

如果寻址时间约为10ms,而传输速率为100MB/s,为了使寻址时间仅占传输时间的1%,我们要将块大小设置约为100MB。默认的块大小实际为64MB,但是很多情况下HDFS使用128MB的块设置。

hadoop中两个大表实现join的操作,简单描述。

1. Hive中可以通过分区来减少数据量;
2. 还可以通过优化HQL语句,如只查询需要的字段,尽量避免全表、全字段查询;

Hadoop中二次排序怎么做?

在hadoop中一般都是按照key进行排序的,但是有时候还需要按照value进行排序。
有两种办法进行二次排序:buffer and int memory sort和value-to-key conversion。
a. Buffer and in memory sort主要是在reduce()函数中,将每个key对应的value值保存下来,进行排序。但是缺点在于可能会
出现out of memory。
b. Value-to-key conversion主要思想是将key和value拼接成一个个组合key,然后进行排序,这样reduce()函数获取的结果就
实现了先按照key排序,然后按照value进行排序。需要注意的是,用户需要自己实现paritioner,以便只按照key进行数
据划分。

hadoop常见的join操作?

(1) reduce side join:是最简单的join操作,主要是在reduce端进行join操作;
(2) Map side join:之所以存在reduce side join,是因为在map端不能获得需要连接的全部的字段。Reduce side join比较低
效,因为shuffle传输数据需要消耗大量的性能。
(3) Semijoin:半连接,对于reduce side join,跨机器的数据传输量特别大,成为join的瓶颈。如果能在map端过滤掉不
会参加join的数据,那么可以大大节省网络IO。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值