大数据面试之HDFS


说明,感谢亮哥长期对我的帮助,此处多篇文章均为亮哥带我整理。以及参考诸多博主的文章。如果侵权,请及时指出,我会立马停止该行为;如有不足之处,还请大佬不吝指教,以期共同进步。

1.Hdfs

1.1 Hdfs的数据上传和读取过程

1.1.1 hdfs写文件的步骤

(1) 与namenode通信请求上传文件,namenode检查目标文件是否已存在,父目录是否存在

(2) namenode返回是否可以上传

(3) client请求第一个 block该传输到哪些datanode服务器上

(4) namenode返回3个datanode服务器ABC

(5) client请求3台dn中的一台A上传数据(本质上是一个RPC调用,建立pipeline),A收到请求会继续调用B,<br/>&nbsp;&nbsp;然后B调用C,将整个pipeline建立完成,逐级返回客户端    
(6) client开始往A上传第一个block(先从磁盘读取数据放到一个本地内存缓存),以packet为单位, A收到一个packet就会传给B,B传给C;A每传一个packet会放入一个应答队列等待应答

(7) 当一个block传输完成之后,client再次请求namenode上传第二个block的服务器。

参考

1.1.2 hdfs读文件的步骤

(1) client跟namenode通信请求下载文件

(2) namenode向client返回文件的元数据

(3) Client向DN1请求访问读数据block1(选择服务器,使用就近原则,请求建立socket流)

(4) DN1向Client传输数据

(5) Client向DN2请求访问读数据block2

(6) DN2向Client传输数据

参考

1.2 JAVA如何读取HDFS

参考

方法1: HttpFS

HttpFs可以干这两件事情

  • 通过HttpFs你可以在浏览器里面管理HDFS上的文件
  • HttpFs还提供了一套REST 风格的API可以用来管理HDFS
Authenticator.setDefault(new MyAuthenticator());
URL url = new URL("http://dev.test.com:14000/webhdfs/v1/tmp/test?op=OPEN");
InputStream ins = url.openConnection().getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(ins));
String str;
while((str = reader.readLine()) != null)
    System.out.println(str);

参考

方法2:Hadoop Java API

URI uri = new URI("hdfs://localhost:9000");
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(uri,conf);
// 创建一个文件夹
boolean mkdirs = fs.mkdirs(new Path("/abba"));
// 文件夹内创建一个文件
boolean b = fs.createNewFile(new Path("/abba/a.txt"));

// 文件添加内容
FSDataOutputStream append = fs.append(new Path("/abba/a.txt"));
BufferedWriter bf =new BufferedWriter(new OutputStreamWriter(append));
bf.write("这一行没换行");

//文件内容追加
FSDataOutputStream append = fs.append(new Path("/abba/a.txt"));
append.write("hello world !".getBytes());

//读取文件内容
InputStream is = fs.open(new Path("/abba/a.txt"));
BufferedReader bf = new BufferedReader(new InputStreamReader(is));
String s = null;
while ((s = bf.readLine()) != null){
    System.err.println(s);
}

方法3:FileOutputFormat

FileOutputFormat.setOutputPath(job, new Path("file" + key));
context.write(key, result);

1.3 HDFS上NameNode的fsimage和edits文件

NameNode保存metadata信息包括
    1.文件owership和permissions
    2.文件大小,时间
    3.(Block列表:Block偏移量),位置信息
    4.Block每副本位置(由DataNode上报)

NameNode持久化
    1.NameNode的metadate信息在启动后会加载到内存
    2.metadata存储到磁盘文件名为”fsimage”
    3.Block的位置信息不会保存到fsimage
    4.edits记录对metadata的操作日志

fsimage和editlog的区别?
    当NN,SN要进行数据同步时叫做checkpoint时就用到了fsimage与edit,fsimage是保存最新的元数据的信息。
    
    fsimage保存了最新的元数据检查点,包含了整个HDFS文件系统的所有目录和文件的信息。
    
    editlog主要是在NameNode已经启动情况下对HDFS进行的各种更新操作进行记录,HDFS客户端执行<br/>&nbsp;&nbsp;所有的写操作都会被记录到editlog中。
    
    为了避免editlog不断增大,secondary namenode会周期性合并fsimage和edits成新的fsimage,<br/>&nbsp;&nbsp;
    新的操作记录会写入新的editlog中,这个周期可以自己设置(editlog到达一定大小或者定时)。

理解

参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值