HDFS工作原理 /// JAVA连接HDFS<重点> /// 打jar包 /// idea中设值参数
- 一、HDFS工作原理
- 1、HDFS特性
- 2、读写数据流程
- 二、改maven工程
- 三、打jar包的简单方式
- 四、idea中参数设置
一、HDFS工作原理
1、HDFS特性
HDFS是一个文件系统,用于存储和管理文件,通过统一的命名空间(类似于本地文件系统的目录树)。HDFS是分布式的系统,服务器集群中各个节点都有自己的角色和职责。理解HDFS,需要注意以下几个概念:
1、HDFS中的文件在物理上是分块存储(block),块的大小可以通过配置参数(
dfs.blocksize)来规定,默认大小在hadoop2.x版本中是128M,之前的版本中是64M。
2、HDFS文件系统会给客户端提供一个统一的抽象目录树,客户端通过路径来访问文件,形如:hdfs://namenode:port/dir-a/dir-b/dir-c/file.data
3、目录结构及文件分块位置信息(元数据)的管理由namenode节点承担,namenode是HDFS集群主节点,负责维护整个hdfs文件系统的目录树,以及每一个路径(文件)所对应的数据块信息(blockid及所在的datanode服务器)
4、文件的各个block的存储管理由datanode节点承担,datanode是HDFS集群从节点,每一个block都可以在多个datanode上存储多个副本(副本数量也可以通过参数设置dfs.replication,默认是3)
5、Datanode会定期向Namenode汇报自身所保存的文件block信息,而namenode则会负责保持文件的副本数量,HDFS的内部工作机制对客户端保持透明,客户端请求访问HDFS都是通过向namenode申请来进行。
6、HDFS是设计成适应一次写入,多次读出的场景,且不支持文件的修改。需要频繁的RPC交互,写入性能不好。
2、读写数据流程
1)、读数据
客户端将要读取的文件路径发送给namenode,namenode获取文件的元信息(主要是block的存放位置信息)返回给客户端,客户端根据返回的信息找到相应datanode逐个获取文件的block并在客户端本地进行数据追加合并从而获得整个文件。
客户端向namenode发起RPC调用,请求读取文件数据。
namenode检查文件是否存在,如果存在则获取文件的元信息(blockid以及对应的datanode列表)。
客户端收到元信息后选取一个网络距离最近的datanode,依次请求读取每个数据块。客户端首先要校检文件是否损坏,如果损坏,客户端会选取另外的datanode请求。
datanode与客户端建立socket连接,传输对应的数据块,客户端收到数据缓存到本地,之后写入文件。
依次传输剩下的数据块,直到整个文件合并完成。
2)、写数据
客户端要向HDFS写数据,首先要跟namenode通信以确认可以写文件并获得接收文件block的datanode,然后客户端按顺序将文件逐个block传递给相应datanode,并由接收到block的datanode负责向其他datanode复制block的副本。
客户端向namenode发送上传文件请求,namenode对要上传目录和文件进行检查,判断是否可以上传,并向客户端返回检查结果。
客户端得到上传文件的允许后读取客户端配置,如果没有指定配置则会读取默认配置(例如副本数和块大小默认为3和128M,副本是由客户端决定的)。向namenode请求上传一个数据块。
namenode会根据客户端的配置来查询datanode信息,如果使用默认配置,那么最终结果会返回同一个机架的两个datanode和另一个机架的datanode。这称为“机架感知”策略。
客户端在开始传输数据块之前会把数据缓存在本地,当缓存大小超过了一个数据块的大小,客户端就会从namenode获取要上传的datanode列表。之后会在客户端和第一个datanode建立连接开始流式的传输数据,这个datanode会一小部分一小部分(4K)的接收数据然后写入本地仓库,同时会把这些数据传输到第二个datanode,第二个datanode也同样一小部分一小部分的接收数据并写入本地仓库,同时传输给第三个datanode,依次类推。这样逐级调用和返回之后,待这个数据块传输完成客户端后告诉namenode数据块传输完成,这时候namenode才会更新元数据信息记录操作日志。
第一个数据块传输完成后会使用同样的方式传输下面的数据块直到整个文件上传完成。
3、删除数据
客户端向namenode发起RPC调用,请求删除文件。namenode检查合法性。
namenode查询文件相关元信息,向存储文件数据块的datanode发出删除请求。 datanode删除相关数据块。返回结果。
namenode返回结果给客户端。
二、改maven工程
三、打jar包的简单方式
将 jar 包拖到Linux上,然后执行对应的命令
Hadoop命令
hadoop jar [jar包名] [全类名] [参数1] [参数2] [参数…]
四、idea中参数设置
第一步:编写相应程序,设置args[0] args[1]
public class Hel {
public static void main(String[] args) {
String s = args[0]; //接收第一个参数
int i = Integer.parseInt(args[1]); //接收第二个参数:因为args默认是String类型
System.out.println(s+i);
}
}
第二步:
Run–>Eidt Configuration
参数之间用空格分隔
内容使用引号