Hadoop之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/> 然后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/> 所有的写操作都会被记录到editlog中。
为了避免editlog不断增大,secondary namenode会周期性合并fsimage和edits成新的fsimage,<br/>
新的操作记录会写入新的editlog中,这个周期可以自己设置(editlog到达一定大小或者定时)。