ITPub博客

首页 > 数据库 > 数据库开发技术 > 大数据&HDFS的读写编程实战

大数据&HDFS的读写编程实战

原创 数据库开发技术 作者:小南瓜开发平台 时间:2023-10-17 00:00:00 0 删除 编辑

一、HDFS的基本编程方法

HDFS的编程主要通过Hadoop的Java API来实现。以下是基本的使用方法:

  1. 获得FileSystem实例:可以通过Configuration来获取FileSystem的实例,如:staticFileSystemget(Configuration)。也可以通过URI和Configuration来获取,如:staticFileSystemget(URI,Configuration),它会根据URI查找适合的配置文件,如果找不到,则从默认位置读取。

  2. 读取数据:可以通过FSDataInputStream来打开指定路径的文件,并返回输入流。如:FSDataInputStreamopen(Path)。也可以通过abstractFSDataInputStreamopen(path,intbuffersize)来打开指定路径的文件,其中buffersize为读取时的缓冲大小。

  3. 写入数据:可以通过FSDataOutputStream来打开指定文件进行写入。如:FSDataOutputStreamcreate(Path),该方法默认是重写文件,并且会自动生成所有父目录。



对于以上步骤,所有的操作完成后都需要关闭输入输出流,以释放资源。

同时,在Shell中,HDFS也可以通过hdfs dfs或hadoop fs命令来实现对文件的操作,如查看、上传和下载、创建文件等。


二、hdfs支持哪些方式操作

HDFS可以通过以下两种方式进行操作:

  1. 命令行方式:Hadoop提供了一套与Linux文件命令类似的命令行工具,可以通过命令行终端对HDFS进行文件上传、下载和复制等操作。

  2. Java API:利用Hadoop的Java库,采用编程的方式操作HDFS的文件。

三、HDFS的读数据过程

HDFS的读数据过程如下:

  1. 客户端向NameNode发送下载文件请求,NameNode通过查询元数据,找到文件块所在的DataNode服务器。

  2. 客户端挑选一台DataNode服务器,请求读取数据。

  3. DataNode向客户端发送数据,从磁盘里面读取数据流,以packet为单位来做校验。

  4. 客户端以packet为单位接收,先在本地缓存,然后写入目标文件,然后将每块的数据拼接起来组合成一个完整的文件。

四、HDFS的写数据过程

  1. 客户端向NameNode请求写入数据。

  2. NameNode接受写入请求后,首先判断当前这个操作用户是否拥有写入权限,如果不具有直接报错。

  3. 从接受列表中选择第一台DataNode与之连接,建立pipeline(管道)。

  4. 当连接第一台后,让第一台与第二台连接,然后第二台与第三台连接形成一条pipeline(管道)。

  5. 客户端通过package(数据包64kB)的形式发送数据,当第一台DataNode接受完数据后,然后将数据转发给第二台DataNode,当第二台DataNode接受完数据后,将数据转发给第三台DataNode。

  6. 当第一个请求完成后,搭建一个反向应答队列,当每个节点都将数据包接受后,反向给予应答反应(ACK确认机制)。

  7. 此时客户端开始源源不断的发送数据即可,当第一个block发送完成后,此时客户端重新向NameNode发送请求,获取第二个block应该存储到哪个DataNode中。



五、hdfs的java编程实例

import org.apache.hadoop.conf.Configuration;  import org.apache.hadoop.fs.FileSystem;  import org.apache.hadoop.fs.Path;  import org.apache.hadoop.fs.FSDataOutputStream;  import java.io.IOException;    public class HDFSExample {    public static void main(String[] args) throws IOException {        // 1. 获取配置对象,设置HDFS文件系统的地址      Configuration conf = new Configuration();      conf.set("fs.defaultFS", "hdfs://localhost:9000");            // 2. 获取HDFS文件系统对象      FileSystem fs = FileSystem.get(conf);            // 3. 创建新文件并打开输出流      Path path = new Path("/example.txt");      FSDataOutputStream outputStream = fs.create(path);            // 4. 向文件中写入数据      String data = "Hello, HDFS!";      outputStream.write(data.getBytes());            // 5. 关闭输出流,这样数据就会被刷到HDFS磁盘上      outputStream.close();            // 6. 关闭文件系统连接      fs.close();    }  }

原文作者:小南瓜开发平台;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2020-08-21

  • 博文量
    209
  • 访问量
    89501