1. Linux 常用命令
命令 | 命令解释 |
---|---|
top | 查看内存 |
ps -ef | grep 程序名 | 查看进程 |
df -h | 查看磁盘存储情况 |
iotop | 查看磁盘IO读写 |
iotop -o | 直接查看比较高的磁盘读写程序 |
uptime | 查看系统运行时长和平均负载 |
netstat -tunlp | grep 端口号 | 查看端口占用情况 |
2. Shell常用工具及写过的脚本
- awk:文本和数据的处理工具
- sed:流式文本编辑器
- cut: 连接文件并打印在输出设备上
- 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集群搭建过程
-
配置文件
Hadoop3.x : core-site.xml 、 hdfs-site.xml、mapred-site.xml 、yarn-site.xml 、workers(slaves Hadoop2.x)
-
集群搭建过程
JDK安装
配置SSH免密登录
配置hadoop核心文件
格式化namenode
6. HDFS读写流程
(边画边说)
-
HDFS读数据流程
客户端通过分布式文件系统向NameNode请求下载文件,NameNode通过查询元数据,找到文件块所在的DataNode地址。
挑选一台DataNode服务器请求读取数据,挑选原则:就近原则,然后随机。
DataNode开始传输数据给客户端(从磁盘里面读取数据输入流,以Packet为单位来做校验。)
客户端以packet为单位接收,先在本地缓存,然后写入目标文件。
-
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个文件块,占用namenode150字节内存
如果1亿个小文件,就会形成1亿个文件块,然后1亿个文件块*150字节 = 14G 磁盘空间存储
-
解决方案
-
采用har归档方式,将小文件归档
-
CombineTextInputFormat 读取数据
-
开启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阶段:
-
增大环形缓冲区大小。由100M扩大到200M
- 增大环形缓冲区溢写比例。有80% 扩大到 90%
- 减少对溢写文件的merge次数。由10个文件merge扩大到20个文件merge一次。
2) Reduce阶段:
- 合理设置Map和reduce数量
- 设置Map和reduce共存。调整slowstart.completedmaps参数,使Map运行到一定程度后,reduce也开始运行。
- 避免使用reduce: 连接数据集会产生大量的网络消耗
- 增加每个reduce去Map中拿数据的并行数。
- 增大reduce端存储数据的内存大小。
3) IO传输
- map输入端主要考虑数据量的大小和切片(lzo,Bzip2) 注意Lzo想要支持切片必须创建索引。
- map输出端主要考虑速度,速度快的snappy、LZO
- reduce输出端要看具体需求,如果作为下一个mr输入需要考虑切片,如果要永久保存考虑压缩率比较大的gzip
9.Yarn的工作机制
画图

10. Yarn调度器
1) Hadoop中的调度器分为三类:
FIFO、Capacity Scheduler(容量调度器)和Fair scheduler(公平调度器)。
Apache默认的资源调度器是容量调度器;
CDH默认的资源调度器是公平调度器。。
- 区别
FIFO调度器:支持单队列、先进先出 生产环境不会用。
容量调度器: 支持多队列,保证先进入的任务先执行。
公平调度器: 支持多队列,保证每个任务公平享有队列资源。
3) 在生产环境下怎么选择?
大厂: 若对并发度要求比较高,选择公平,但要求服务器性能必须OK。
中