hadoop题目

1.Hadoop常用端口号

hadoop2.x

Hadoop3.x

访问HDFS端口

50070  

9870

访问MR执行情况端口

8088   

8088   

历史服务器

19888 

19888 

客户端访问集群端口

9000

8020

2 Hadoop配置文件以及简单的Hadoop集群搭建

1)配置文件:

Hadoop2.xcore-site.xmlhdfs-site.xmlmapred-site.xmlyarn-site.xmlslaves
Hadoop3.x core-site.xmlhdfs-site.xmlmapred-site.xmlyarn-site.xmlworkers

2)简单的集群搭建过程:

JDK安装 ->配置SSH免密登录->配置hadoop核心文件->格式化namenode

3 HDFS读流程和写流程

读取流程如下图:

写入流程如下图:

4 HDFS小文件处理

4.1会有什么影响?

存储层面:namenode将文件系统的元数据存放在内存中,因此存储的文件数目受限于namenode的内存大小。HDFS中每个文件、目录、数据块占用150Bytes。如果存放的文件数目过多的话会占用很大的内存甚至撑爆内存

计算层面:每一个小文件都会开启一个MapTask,占用了大量的计算资源

4.2怎么解决?

(1)采用har归档方式,将小文件归档

(2)采用CombineTextInputFormat

(3)有小文件场景开启JVM重用;如果没有小文件,关闭JVM重用,因为会一直占用使用到的task卡槽,直到任务完成才释放。

JVM重用可以使得JVM实例在同一个job中重新使用N次,N的值可以在Hadoop的mapred-site。xml文件中进行配置。通常在10-20之间

<property>

    <name>mapreduce.job.jvm.numtasks</name>

    <value>10</value>

    <description>How many tasks to run per jvm,if set to -1 ,there is  no limit</description>

</property>

5 Shuffle及优化

1.Shuffle过程

map端的Shuffle简述:

1)input, 根据split输入数据,运行map任务;

2)patition, 每个map task都有一个内存缓冲区,存储着map的输出结果;

3)spill, 当缓冲区快满的时候需要将缓冲区的数据以临时文件的方式存放到磁盘;

4)merge, 当整个map task结束后再对磁盘中这个map task产生的所有临时文件做合并,生成最终的正式输出文件,然后等待reduce task来拉数据。

reduce 端的Shuffle简述:

reduce task在执行之前的工作就是不断地拉取当前job里每个map task的最终结果,然后对从不同地方拉取过来的数据不断地做merge,也最终形成一个文件作为reduce task的输入文件。

1) Copy过程,拉取数据。

2)Merge阶段,合并拉取来的小文件

3)Reducer计算

4)Output输出计算结果

2、优化

1Map阶段

1)增大环形缓冲区大小。由100m扩大到200m

2)增大环形缓冲区溢写的比例。由80%扩大到90%

3)减少对溢写文件的merge次数。(10个文件,一次20merge

4)不影响实际业务的前提下,采用Combiner提前合并,减少 I/O

2Reduce阶段

1)合理设置MapReduce数:两个都不能设置太少,也不能设置太多。太少,会导致Task等待,延长处理时间;太多,会导致 MapReduce任务间竞争资源,造成处理超时等错误。

2)设置MapReduce共存:调整slowstart.completedmaps参数,使Map运行到一定程度后,Reduce也开始运行,减少Reduce的等待时间。

3)规避使用Reduce,因为Reduce在用于连接数据集的时候将会产生大量的网络消耗。

4)增加每个ReduceMap中拿数据的并行数

5)集群性能可以的前提下,增大Reduce端存储数据内存的大小。

3IO传输

采用数据压缩的方式,减少网络IO的的时间。安装SnappyLZOP压缩编码器。

压缩:

1map输入端主要考虑数据量大小和切片,支持切片的有Bzip2LZO。注意:LZO要想支持切片必须创建索引;

2map输出端主要考虑速度,速度快的snappyLZO

3reduce输出端主要看具体需求,例如作为下一个mr输入需要考虑切片,永久保存考虑压缩率比较大的gzip

4)整体

1NodeManager默认内存8G,需要根据服务器实际配置灵活调整,例如128G内存,配置为100G内存左右,yarn.nodemanager.resource.memory-mb

2)单任务默认内存8G,需要根据该任务的数据量灵活调整,例如128m数据,配置1G内存,yarn.scheduler.maximum-allocation-mb

3mapreduce.map.memory.mb :控制分配给MapTask内存上限,如果超过会kill掉进程(报:Container is running beyond physical memory limits. Current usage:565MB of512MB physical memory usedKilling Container)。默认内存大小为1G,如果数据量是128m,正常不需要调整内存;如果数据量大于128m,可以增加MapTask内存,最大可以增加到4-5g

4mapreduce.reduce.memory.mb:控制分配给ReduceTask内存上限。默认内存大小为1G,如果数据量是128m,正常不需要调整内存;如果数据量大于128m,可以增加ReduceTask内存大小为4-5g

5mapreduce.map.java.opts:控制MapTask堆内存大小。(如果内存不够,报:java.lang.OutOfMemoryError

6mapreduce.reduce.java.opts:控制ReduceTask堆内存大小。(如果内存不够,报:java.lang.OutOfMemoryError

7)可以增加MapTaskCPU核数,增加ReduceTaskCPU核数

8)增加每个ContainerCPU核数和内存大小

9)在hdfs-site.xml文件中配置多目录(多磁盘)

10NameNode有一个工作线程池,用来处理不同DataNode的并发心跳以及客户端并发的元数据操作。dfs.namenode.handler.count=,比如集群规模为8台时,此参数设置为41可通过简单的python代码计算该值,代码如下。

[atguigu@hadoop102 ~]$ python
Python 2.7.5 (default, Apr 11 2018, 07:36:10) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-28)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import math
>>> print int(20*math.log(8))
41
>>> quit()

6 Yarn工作机制

7 Yarn调度器

1Hadoop调度器重要分为三类:

FIFO Capacity Scheduler(容量调度器)和Fair Sceduler(公平调度器)。

Apache默认的资源调度器是容量调度器;

CDH默认的资源调度器是公平调度器。

2)区别:

FIFO调度器:支持单队列 、先进先出   生产环境不会用。

容量调度器:支持多队列,保证先进入的任务优先执行。

公平调度器:支持多队列,保证每个任务公平享有队列资源。 资源不够时可以按照缺额分配。

3)在生产环境下怎么选择?

     大厂:如果对并发度要求比较高,选择公平,要求服务器性能必须OK

     中小公司,集群服务器资源不太充裕选择容量。

4)在生产环境怎么创建队列?

1)调度器默认就1default队列,不能满足生产要求。

    2)按照框架:hive /spark/ flink 每个框架的任务放入指定的队列(企业用的不是特别多)

3)按照业务模块:登录注册、购物车、下单、业务部门1、业务部门2

5)创建多队列的好处?

1)因为担心员工不小心,写递归死循环代码,把所有资源全部耗尽。

2)实现任务的降级使用,特殊时期保证重要的任务队列资源充足。

业务部门1(重要)=》业务部门2(比较重要)=》下单(一般)=》购物车(一般)=》登录注册(次要)

8 Hadoop宕机

1)如果MR造成系统宕机。此时要控制Yarn同时运行的任务数,和每个任务申请的最大内存。调整参数:yarn.scheduler.maximum-allocation-mb(单个任务可申请的最多物理内存量,默认是8192MB)

2)如果写入文件过快造成NameNode宕机。那么调高Kafka的存储大小,控制从Kafka到HDFS的写入速度。例如,可以调整Flume每批次拉取数据量的大小参数batchsize。

9 Hadoop解决数据倾斜方法

1)提前在map进行combine,减少传输的数据量

Mapper加上combiner相当于提前进行reduce,即把一个Mapper中的相同key进行了聚合,减少shuffle过程中传输的数据量,以及Reducer端的计算量。

如果导致数据倾斜的key大量分布在不同的mapper的时候,这种方法就不是很有效了。

2)导致数据倾斜的key 大量分布在不同的mapper

1)局部聚合加全局聚合。

第一次在map阶段对那些导致了数据倾斜的key 加上1n的随机前缀,这样本来相同的key 也会被分到多个Reducer中进行局部聚合,数量就会大大降低。

第二次mapreduce,去掉key的随机前缀,进行全局聚合。

思想:二次mr,第一次将key随机散列到不同reducer进行处理达到负载均衡目的。第二次再根据去掉key的随机前缀,按原key进行reduce处理。

这个方法进行两次mapreduce,性能稍差。

(2)增加Reducer,提升并行度  JobConf.setNumReduceTasks(int)

(3)实现自定义分区

根据数据分布情况,自定义散列函数,将key均匀分配到不同Reducer

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值