JAVAAPI

上传小文件

代码

上面的例子完成了把一个字符串输出到hdfs中的/test目录中。

原理

见上传大文件的例子

上传大文件

代码

原理

客户端调用FileSystem的create方法创建文件,这个时候会远程调用NameNode,在文件系统的命名空间中创建一个新的文件,NameNode创建新文件时需要执行各种各样的检查,如NameNode是否正常工作,被创建的文件已经存在,客户端是否有在父目录中创建文件的权限等。这些检查都通过以后,NameNode会创建一个新的文件,并记录创建操作到编辑日志edit中。当创建完成一个新的空文件以后,客户端需要向NameNode节点申请数据块,执行addBlock方法。该方法执行成功以后,会返回一个LocatedBlock对象,该对象包含了新数据块的数据块标识和版本号。根据该LocatedBlock对象,客户端就可以和对应的DataNode联系,然后通过写操作,把一个一个Block写入到DataNode中。当写完一个数据包以后,DataNode节点通过调用NameNode节点的DatanodeProtocol远程接口的blockReceived方法,向NameNode提交数据块信息。当把所有的数据写完以后,就会调用close方法关闭流。

创建一个目录

代码

原理

客户端调用HDFS的FileSystem实例,也就是DistributedFileSystem的mkdir方法,该对象通过远程调用NameNode节点上的远程方法mkdir ,让NameNode执行具体的创建子目录操作。在目录树数据结构上的对应位置创建新的目录节点,同时记录这个操作并持久化到日志中。在整个操作期间,客户端和NameNode都不需要和DataNode节点交互。

删除一个文件

代码

原理

同以上的步骤,先在NameNode上执行节点名字的删除,但是DataNode上存放的数据块也必须删除。当NameNode执行delete方法时,它只标记操作涉及的需要被删除的数据块,而不会主动联系这些数据块所在的DataNode节点。当保存着这些数据块的DataNode节点向NameNode节点发送心跳时,在心跳应答里,NameNode节点会向DataNode发出指令,从而把数据删除掉。所以在执行完delete方法后的一段时间内,数据块才能被真正的删除掉。

读文件

代码

原理

客户端通过FileSystem.open()打开文件,在打开文件的时候,实际上创建了一个DFSInputStream输入流,返回给了客户端,客户端使用这个输入流读取数据,在输入流中会通过ClientProtocol.getBlockLocations方法来确定NameNode节点上标识的文件数据块的保存位置(在DataNode节点上)。完成上述步骤,客户端就知道了要读取的文件在哪个DataNode节点上,在哪个数据块中。当执行FSDataInputStream的read方法时,客户端的FSDataInputStream会和最近的数据节点建立联系。

查看某一个文件的具体位置

在这里,通过hdfs.getFileStatus(path)来得到指定路径下的文件的信息,可以得到的信息有

文件的大小、文件的复制集、文件的block、block所在的host,host的名字等信息。

查看datanode节点信息

HDFS之JAVAAPI的更多相关文章

  1. 大数据入门第五天——离线计算之hadoop(下)hadoop-shell与HDFS的JavaAPI入门

    一.Hadoop Shell命令 既然有官方文档,那当然先找到官方文档的参考:http://hadoop.apache.org/docs/current/hadoop-project-dist/had ...

  2. HDFS之二:HDFS文件系统JavaAPI接口

    HDFS是存取数据的分布式文件系统,HDFS文件操作常有两种方式,一种是命令行方式,即Hadoop提供了一套与Linux文件命令类似的命令行工具.HDFS操作之一:hdfs命令行操作 另一种是Java ...

  3. 三、hdfs的JavaAPI操作

    下文展示Java的API如何操作hdfs,在这之前你需要先安装配置好hdfs https://www.cnblogs.com/lay2017/p/9919905.html 依赖 你需要引入依赖如下 & ...

  4. HDFS的JavaAPI

    配置windows平台的Hadoop环境 在 windows 上做 HDFS 客户端应用开发,需要设置 Hadoop 环境,而且要求是windows 平台编译的 Hadoop,不然会报以下的错误: F ...

  5. hdfs深入:10、hdfs的javaAPI操作

    /** * 递归遍历hdfs中所有的文件路径 */ @Test public void getAllHdfsFilePath() throws URISyntaxException, IOExcept ...

  6. hdfs深入:08、hdfs的JavaAPI以及如何解决winutils的问题

    /** * 通过url注册的方式访问hdfs,了解,不会用到 * @throws Exception */ 以下为详细代码://1.注册hdfs的url,让java代码能识别hdfs的url形式URL ...

  7. 大数据入门第六天——HDFS详解

    一.概述 1.HDFS中的角色 Block数据: HDFS中的文件在物理上是分块存储(block),块的大小可以通过配置参数( dfs.blocksize)来规定,默认大小在hadoop2.x版本中是 ...

  8. hdfs深入:02、今日课程内容大纲以及hdfs的基本实现

    1.hadoop第三天课程内容 hdfs:分布式文件存储系统hdfs的架构图hdfs的副本机制以及block块hdfs的元数据信息fsimage与editshdfs的文件读写过程hdfs的javaAP ...

  9. Hadoop HA集群的搭建

    HA 集群搭建的难度主要在于配置文件的编写, 心细,心细,心细! ha模式下,secondary namenode节点不存在... 集群部署节点角色的规划(7节点)------------------ ...

随机推荐

  1. 使用Joda-Time优雅的处理日期时间(转)

    简介 在Java中处理日期和时间是很常见的需求,基础的工具类就是我们熟悉的Date和Calendar,然而这些工具类的api使用并不是很方便和强大,于是就诞生了Joda-Time这个专门处理日期时间的 ...

  2. Codeforces Round #456 (Div. 2) 912D D. Fishes

    题: OvO http://codeforces.com/contest/912/problem/D 解: 枚举每一条鱼,每放一条鱼,必然放到最优的位置,而最优位置即使钓上的概率最大的位置,即最多的r ...

  3. 内置对象:Math

    JavaScript内置函数Math.random()自定义封装函数:1,Math.floor(Math.random()*(b-a+1)+a)  随机生成a到b之间的整数. 也可以写成:Math.f ...

  4. ...cURL error 60: SSL certificate problem: unable to get local issuer certificate...

    问题描述: 在做PHP爬虫的时候, 安装了 guzzle 和 dom-crawler 之后, 调用的时候出现问题, 如下 报错内容:  Fatal error: Uncaught GuzzleHttp ...

  5. Spring中,请求参数处理

    Spring中,Controller里,获取请求数据有多种情况 在使用@RequestParam的方式获取请求中的参数时, 如果没有设置required这个属性,或者主动设置为true,则意味着这个参 ...

  6. parents([expr]) 取得一个包含着所有匹配元素的祖先元素的元素集合(不包含根元素)。可以通过一个可选的表达式进行筛选。

    parents([expr]) 概述 取得一个包含着所有匹配元素的祖先元素的元素集合(不包含根元素).可以通过一个可选的表达式进行筛选.大理石平台检定规程   参数 exprStringV1.0 用于 ...

  7. 【csp模拟赛1】不服来战 (challenge.cpp)

    [题目描述] 最近小 Z 和他的朋友都迷上了一款手机游戏:不服来战. 游戏的设定十分简单,在游戏开始时,会给出一排共 N 个灯,有的灯是开着 的有的是关着的,每个灯都有一个分数.而玩家可以进行任意次操 ...

  8. ubuntu彻底卸载mysql并且重新安装

    环境: root@ubuntu:/usr/local/mysql/data# uname -a Linux ubuntu 4.4.0-87-generic #110-Ubuntu SMP Tue Ju ...

  9. centos 安装mariadb 替代mysql

    yum install mariadb-server mariadb systemctl start mariadbmysql -uroot -p默认密码mysql -uroot -pmysql_se ...

  10. linux环境中关闭tomcat,通过shutdown.sh无法彻底关闭--线程池

    最近测试环境上测试的项目通过shutdown.sh始终无法彻底关闭. 之前临时解决方法两种: 第一:通过ps -ef|grep tomcat查看到tomcat的进程直接使用kill来杀死进程. 第二: ...