1、HDFS相关类说明java
FileSystem:通用文件系统的抽象基类,能够被分布式文件系统继承,全部可能使用Hadoop文件系统的代码都要使用到这个类。apache
DistributedFileSystem:Hadoop为FileSystem这个抽象类提供了多种具体的实现,DistributedFileSystem就是FileSystem在HDFS文件系统中的实现。缓存
FSDataInputStream:FileSystem的open()方法返回的是一个输入流FSDataInputStream对象,在HDSF文件系统中具体的输入流就是DFSInputStream。服务器
FSDataOutputStream:FileSystem的create()方法返回的是一个输出流FSDataOutputStream对象,在HDFS文件系统中具体的输出流就是DFSOutputStream。网络
2、读数据的过程分布式
客户端连续调用open()、read()、close()读取数据时,HDFS内部执行流程以下:
函数
ps:在读取数据的过程当中,若是客户端与数据节点通讯时出现错误,就会尝试链接包含此数据块的下一个数据节点oop
代码举例:学习
import java.io.BufferedReader; import java.io.InputStreamReader; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.fs.FSDataInputStream; public class Hdfsread { public static void main(String[] args) { try { Configuration conf = new Configuration(); conf.set("fs.defaultFS","hdfs://localhost:9000"); conf.set("fs.hdfs.impl","org.apache.hadoop.hdfs.DistributedFileSystem"); FileSystem fs = FileSystem.get(conf); Path file = new Path("test"); FSDataInputStream getIt = fs.open(file); BufferedReader d = new BufferedReader(new InputStreamReader(getIt)); String content = d.readLine(); //读取文件一行 System.out.println(content); d.close(); //关闭文件 fs.close(); //关闭hdfs } catch (Exception e) { e.printStackTrace(); } } }
3、写数据过程.net
客户端向HDFS写数据是一个复杂的过程,客户端连续调用create()、write()和close()时,HDFS内部执行过程以下:(ps:不发生任何异常状况)
代码举例:
import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.FSDataOutputStream; import org.apache.hadoop.fs.Path; public class Hdfswrite { public static void main(String[] args) { try { Configuration conf = new Configuration(); conf.set("fs.defaultFS","hdfs://localhost:9000"); conf.set("fs.hdfs.impl","org.apache.hadoop.hdfs.DistributedFileSystem"); FileSystem fs = FileSystem.get(conf); byte[] buff = "Hello world".getBytes(); // 要写入的内容 String filename = "test"; //要写入的文件名 FSDataOutputStream os = fs.create(new Path(filename)); os.write(buff,0,buff.length); System.out.println("Create:"+ filename); os.close(); fs.close(); } catch (Exception e) { e.printStackTrace(); } } }
4、简单总结
读的过程:
写的过程:
补充2:若经过检查,直接先将操做写入EditLog,WAL(write aheadlog)操做,先写log在写内存,写入失败经过EditLog记录校验。
补充4:packet默认64k。
补充5:写完一个block块后汇总确认,不会每一个packet确认。
补充7:HDFS通常状况下都是强调强一致性,即全部数据节点写完后才向名称节点汇报。
Reference:
dblab.xmu.edu.cn
blog.csdn.net/qq_38202756/article/details/82262453
学习交流,有任何问题还请随时评论指出交流。