大数据八股文(自用)

一、Linux常用命令

常用高级命令

命令解释

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  路径 解压缩

 二、shell

1.用过哪些shell工具?

cut:剪切,从文件的每一行剪切字节、字符和字段并输出。

awk:数据分析工具,默认以空格为分隔符将每行切片,切开的部分再进行分析处理

sort:排序

sed:流式编辑器

 2.写过哪些脚本?

1.集群机器之间的分发脚本

2.集群组件启停脚本 (手撕)

		#!/bin/bash
		case $1  in  
		"start")
			for i in hadoop102 hadoop103 hadoop104 
				do 
					ssh  绝对路径 
				done
		"stop")
			.....
		esac
		;;

3.mysql与hdfs的导入导出 涉及到datax的脚本

4.数仓各层内部传数据的脚本

3.单引号和双引号的嵌套?

单引号 不解析 里面变量的值

双引号   解析   里面变量的值

若嵌套,谁在最外面谁起作用。

4.场景问题:Linux上有系统文件,一亿条数据,如何查出重复的数据,如何去重

基本都有常用的工具 
            uniq  -d   打印重复的数据 
            uniq       去重

5.    $0  $数字 $?   $#  

$0 脚本名字
$1 第一个参数 
$? 返回数字指令  上一个命令执行成功返回0,失败返回1
$# 脚本传入参数个数  

三、Hadoop

1.常用端口号

HDFS页面访问端口

9870

Yarn任务调度访问端口

8088

历史服务器端口

19888

内部通信端口

8020

2.常用配置

core-site.xml

hdfs-site.xml

mapred-site.xml

yarn-site.xml

works

3.HDFS

        3.1hdfs的读流程?

        3.2hdfs的写流程?

客户端向namenode请求写文件,客户端检验是否有写入权限,文件目录是否存在,返回给客户端可以写入。

客户端请求写入文件的dn地址,nn根据机架感知返回3个dn,

客户端请求传输第一个block,建立与dn的通信管道,建立成功返回给客户端

客户端以packed为单位默认64k向第一个dn写入数据,一边写入磁盘一边传到下一个dn,传输完毕应答给客户端。

 packet写一半挂了怎么办

        3.3小文件的危害?

在存储 计算两个方面都会浪费资源。

        存储:NameNode的存储,每个都会占用150字节

        计算:默认切片规则,每个文件单独切片。1字节的文件开启一个maptask占用1G,对内存和cpu资源的浪费

        3.4小文件怎么解决?(成熟框架会帮助我们解决hbase)

1.har归档:把多个小文件合并归档,类似于一下发8个快递,效率更高一些。 

2.CombineTextInputformat 把所有的文档放到一起统一切片,只开启一个maptask。

3.jvm重用,不一一关闭,等统一干完活再关闭jvm。

        3.5副本机制

2-3个副本

        3.6块大小,为什么设置成128M

跟磁盘读写速度有关系,寻址时间和传输时间

4.MapReduce

        shuffle及其优化?

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内存,根据原始数据进行调整。

5.Yarn

        5.1Yarn的工作机制

客户端向集群提交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分别启动MapTaskMapTask数据分区排序。

11.MrAppMaster等待所有MapTask运行完毕后,向RM申请容器,运行ReduceTask

12.ReduceTask向MapTask获取相应分区的数据。

13.程序运行完毕后,MR会向RM申请注销自己。

         5.2调度器

默认default队列,需要根据部门业务线创建多队列

FIFO:先进先出,单队列

容量调度器:支持多队列,优先保证先进入的任务执行,资源不够可以借,每个队列fifo,谁先进来谁先分配(并行度低一些适用中小公司)

公平调度器: 支持多队列,每个任务公平享有队列资源,资源不够可以借,缺额分配(并行度高适用中大公司)

        5.3生产环境核心参数

配置调度器,默认是容量。ResourceManager处理调度器请求的线程数量,默认50.

NodeManager使用内存,默认8G,适用

你可能感兴趣的:(大数据,#,大数据面试,大数据)