大数据面试题

1. Linux 常用命令

命令 命令解释
top 查看内存
ps -ef | grep 程序名 查看进程
df -h 查看磁盘存储情况
iotop 查看磁盘IO读写
iotop -o 直接查看比较高的磁盘读写程序
uptime 查看系统运行时长和平均负载
netstat -tunlp | grep 端口号 查看端口占用情况

2. Shell常用工具及写过的脚本

  1. awk:文本和数据的处理工具
  2. sed:流式文本编辑器
  3. cut: 连接文件并打印在输出设备上
  4. sort:将文件排序然后输出

写过的脚本:

1. 集群启动、集群分发脚本
2. 数仓与mysql的导入、导出脚本
3. 数仓层级之间的导入脚本

3. Shell中提交了一个脚本,进程号已经不知道了,但是需要kill掉这个进程,怎么操作?

ssh 主机 “ps -ef | grep 脚本名 | grep -v grep | awk ‘{print \$2}’ | xargs kill”

4. 大数据常用端口号

组件 端口号 解释
hadoop3.x(2.x) 9870(50070) 访问HDFS端口
8088(8088) 访问MR执行情况端口
19888(19888) 历史服务器
8020/9000(8020/9000/9820) 客户端访问集群端口

5. Hadoop配置文件和简单的Hadoop集群搭建过程

  1. 配置文件

    Hadoop3.x : core-site.xml 、 hdfs-site.xml、mapred-site.xml 、yarn-site.xml 、workers(slaves Hadoop2.x)

  2. 集群搭建过程

    JDK安装

    配置SSH免密登录

    配置hadoop核心文件

    格式化namenode

6. HDFS读写流程

(边画边说)

  1. HDFS读数据流程

    客户端通过分布式文件系统向NameNode请求下载文件,NameNode通过查询元数据,找到文件块所在的DataNode地址。

    挑选一台DataNode服务器请求读取数据,挑选原则:就近原则,然后随机。

    DataNode开始传输数据给客户端(从磁盘里面读取数据输入流,以Packet为单位来做校验。)

    客户端以packet为单位接收,先在本地缓存,然后写入目标文件。

  2. HDFS写数据流程

    客户端通过分布式文件系统模块向NameNode请求上传文件,NameNode检查文件是否已存在,父目录是否存在。

    NameNode返回是否可以上传

    客户端请求第一个Block上传到哪几个DataNode服务器上。

    NameNode返回3个DataNode节点,分别为dn1, dn2, dn3

    客户端通过FSDataOutputStream模块向dn1请求上传数据,dn1收到请求后会继续调用dn2, 然后dn2 调用dn3,将这个通信管道建立完成。

    dn1、dn2 、 dn3 逐级应答客户端

    客户端开始往dn1上传第一Block(从磁盘中读取数据,放到一个本地内存缓存中),以Packet为单位,dn1 收到一个packet就会传给dn2, dn2 在传给dn3;

    当第一个Block传输完成之后,客户端再次请求NameNode上传第二个blocK的服务器,会重复第一个block传输步骤。

7. HDFS小文件处理

小文件产生的原因:
和flume的滚动方式有关:flume有三种滚动方式:1. 基于时间,一般1到2小时滚动到hdfs上。2. 文件大小,我们一般都是设置128m,3. event个数。
产生小文件的原因就是选择了第一种基于时间的活动方式,如果在这个时间内,一直没有数据或者数据量小,但还是会落盘到hdfs上。这就造成了很多小文件的问题。

  1. 小文件产生的影响

    例: 1个文件块,占用namenode150字节内存

    如果1亿个小文件,就会形成1亿个文件块,然后1亿个文件块*150字节 = 14G 磁盘空间存储

  2. 解决方案

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

    2. CombineTextInputFormat 读取数据

    3. 开启JVM重用: 有很多小文件的场景下,jvm重用可以使Jvm实例在同一个job重新使用N次,重复使用次数可以在mapred-site.xml文件中进行配置。通常设置成10-20之间。(jvm.numtasks参数)

8. shuffle及优化

shuffle过程位于map()方法之后,reduce() 方法之前。是一个混洗的过程。

数据经过map()方法处理后,OuptputCollector将数据写入环形缓冲区,环形缓冲区底层是一个100M大小的数组,可以两边写数据,左边写(index,partition,keystart,valstart)这种元数据,右边写keyValue数据。当数据达到环形缓冲区的80%时,会进行分区排序(快排,对索引进行排序);如果设置了combiner还会进行分区内聚合;会溢写文件到本地磁盘,这时剩余的20%会反向写数据。溢写出多个分区内有序的文件,这些文件会归并排序到一个大文件中(如果设置了combiner还会进行分区内聚合),maptask任务结束后,就会启动相应数量的reduceTask,reduceTask会根据分区号主动抓取不同机器上的相同分区上的文件到内存中,如果内存不够还会溢写文件到磁盘。然后reduceTask在将这些文件归并排序到一个大文件中,交给reduce()方法。

优化方案:

1) Map阶段:

  1. 增大环形缓冲区大小。由100M扩大到200M

    1. 增大环形缓冲区溢写比例。有80% 扩大到 90%
    2. 减少对溢写文件的merge次数。由10个文件merge扩大到20个文件merge一次。

2) Reduce阶段:

  1. 合理设置Map和reduce数量
  2. 设置Map和reduce共存。调整slowstart.completedmaps参数,使Map运行到一定程度后,reduce也开始运行。
  3. 避免使用reduce: 连接数据集会产生大量的网络消耗
  4. 增加每个reduce去Map中拿数据的并行数
  5. 增大reduce端存储数据的内存大小

3) IO传输

  1. map输入端主要考虑数据量的大小和切片(lzo,Bzip2) 注意Lzo想要支持切片必须创建索引。
  2. map输出端主要考虑速度,速度快的snappy、LZO
  3. reduce输出端要看具体需求,如果作为下一个mr输入需要考虑切片,如果要永久保存考虑压缩率比较大的gzip

9.Yarn的工作机制

画图

10. Yarn调度器

1) Hadoop中的调度器分为三类:

​ FIFO、Capacity Scheduler(容量调度器)和Fair scheduler(公平调度器)。

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

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

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

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

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

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

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

​ 中

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值