- 日志级别
- info 日志多
- warn 日志偏少
- error 日志更少
-
1.HDFS写流程 面试
对用户操作是无感知的-
[hadoop@bigdata13 ~]$ hadoop fs -put ./wc.data / [hadoop@bigdata13 ~]$ hadoop fs -ls /
- 1.Client调用FileSystem.crete(filepath)去namenode进行【RPC】通信
NameNode检查这个路径文件是否存在,是否有权限能够创造这个文件
假如都满足,就去创建一个新文件,
但是这时还没有写入数据,是不关联任何block
namenode根据上传的文件的大小、根据块大小 + 副本数参数
计算要上传多少块和块存储在DataNode的位置
最终要将这些信息 返回给客户端 - 2.Client调用【FSDataOutputStream对象】
write方法
将第一个块的第一个副本数写第一个DataNode节点
写完去第二个DN节点写第二个副本
写完去第三个DN节点写第三个副本
当第三个副本写完,就返回一个ack package
确认包给DN2节点
当DN2节点接收到这个ack packet确认包 加上自己也
写完了就返回一个ack package给第一个DN节点
当DN1节点收到这个ack确认包 加上自己也写完了
DN1节点
将ack package 返回给【FSDataOutputStream对象】
就表示第一个块 的三个副本 写完
其他块以此类推。。。 - 3.当所有的块全部写完 client调用
【FSDataOutputStream对象】的
close方法 告诉NN文件写完了 。
-
- 解决linux网卡丢失问题
service NetworkManager stop
chkconfig NetworkManager off
重启网络
systemctl restart network
-
2.HDFS读流程 面试
对用户操作是无感知的- 1.Client调用FS.open(filepath)
与NN进行RPC通讯,返回该文件的
部分或者全部的block列表
以【FSDataInputStream】对象 - 2.Client 【FSDataInPutStream】对象的read方法
去与第一个块的最近的DN进行读取,读取完成会check
假如满足 就关闭与DN通信
假如读取失败 会记录 DN+block信息
下次就不会从这个节点读取。那么就从第二个节点读取
然后去与第二个块的最近的DN进行读取,以此类推
假如当block列表全部读取完成,文件还没有读取完
继续调用FS从NN获取下一个批次的block列表 以此类推 - 3.Client调用【FSDataInPutStream】对象
close方法 关闭输入流
- 1.Client调用FS.open(filepath)
-
3.HDFS副本放置策略 面试+生产
机架(为了容错)- 第一副本
- 1.放置在client上传的DN节点
- 2.client 不在DN节点 ,就随机选择一个DN
- 第二副本
- 1.放置在第一个副本不同的机架上
- 第三个副本
- 与第二个副本相同机架的不同节点上
- 补充
副本数3
如果副本数设置跟多4 就随机放置
- 第一副本
-
4. hdfs 按全模式
- 1. 什么时候发生安全模式
- 启动hadoop
- hdfs故障
集群文件块大量丢失:说明集群不稳定 会进入安全模式 - 人为主动进入安全模式 (与业务场景有关)
集群维护
- 2.安全模式对业务有什么影响
- 读文件:可以的
- 写文件:不可以的
- 3.命令
hdfs dfsadmin [-safemode <enter | leave | get | wait | forceExit>]
hdfs dfsadmin -safemode
- 1. 什么时候发生安全模式
-
linux
-
1.app => pid
kill - 9 pid
补充: kill - num pid
kill -15 pid -
部署基础框架
-
mysql ------ mysql用户
-
orcale ------ orcale用户
-
hadoop、hive ------ hadoop用户
-
-
-
musql
-
每个查询都有进程
show processlist;
kill id; -
创建数据库
bigdata bigdata用户去管理
hive 创建一个hive用户//创建数据库流程 mysql> create database dl2262; mysql> grant all privileges on dl2262.* to dl2262 identified by '123456'; mysql> flush privileges;
-
-
5.模板模式
-
定义定类、抽象类或者接口
-
1.只需要把过程定义好即可
-
2.具体实现由子类完成
package com.bigdata.telple; public class Client { public static void main(String[] args) throws Exception{ // Mapper zh = new zh(); // zh.run(); //反射 Class<?> aClass = Class.forName(ParmsUtil.getProperties().getProperty("username")); Mapper mapper = (Mapper) aClass.newInstance(); mapper.run(); } }
package com.bigdata.telple; public abstract class Mapper { abstract void setup(); abstract void map(); abstract void cleanup(); public void run(){ setup(); map(); cleanup(); } }
public class ParmsUtil { private static Properties properties = new Properties(); //创建对象 static { try { properties.load(ParmsUtil.class.getClassLoader().getResourceAsStream("mapper.properties")); } catch (IOException e) { e.printStackTrace(); } } public static Properties getProperties(){ return properties; } public static void main(String[] args){ Properties properties = ParmsUtil.getProperties(); String username = properties.getProperty("MAPPER_CLASS"); System.out.println(username); } }
package com.bigdata.telple; public class zh extends Mapper{ @Override void setup() { System.out.println("zh setup"); } @Override void map() { System.out.println("zh map"); } @Override void cleanup() { System.out.println("zh cleanup"); } }
-
-
好处:多个子类之间 实现流程一样 但是 业务不一样
-
-
6.hdfs生产最佳实践
-
如何查看hdfs block是否丢失
-
hdfs block丢失 如何解决?
-
1.不用解决 hdfs 高容错 自动恢复 【多副本情况下】
dn 6h -
2.手动进行恢复 丢失的block
hdfs debug recoverLease -path <filename> [-retries <num-retries>]
-
-
-
模拟 文件块丢失
-
1. 删除一个文件的文件块 =》 删除副本
rm -rf blk_1073741831 blk_1073 -
2. 重启hdfs检查文件块是否丢失
hdfs fsck / -
3.手动修复
hdfs debug recoverLease -path /1_blk.log -retries 10 [拼人品]
-
Hadoop day05 (HDFS)
于 2022-11-17 23:43:26 首次发布