HDFS设计思想、元数据、简单JAVAAPI操作HDFS
2020-07-15 06:05
190 查看
一、 设计思路
分布式文件系统
在Hadoop中文件系统是一个顶层的抽象。 分布式文件系统相当与对文件系统进行了一个扩展(类似于java中的接口)。 HDFS是分布式文件系统的一个实现,分布式文件系统还有许多其他的实现。
二、设计目标
1、硬件错误 是常态:特别是硬盘的损坏。所以存在副本机制。 2、数据流访问:所有的访问都是访问大量的数据, 使用IO流一直操作。稳定而不是效率。 3、大数据集:存入到HDFS的数据都是海量的数据,不擅长处理小数据。 因为存入过多小数据,每个小数据都需要元数据,容易导致namenode宕机。 4、简单的相关模型:假定文件是一次写入,多次访问 5、移动计算比移动数据便宜 6、多种软硬件的可移植性
三 HDFS架构图
namenode:主要处理用户请求,维护元数据信息 secondarynode:辅助namenode维护元数据 datanode:存储数据
300M的文件需要划分为3个block块,实际的存储磁盘是300M,与block块个数没关系。
四、HDFS元数据管理
元数据分为两部分: fsimage 和edits fsimage :保存着一份相对比较完整的元数据 。内存和磁盘中都有 edits:保存着一段时间内的操作日志、元数据。 内存和磁盘中都有 edits会在一些特定条件下(一段时间内,或者在文件达到多大)合并到fsimage中。
五、HDFS元数据合并
1、当达到条件后,secondarynode会通知namenode将要进行元数据合并,并让namenode进行edits切换。 2、secondarynode通过http的方式获取fsimage和edits 3、将fsimage和edits进行合并 4、将新的fsimage发送给namenide替换旧的fsimage 注意: sencondarynode进行合并的时候是在内存中进行的,所以需要大的内存,部署的时候最好单独部署。
6、HDFS上传文件
1、client通知namenode需要上传文件 2、namenode检查是否有权限。namenode允许client上传文件 3、client将文件分割成block块,并访问namenode询问第一个block块存入何处。 4、namenode通过机架感知原理,找到离客户端最近的一台机器(跨交换机最少的机器),找到该机器可用的block块,返回给client 5、client找到对应的datanode以及对应的block的id ,建立RPC连接,通过rpc连接简历pipline进行数据传输。(数据传输是通过UDP进行包传输)。 6、当第一个block块传递完毕,数据校验。反向的校验机制会给client一个响应,client进行第二个block传递,直至所有block传递完毕 7、等数据传递完毕后,client通知namenode建立元数据
block复制策略: 第一个block存在namenode返回的datanode中 第二个存储在同一个交换机下的datanode 第三个存在不通的交换机
7、HDFS文件读取
1、client通知namenode读取数据 2、namenode检验权限,如果前线通过,那么namenode通过查找元数据,返回所有block块地址 查找block规则: 离client最近 心跳机制(最近活跃的,namenode和datanode间存在心跳机制,datanode会一直返回给namenode自己的状态) 3、client并行访问datanode,读取所有block块并进行拼接。
注意
数据写入是串行:写入有ack机制,需要一个block块验证数据完整性后才能写入下一个。 数据读取是并行:读取不需要数据校验。
当一个block块读取到一般出现异常? 没有断点续传 client会到到副本中找,然后重新读取。
八、JAVA API
public void hdfs() throws Exception { //注册驱动 URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory()); String url = "hdfs://node01:8020/install2.log"; InputStream inputStream = new URL(url).openStream(); FileOutputStream fileOutputStream = new FileOutputStream(new File("c:\\software\\hello1.txt")); IOUtils.copy(inputStream, fileOutputStream); IOUtils.closeQuietly(inputStream); IOUtils.closeQuietly(fileOutputStream); } @Test public void fileSystem01() throws IOException { Configuration configuration = new Configuration(); configuration.set("fs.defaultFS", "hdfs://node01:8020"); FileSystem fileSystem = FileSystem.get(configuration); System.out.println(fileSystem.toString()); fileSystem.close(); } @Test public void fileSystem02() throws URISyntaxException, IOException { Configuration configuration = new Configuration(); FileSystem fileSystem = FileSystem.get(new URI("hdfs://node01:8020"), configuration); System.out.println(fileSystem.toString()); fileSystem.close(); } @Test public void fileSystem03() throws IOException { Configuration configuration = new Configuration(); configuration.set("fs.defaultFS", "hdfs://node01:8020"); FileSystem fileSystem = FileSystem.newInstance(configuration); System.out.println(fileSystem.toString()); fileSystem.close(); } @Test public void fileSystem04() throws IOException, URISyntaxException { Configuration configuration = new Configuration(); FileSystem fileSystem = FileSystem.newInstance(new URI("hdfs://node01:8020"),configuration); System.out.println(fileSystem.toString()); fileSystem.close(); }
相关文章推荐
- JAVA操作HDFS API(hadoop)
- java调用API操作HDFS
- paip.复制文件 文件操作 api的设计uapi java python php 最佳实践
- elasticsearch之javaAPI简单操作增删改、批量处理(一)
- Hadoop读书笔记(三)Java API操作HDFS
- java设计模式--基础思想总结--父类引用操作对象
- HDFS文件系统简单的Java读写操作
- 大数据---hadoop---hdfsAPI操作(java)
- zookeeper JAVA API 简单操作
- hadoop - hadoop2.6 伪分布式 - Java API 操作 HDFS
- java设计模式--基础思想总结--父类引用操作对象
- Java 封装 HDFS API 操作
- HDFS文件系统操作JAVA-API
- 面向对象思想设计简单动物乐园Java程序
- JAVA API操作小文件合并至HDFS(笔记)
- HDFS的JavaAPI操作
- HDFS的Java API操作本地环境搭建
- HDFS的JavaAPI操作
- Java 封装 HDFS API 操作
- JAVA API 实现hdfs文件操作