目录
来源:大数据Hadoop教程
一、基本介绍
1.常用端口号
Hadoop3.x
HDFS NameNode 内部通常端口:8020/9000/9820
HDFS NameNode 对用户的查询端口:9870
Yarn查看任务运行情况的:8088
历史服务器:19888
Hadoop2.x
HDFS NameNode 内部通常端口:8020/9000
HDFS NameNode 对用户的查询端口:50070
Yarn查看任务运行情况的:8088
历史服务器:19888
2.常用的配置文件
3.x core-site.xml hdfs-site.xml yarn-site.xml mapred-site.xml workers
2.x core-site.xml hdfs-site.xml yarn-site.xml mapred-site.xml slaves
二、HDFS
1.HDFS文件块大小(面试重点)
知识点:
问题:为什么块的大小不能设置的太小,也不能设置的太大?
(1)HDFS的块设置太小会增加寻址时间
(2)块设置太大让磁盘传输数据时间明显大于定位该块开始位置的时间。导致处理变慢。
所以,HDFS块的大小设置取决于磁盘传输的速率。
中小企业一般用的磁盘传输的速率为128MB/s,大企业一般用的磁盘传输的速率为256MB/s
2.HDFS的Shell操作(开发重点)
2.1基本语法
hadoop fs 具体命令 / hdfs dfs 具体命令,两种命令一样
2.2准备工作
启动Hadoop集群,创建文件夹。
2.3上传指令
-moveFromLocal:从本地剪切粘贴到HDFS;
-copyFromLocal:从本地文件系统中复制文件到HDFS路径去;
-put:等同-copyFromLocal,实际场景一般用put;
-appendToFile:在文件夹末尾添加一个文件
2.4下载指令
-copyToLocal:从HDFS复制到本地;
-get:等同-copyToLocal,实际场景一般用get
2.5HDFS操作指令
-ls:显示目录信息;
-cat:显示文件内容;
-chgrp、-chmod、-chown:修改文件所属权限;
-mkdir:创建路径;
-cp:从HDFS的一个路径复制到HDFS的另一个路径;
-mv:从HDFS目录中移动文件;
-tail:显示文件末尾1kb的数据;
-rm:删除文件or文件夹;
-rm -r:递归删除目录与目录内容;
-du:统计文件夹大小信息;
-setrep:设置HDFS中文件副本数量(只记录NameNode数量,副本数量看DataNode数量)
3.HDFS的读写流程(面试重点)
3.1写数据流程
3.1.1网络拓扑-节点距离计算
节点距离:两个节点到达最近的共同祖先的距离总和。
3.1.2副本节点选择
3.2HDFS读数据流程
三、MapReduce
构成:业务代码+默认代码
优点 | 缺点 |
易于编程 | 不适合实时计算(Mysql适合) |
良好扩展性。可动态增加服务器 | 不适合流计算(Sparkstreaming,flink适合) |
高容错性。任意机器挂掉可转移其他节点 | 不适合DAG有向无环图计算(spark适合) |
适合大数据 | / |
1.InputFormat数据输入
1)默认的是TextInputformat。kv-k:key偏移量,v:一行内容
2)处理小文件CombineTextInputFormat把多个文件合并到一起统一切片
2.Mapper
setup() | 初始化 |
map() | 用户的业务逻辑 |
clearup() | 关闭资源 |
3.Shuffle机制:Map方法与Reduce方法之间的数据处理过程称之为Shuffle
环形缓冲区(蓝色):左侧存储索引,右侧存储数据,到80%后反向写。
分区排序:对key的索引按照字典顺序进行快排
压缩:加快网络传输速度(优化)
3.1Partition分区
默认分区HashPartitioner,默认按照key的hash值%numreducetask个数自定义分区。
总结:
(1)if sum(ReduceTask)>sum(getPartition),则生成多个空输出文件part-r-000xx(浪费);
(2)if 1<sum(ReduceTask)<sum(getPartition),则有部分分区数据Exception(IO异常);
(3)if sum(ReduceTask)=1,无论MapTask输出多少个分区文件,结果都交给ReduceTask,最终只产生一个结果文件part-r-00000;
(4)分区号必须从0开始,不断累加。
3.2WritableComparable排序(重点)
MapTask&ReduceTask对数据按照key排序(默认依据字典顺序排序,实现方法为快速排序)。
MapTask | 结果放入环形缓冲区,使用率到阈值进行一次快速排序 |
ReduceTask | 超出阈值,溢写磁盘。统一对内存和磁盘数据进行归并排序 |
部分排序 | 输出文件内部有序(常用) |
全排序 | 只输出一个文件,内部有序(不常用) |
辅助排序 | Reduce端对key进行分组 |
二次排序 | 自定义排序中,实现writableCompare接口,重写compareTo判断条件为2个即为二次排序 |
3.3Combiner合并
前提:不影响最终的业务逻辑
(1)Combiner组件的父类为Reducer。
(2)Combiner在每个MapTask运行,Reducer接收全局所有Mapper输出结果。
(3)Combiner对MapTask输出局部汇总,减少网络输出。
解决数据倾斜的方法:提前聚合map
3.4OutputFormat数据输出
默认输出格式 | TextOutputFormat(按行输出到文件) |
应用场景 | eg:输出数据到MySQL/HBase/Elasticsearch等存储框架 |
自定义 OutputFormat步骤 | 1.定义类继承OutputFormat 2.改写RecordWriter,改写输出数据方法write() |
4.MapReduce内核源码(面试)
4.1MapTask工作机制
4.2ReduceTask工作机制
4.3并行度决定机制
MapTask | 切片个数(输入文件和规则决定)决定 |
ReduceTask | 1. 设置ReduceTask并行度(个数) 2.实验测试ReduceTask多少合适 |
注意:
(1)ReduceTask=0(没有Reduce阶段),输出文件个数和Map个数一致;
(2)ReduceTask默认为1,输出文件为1个;
(3)if数据分布不均匀,Reduce阶段可能产生数据倾斜;
(4)具体多少ReduceTask依据集群性能设定;
(5)if分区数≠1,but ReduceTask=1。原因:不执行分区过程。
5.Join
Map端 | 为不同表或文件的key/value对打标签区别不同来源的记录。连接字段作为key,其余部分和新加标志作为value,最后输出。 |
Reduce端 | 连接字段作为key的分组已经完成,需要在每个分组当中将来源于不同文件的记录(Map阶段已打标志)分开,最后合并。 |
缺点:合并操作在Reduce阶段完成,压力大,但Map资源利用率不高。因此产生Map Join在Map端实现数据合并。
场景 | 表间大小差距过大的场景 |
方法 | 采用DistributedCache,在Map阶段文件读取至缓存中。Driver驱动类加载缓存 |
6.数据清洗(ETL)
抽取(Extract)、转换(Transform)、加载(Load)。
清理过程往往只需要运行Mapper程序,不需要运行Reduce程序。
四、Yarn
1.基础架构
ResourceManager(RM):(1)处理客户端请求;(2)监控NodeManager;(3)启动or监控ApplicationMaster;(4)资源的分配与调度。
NodeManager(NM):(1)管理单个节点资源;(2)处理来自ResourceManager和ApplicationMaster的命令。
ApplicationMaster(AM):(1)任务监控与容错;(2)申请资源并分配。
Container:Yarn资源抽象,封装多维度资源(内存、CPU、磁盘、网络等)。
2.Yarn的工作机制(面试题)
3.Yarn的调度器
1)FIFO调度器/容量调度器/公平调度器。
2)apache的默认调度器为容量调度器; CDH的默认调度器为公平调度器。
3)公平/容量默认一个队列,需要创建多队列。
中小企业:任务可放进hive、spark、flink、mr创建队列
中大企业:采用业务模块(登录模块/注册模块)
好处:解耦并降低风险,数据量大时可降级使用
4)三种调度器特点:
相同点:支持多队列,可以借资源,支持多用户
不同点:容量调度器:优先满足先进来的任务执行
公平调度器:在队列里面的任务公平享有队列资源
5)生产环境怎么选:
中小企业:对并发度要求不高,选择容量
中大企业:对并发度要求比较高,选择公平。
4.开发重点掌握:
1)队列运行原理
优点 | 简单易懂 |
缺点 | 不支持多队列,生产环境很少使用 |
队列资源分配 | 优先选择资源占有率最低的队列分配资源 |
作业资源分配 | 默认依据提交作业的优先级和提交时间顺序分配资源 |
容器资源分配 | 按照容器优秀级分配资源。if优先级相同,依据数据本地性原则:(1)任务与数据在同节点(2)任务与数据在同机架(3)任务与数据不在同节点与同机架 |
公平调度器:优先为缺额大的作业分配资源。
2)Yarn常用命令
3)核心参数配置
4)配置容量调度器和公平调度器。
5)tool接口使用。