Hadoop面试题

1、Hadoop常用端口?

Hadoop2.xHadoop3.x
访问HDFS端口500709870
访问MR执行情况端口80888088
历史服务器1988819888
客户端访问集群端口90008020

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的简单集群搭建?

  1. 虚拟机环境准备

    • 克隆虚拟机
    • 修改克隆虚拟机的静态ip
    • 修改主机名
    • 关闭防火墙
    • 创建用户
    • 配置所创建用户具有root权限
  2. 安装jdk

  3. 安装hadoop

  4. 配置ssh免密登录

  5. 修改hadoop核心配置文件

  6. 格式化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优化
  1. 数据输入

    合并小文件:在执行MR任务前将下文件进行合并

    采用CombineTextInputFormat来作为输入,解决输入端大量小文件场景

  2. Map阶段

    减少溢写(Spill)次数:从而减少磁盘IO

    减少合并(Merge)次数:从而缩短MR处理时间

    在Map之后,不影响业务逻辑前提下,先进行Combine处理,减少IO

  3. Reduce阶段

    • 合理设置Map和Reduce数:

      太少:会导致task等待,延长处理时间

      太多:会导致Map,Reduce任务间竞争资源,造成处理超时等错误

    • 设置Map,Reduce共存

    • 规避使用Reduce:因为Reduce在用于连接数据集时会产生大量的网络消耗

    • 合理设置Reduce端的Buffer

  4. I/O传输

    • 采用数据压缩的方式,减少网络IO的时间

      安装Snappy和LZO压缩编码器(Hadoop默认不支持LZO压缩,如果需要支持LZO压缩,需要添加jar包,并在hadoop的core-site.xml文件中添加相关压缩配置)

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

      map输出端主要考虑速度,速度快的Snappy,LZO

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

    • 采用SequenceFile二进制文件

  5. 数据倾斜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

  6. 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的调度器?

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

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

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

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

  2. 区别:

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

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

    公平调度器:支持多队列,保证每个任务公平享有队列资源

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

    大厂:如果对并发度要求比较高,选择公平,要求服务器性能必须OK
    中小公司:集群服务器资源不太充裕选择容量
    
  4. 在生产环境怎么创建队列?

    1.调度器默认就1个default队列,不能满足生产要求
    2.按照框架:hive/spark/flink每个框架的任务放入指定的队列(企业用的不是特别多)
    3.按照业务模块:登录注册、购物车、下单、业务部门1、业务部门2
    
  5. 创建多队列的好处?

    1.因为担心员工不小心,写递归死循环代码,把所有资源全部耗尽
    2.实现任务的降级使用,特殊时期保证重要的任务队列资源充足
    业务部门1(重要)--> 业务部门2(比较重要)--> 下单(一般)--> 购物车(一般)--> 登录注册(次要)
    

9、HDFS存储多目录

若HDFS存储空间紧张,需要对DataNode进行磁盘扩展

  1. 在DataNode节点增加磁盘并进行挂载

  2. 在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>
    
  3. 增加磁盘后,保证每个目录数据均衡

    开启数据均衡命令:bin/start-balancer.sh -threshold 10

    对于参数10,代表的是集群中各个节点的磁盘空间利用率相差不超过10%,可根据实际情况进行调整

    停止数据均衡命令:bin/stop-balancer.sh

10、Hadoop参数调优

  1. 资源相关参数

    • 以下参数是在用户自己的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.percentBuffer中的数据达到多少比例开始写入磁盘。默认值0.66
      mapreduce.reduce.shuffle.input.buffer.percentBuffer大小占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.mbShuffle的环形缓冲区大小,默认100m
      mapreduce.map.sort.spill.percent环形缓冲区溢出的阈值,默认80%
  2. 容错相关参数(MapReduce性能优化)

    配置参数参数说明
    mapreduce.map.maxattempts每个Map Task最大重试次数,一旦重试参数超过该值,则认为Map Task运行失败,默认值:4。
    mapreduce.reduce.maxattempts每个Reduce Task最大重试次数,一旦重试参数超过该值,则认为Map Task运行失败,默认值:4。
    mapreduce.task.timeoutTask超时时间,经常需要设置的一个参数,该参数表达的意思为:如果一个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宕机

  1. MR造成系统宕机

    控制Yarn同时运行的任务数,和每个任务申请的最大内存。

    # 单个任务可申请的最多物理内存量,默认是8192MB
    yarn.scheduler.maximum-allocation-mb
    
  2. 写入文件过快造成NameNode宕机

    调高Kafka的存储大小,控制从Kafka到HDFS的写入速度

    例如,可以调整Flume每批次拉取数据量的大小参数batchsize

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值