1、Hadoop常用端口?
Hadoop2.x | Hadoop3.x | |
---|---|---|
访问HDFS端口 | 50070 | 9870 |
访问MR执行情况端口 | 8088 | 8088 |
历史服务器 | 19888 | 19888 |
客户端访问集群端口 | 9000 | 8020 |
2、Hadoop配置文件?
Hadoop2.x:core-site.xml,hdfs-site.xml,mapred-site.xml,yarn-site.xml,slaves
Hadoop3.x:core-site.xml,hdfs-site.xml,mapred-site.xml,yarn-site.xml,workers
3、Hadoop的简单集群搭建?
-
虚拟机环境准备
- 克隆虚拟机
- 修改克隆虚拟机的静态ip
- 修改主机名
- 关闭防火墙
- 创建用户
- 配置所创建用户具有root权限
-
安装jdk
-
安装hadoop
-
配置ssh免密登录
-
修改hadoop核心配置文件
-
格式化namenode
思考:为什么不能一直格式化namenode,格式化namenode要注意什么?
格式化NameNode,会产生新的集群id,导致NameNode和DataNode的集群id不一致,集群找不到已往数据 格式NameNode时,一定要先删除data数据和log日志,然后再格式化NameNode
4、HDFS读写流程?
4.1 HDFS读数据流程
HDFS如何控制客户端读取哪个副本节点数据?
HDFS满足客户端访问副本数据的最近原则
即客户端距离哪个副本数据最近,HDFS就让哪个节点把数据给客户端
4.2 HDFS写数据流程
机架感知(副本节点选择)?
1. 低版本Hadoop副本节点选择
第一个副本在client所处的节点上;如果客户端在集群外,随机选一个
第二个副本和第一个副本位于不相同机架的随机节点上
第三个副本和第二个副本位于相同机架,节点随机
2. Hadoop2.7.2副本节点选择
第一个副本在client所处的节点上;如果客户端在集群外,随机选一个
第二个副本和第一个副本位于相同机架的随机节点上
第三个副本和第二个副本位于不同机架,节点随机
5、Hadoop优化?
MapReduce跑的慢的原因?
1. 计算机性能
CPU、内存、磁盘健康、网络
2. I/O操作优化
数据倾斜
Map和Reduce数设置不合理
Map运行时间太长,导致Reduce等待过久
小文件过多
大量的不可分块的超大文件
Spill次数过多
Merge次数过多
MapReduce优化
-
数据输入
合并小文件:在执行MR任务前将下文件进行合并
采用CombineTextInputFormat来作为输入,解决输入端大量小文件场景
-
Map阶段
减少溢写(Spill)次数:从而减少磁盘IO
减少合并(Merge)次数:从而缩短MR处理时间
在Map之后,不影响业务逻辑前提下,先进行Combine处理,减少IO
-
Reduce阶段
-
合理设置Map和Reduce数:
太少:会导致task等待,延长处理时间
太多:会导致Map,Reduce任务间竞争资源,造成处理超时等错误
-
设置Map,Reduce共存
-
规避使用Reduce:因为Reduce在用于连接数据集时会产生大量的网络消耗
-
合理设置Reduce端的Buffer
-
-
I/O传输
-
采用数据压缩的方式,减少网络IO的时间
安装Snappy和LZO压缩编码器(Hadoop默认不支持LZO压缩,如果需要支持LZO压缩,需要添加jar包,并在hadoop的core-site.xml文件中添加相关压缩配置)
map输入端主要考虑数据量大小和切片,支持切片的有Bzip2,LZO;注意:LZO要想支持切片必须创建索引
map输出端主要考虑速度,速度快的Snappy,LZO
reduce输出端主要看具体需求,例如作为下一个MR输入需要考虑切片,永久保存考虑压缩率比较大的gzip
-
采用SequenceFile二进制文件
-
-
数据倾斜(
Hadoop解决数据倾斜方法?
)-
现象
数据频率倾斜——某一个区域的数量要远远大于其他区域
数据大小倾斜——部分记录的大小远远大于平均值
-
没有数据倾斜的可能性,只要没有shuffle,就没有倾斜
采用Map Join,尽量避免Reduce Join
-
提前在map进行combine,减少传输的数据量
在Mapper加上combiner相当于提前进行reduce,即把一个Mapper中的相同key进行了聚合,减少shuffle过程中传输的数据量,以及Reducer端的计算量
如果导致数据倾斜的key大量分布在不同的mapper的时候,这种方法就不是很有效了
-
mapreduce某些key不均匀(局部聚合加全局聚合)
先把key值加随机数(前缀或者后缀),一个key就变成了很多的key
对加了随机数的key做处理
处理一遍之后,去掉随机数,再做一次处理
这个方法进行两次mapreduce,性能稍差
-
reducer的task的数据设大一点,提升并行度,也能缓解,但是不能从根本解决
JobConf.setNumReduceTasks(int)
-
实现自定义分区
根据分布情况,自定义散列函数,将key均匀分配到不同reducer
-
-
HDFS小文件处理
-
小文件过多会导致运行的效率很低,每个task处理的数据都很少,每个并行计算的task数据量都很少,本身这些数据存储在hdfs(磁盘),寻址也需要时间,如果处理的都是小文件,就会导致处理的很慢
-
采用har归档方式,将小文件归档
-
采用CombineTextInputFormat
-
有小文件场景开启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>
-
6、MapReduce的Shuffle过程?
Mapreduce确保每个reducer的输入都是按键排序的
系统执行排序的过程(即将map输出作为输入传给reducer)称为shuffle
7、YARN的工作机制?
8、YARN的调度器?
-
Hadoop调度器重要分为三类:
FIFO 、Capacity Scheduler(容量调度器)和Fair Sceduler(公平调度器)
Apache默认的资源调度器是容量调度器
CDH默认的资源调度器是公平调度器
-
区别:
FIFO调度器:支持单队列 、先进先出 生产环境不会用
容量调度器:支持多队列,保证先进入的任务优先执行
公平调度器:支持多队列,保证每个任务公平享有队列资源
-
在生产环境下怎么选择?
大厂:如果对并发度要求比较高,选择公平,要求服务器性能必须OK 中小公司:集群服务器资源不太充裕选择容量
-
在生产环境怎么创建队列?
1.调度器默认就1个default队列,不能满足生产要求 2.按照框架:hive/spark/flink每个框架的任务放入指定的队列(企业用的不是特别多) 3.按照业务模块:登录注册、购物车、下单、业务部门1、业务部门2
-
创建多队列的好处?
1.因为担心员工不小心,写递归死循环代码,把所有资源全部耗尽 2.实现任务的降级使用,特殊时期保证重要的任务队列资源充足 业务部门1(重要)--> 业务部门2(比较重要)--> 下单(一般)--> 购物车(一般)--> 登录注册(次要)
9、HDFS存储多目录
若HDFS存储空间紧张,需要对DataNode进行磁盘扩展
-
在DataNode节点增加磁盘并进行挂载
-
在hdfs-site.xml文件中配置多目录,注意新挂载磁盘的访问权限问题
<property> <name>dfs.datanode.data.dir</name> <value>file:///${hadoop.tmp.dir}/dfs/data1,file:///hd2/dfs/data2,file:///hd3/dfs/data3,file:///hd4/dfs/data4</value> </property>
-
增加磁盘后,保证每个目录数据均衡
开启数据均衡命令:
bin/start-balancer.sh -threshold 10
对于参数10,代表的是集群中各个节点的磁盘空间利用率相差不超过10%,可根据实际情况进行调整
停止数据均衡命令:
bin/stop-balancer.sh
10、Hadoop参数调优
-
资源相关参数
-
以下参数是在用户自己的MR应用程序中配置就可以生效(mapred-default.xml)
配置参数 参数说明 mapreduce.map.memory.mb 一个MapTask可使用的资源上限(单位:MB),默认为1024。如果MapTask实际使用的资源量超过该值,则会被强制杀死。 mapreduce.reduce.memory.mb 一个ReduceTask可使用的资源上限(单位:MB),默认为1024。如果ReduceTask实际使用的资源量超过该值,则会被强制杀死。 mapreduce.map.cpu.vcores 每个MapTask可使用的最多cpu core数目,默认值: 1 mapreduce.reduce.cpu.vcores 每个ReduceTask可使用的最多cpu core数目,默认值: 1 mapreduce.reduce.shuffle.parallelcopies 每个Reduce去Map中取数据的并行数。默认值是5 mapreduce.reduce.shuffle.merge.percent Buffer中的数据达到多少比例开始写入磁盘。默认值0.66 mapreduce.reduce.shuffle.input.buffer.percent Buffer大小占Reduce可用内存的比例。默认值0.7 mapreduce.reduce.input.buffer.percent 指定多少比例的内存用来存放Buffer中的数据,默认值是0.0 -
应该在YARN启动之前就配置在服务器的配置文件中才能生效(yarn-default.xml)
配置参数 参数说明 yarn.scheduler.minimum-allocation-mb 给应用程序Container分配的最小内存,默认值:1024 yarn.scheduler.maximum-allocation-mb 给应用程序Container分配的最大内存,默认值:8192 yarn.scheduler.minimum-allocation-vcores 每个Container申请的最小CPU核数,默认值:1 yarn.scheduler.maximum-allocation-vcores 每个Container申请的最大CPU核数,默认值:32 yarn.nodemanager.resource.memory-mb 给Containers分配的最大物理内存,默认值:8192 -
Shuffle性能优化的关键参数,应在YARN启动之前就配置好(mapred-default.xml)
配置参数 参数说明 mapreduce.task.io.sort.mb Shuffle的环形缓冲区大小,默认100m mapreduce.map.sort.spill.percent 环形缓冲区溢出的阈值,默认80%
-
-
容错相关参数(MapReduce性能优化)
配置参数 参数说明 mapreduce.map.maxattempts 每个Map Task最大重试次数,一旦重试参数超过该值,则认为Map Task运行失败,默认值:4。 mapreduce.reduce.maxattempts 每个Reduce Task最大重试次数,一旦重试参数超过该值,则认为Map Task运行失败,默认值:4。 mapreduce.task.timeout Task超时时间,经常需要设置的一个参数,该参数表达的意思为:如果一个Task在一定时间内没有任何进入,即不会读取新的数据,也没有输出数据,则认为该Task处于Block状态,可能是卡住了,也许永远会卡住,为了防止因为用户程序永远Block住不退出,则强制设置了一个该超时时间(单位毫秒),默认是600000。如果你的程序对每条输入数据的处理时间过长(比如会访问数据库,通过网络拉取数据等),建议将该参数调大,该参数过小常出现的错误提示是“AttemptID:attempt_14267829456721_123456_m_000224_0 Timed out after 300 secsContainer killed by the ApplicationMaster.”
11、项目经验之集群资源分配参数?
集群由30台机器,跑MR任务的时候发现5个map任务全都分配到了同一台机器上,这个可能是由于什么原因导致的呢?
解决方案:yarn.scheduler.fair.assignmultiple这个参数默认式开的,需要关掉
12、项目经验之基准测试
搭建完Hadoop集群后需要对HDFS读写性能和MR计算能力测试
测试jar包在hadoop的share文件夹下
面试官可能会问,我有10T的数据,读完需要多长时间,写需要多长时间?
我们会先做基准测试,测试出这个集群的读写能力,计算的能力.....
13、Hadoop宕机
-
MR造成系统宕机
控制Yarn同时运行的任务数,和每个任务申请的最大内存。
# 单个任务可申请的最多物理内存量,默认是8192MB yarn.scheduler.maximum-allocation-mb
-
写入文件过快造成NameNode宕机
调高Kafka的存储大小,控制从Kafka到HDFS的写入速度
例如,可以调整Flume每批次拉取数据量的大小参数batchsize