常用高级命令 |
命令解释 |
top |
实时系统监控工具显示系统中各个进程的资源占用状况(CPU、内存和执行时间)类似 任务管理器 |
jmap - heap 进程号 |
查看某个进程内存,java进程堆内存 |
free -m |
查看系统内存使用情况 单位m |
ps -ef process status |
查看进程 |
netstat -tunlp | grep 端口号 |
查看端口占用情况、查看端口号 |
du -sh 路径* |
查看路径下的磁盘使用情况 |
tail -500 文件 | 查看日志文件后500行 |
yarn logs -ApplicationID jobid | 查看yarn日志 |
tar -zxvf tar包 —C 路径 | 解压缩 |
cut:剪切,从文件的每一行剪切字节、字符和字段并输出。
awk:数据分析工具,默认以空格为分隔符将每行切片,切开的部分再进行分析处理
sort:排序
sed:流式编辑器
1.集群机器之间的分发脚本
2.集群组件启停脚本 (手撕)
#!/bin/bash case $1 in "start") for i in hadoop102 hadoop103 hadoop104 do ssh 绝对路径 done "stop") ..... esac ;;
3.mysql与hdfs的导入导出 涉及到datax的脚本
4.数仓各层内部传数据的脚本
单引号 不解析 里面变量的值
双引号 解析 里面变量的值
若嵌套,谁在最外面谁起作用。
基本都有常用的工具
uniq -d 打印重复的数据
uniq 去重
$0 脚本名字
$1 第一个参数
$? 返回数字指令 上一个命令执行成功返回0,失败返回1
$# 脚本传入参数个数
HDFS页面访问端口 |
9870 |
Yarn任务调度访问端口 |
8088 |
历史服务器端口 |
19888 |
内部通信端口 |
8020 |
core-site.xml
hdfs-site.xml
mapred-site.xml
yarn-site.xml
works
客户端向namenode请求写文件,客户端检验是否有写入权限,文件目录是否存在,返回给客户端可以写入。
客户端请求写入文件的dn地址,nn根据机架感知返回3个dn,
客户端请求传输第一个block,建立与dn的通信管道,建立成功返回给客户端
客户端以packed为单位默认64k向第一个dn写入数据,一边写入磁盘一边传到下一个dn,传输完毕应答给客户端。
packet写一半挂了怎么办
在存储 计算两个方面都会浪费资源。
存储:NameNode的存储,每个都会占用150字节
计算:默认切片规则,每个文件单独切片。1字节的文件开启一个maptask占用1G,对内存和cpu资源的浪费
1.har归档:把多个小文件合并归档,类似于一下发8个快递,效率更高一些。
2.CombineTextInputformat 把所有的文档放到一起统一切片,只开启一个maptask。
3.jvm重用,不一一关闭,等统一干完活再关闭jvm。
2-3个副本
跟磁盘读写速度有关系,寻址时间和传输时间
shuffle是map方法之后,reduce方法之前混写的区域,
map()后进入getpartition(),按key分区,
进入默认100M的环形缓冲区,数据按key快排,达到80%反向溢写到磁盘中,会产生很多小文件,
再经过merge阶段,加载到内存中,归并排序,再溢写到磁盘中
reduce从磁盘中拉取属于自己分区的数据到内存缓冲区进行分组,达到66%再溢写到磁盘中做归并排序。
shuffle是map方法之后,reduce方法之前混写的区域
map方法之后,进入环形缓冲区时会有两个参数getpartition()标记数据是哪个分区的,后续的操作都是在分区内进行,效率更高。 进入环形缓冲区 100m,到达80%时会反向溢写,可以保证数据不断,提高效率。溢写前数据排序的手段:快排,对key的索引排,按照字典顺序排。溢写到磁盘中,会产生很大小文件,再加载到内存中归并排序,再写入到磁盘中,reduce从磁盘中拉取属于自己分区的数据,进行分组。
优化:
1.getpartition()方法 自定义分区 避免数据倾斜 , 由于相同key过多,增加一些随机数把key打散,进入不同分区后再把随机数去掉。
2.环形缓冲区增大到200M
3.80%溢写增加到90%溢写 2.3可以减少溢写文件的个数
4.我们内存 归并的空间很充足, 默认一次归并10个,增加到20个。不充足减少到5个。
5.combiner,在map阶段提前进行预聚合。不能影响后面的业务逻辑,只能求和,不能求平均值。
6.磁盘写之前,进行压缩,减少磁盘IO。如果数据量小 快速压缩 snappy,如果数据量大,采用切片 bzip2或lzop 拉兹洛带索引p。reduce之后如果传入下一个map则如上, 如果永久保存,使用gzip压缩
7.reduce默认一次拉5个maptask,reduce拉取到内存,如果内存充足可以多拉几个10个。也可以增加内存。
maptask一个默认1G能处理128M数据,reducetask也是。 1CU比例概念=1个CPU 4G内存,根据原始数据进行调整。
客户端向集群提交job
resourcemanager向客户端返回jobID,提交作业的HDFS路径
将运行所需资源提交到HDFS上。提交完毕,申请运行mrAppMaster
在RM将用户的请求初始化成一个Task,存放在调度队列
NodeManager领取Task任务 创建 Container容器
容器开启MRAppmaster根据路径ID从HDFS拷贝资源到本地
读取切片信息向RM申请运行MapTask容器
RM将运行MapTask任务分配给另外两个NodeManager,另两个NodeManager分别领取任务并创建容器。
MapTask对数据分区排序等待所有MapTask运行完毕后,向RM申请容器,运行ReduceTask
程序运行完毕后,向RM申请注销。
0.MR程序提交到客户端所在的节点,main方法中有job.waitForCompletion(),运行YarnRunner,
1.YarnRunner向集群中的ResourceManager申请一个Application。
2.RM返回application资源提交的路径和application_ID,
3.该程序将运行所需资源提交到HDFS上,包括job.split,job.xml,jar包程序(分别代表要开启的maptask,程序要运行的配置,程序代码),
4.资源提交完毕,申请运行mrAppMaster
5.在RM将用户的请求初始化成一个Task,存放在调度队列
6.NodeManager领取Task任务 创建 Container容器,容器中有cpu,磁盘IO
7.容器开启MRAppmaster根据路径ID从HDFS拷贝资源到本地
8.MRAppmaste读取job.split向RM申请运行MapTask容器
9.RM将运行MapTask任务分配给另外两个NodeManager,另两个NodeManager分别领取任务并创建容器。
10.MR向两个接收到任务的NodeManager发送程序启动脚本,这两个NodeManager分别启动MapTask,MapTask对数据分区排序。
11.MrAppMaster等待所有MapTask运行完毕后,向RM申请容器,运行ReduceTask。
12.ReduceTask向MapTask获取相应分区的数据。
13.程序运行完毕后,MR会向RM申请注销自己。
默认default队列,需要根据部门业务线创建多队列
FIFO:先进先出,单队列
容量调度器:支持多队列,优先保证先进入的任务执行,资源不够可以借,每个队列fifo,谁先进来谁先分配(并行度低一些适用中小公司)
公平调度器: 支持多队列,每个任务公平享有队列资源,资源不够可以借,缺额分配(并行度高适用中大公司)
配置调度器,默认是容量。ResourceManager处理调度器请求的线程数量,默认50.
NodeManager使用内存,默认8G,适用