HDFS读取和写入数据简介

HDFS采用流式访问机制,一次写入、多次读取。读取时,客户端从NameNode获取数据块信息,选择最近DataNode读取;写入时,数据通过管道流向多个DataNode,确保副本准确性。
摘要由CSDN通过智能技术生成

HDFS 的文件访问机制为流式访问机制,即通过 API 打开文件的某个数据块之后,可以顺序读取或者写入某个文件。由于 HDFS 中存在多个角色,且对应的应用场景主要为一次写入、多次读取的场景,因此其读和写的方式有较大不同。读/写操作都由客户端发起,并且由客户端进行整个流程的控制,NameNode 和 DataNode 都是被动式响应。
读取流程

客户端发起读取请求时,首先与 NameNode 进行连接。

连接建立完成后,客户端会请求读取某个文件的某一个数据块。NameNode 在内存中进行检索,查看是否有对应的文件及文件块,若没有则通知客户端对应文件或数据块不存在,若有则通知客户端对应的数据块存在哪些服务器之上。

客户端接收到信息之后,与对应的 DataNode 连接,并开始进行数据传输。客户端会选择离它最近的一个副本数据进行读操作。

如图 1 所示,读取文件的具体过程如下。

  1. 客户端调用 DistributedFileSystem 的 Open() 方法打开文件。

  2. DistributedFileSystem 用 RPC 连接到 NameNode,请求获取文件的数据块的信息;NameNode 返回文件的部分或者全部数据块列表;对于每个数据块,NameNode 都会返回该数据块副本的 DataNode 地址;DistributedFileSystem 返回 FSDataInputStream 给客户端,用来读取数据。

  3. 客户端调用 FSDataInputStream 的 Read() 方法开始读取数据。

  4. FSInputStream 连接保存此文件第一个数据块的最近的 DataNode,并以数据流的形式读取数据;客户端多次调用 Read(),直

要将RabbitMQ中的数据写入HDFS中,可以使用Flume来实现。Flume是一个分布式、可靠、高可用的日志收集和聚合系统,支持从多个数据源(包括RabbitMQ)获取数据,并将数据写入到多个目的地(包括HDFS)中。 下面是一个使用Flume读取RabbitMQ数据写入HDFS的简单示例: 1. 安装RabbitMQ和Flume 首先需要安装RabbitMQ和Flume,可参考官方文档进行安装。 2. 配置RabbitMQ 需要在RabbitMQ中创建一个Exchange和一个Queue,并将它们绑定在一起。这样当有消息到达Exchange时,会被路由到Queue中。 3. 配置Flume 需要创建一个Flume配置文件,指定RabbitMQ作为数据源,HDFS作为目的地,并定义数据的格式和转换规则。 示例配置文件如下: ``` # Name the components on this agent agent.sources = rabbitmq-source agent.sinks = hdfs-sink agent.channels = memory-channel # Describe/configure the source agent.sources.rabbitmq-source.type = org.apache.flume.source.rabbitmq.RabbitMQSource agent.sources.rabbitmq-source.uri = amqp://guest:guest@localhost:5672 agent.sources.rabbitmq-source.queue = my-queue # Describe the sink agent.sinks.hdfs-sink.type = hdfs agent.sinks.hdfs-sink.hdfs.path = hdfs://localhost:9000/flume/rabbitmq-data/ agent.sinks.hdfs-sink.hdfs.fileType = DataStream agent.sinks.hdfs-sink.hdfs.writeFormat = Text # Use a channel which buffers events in memory agent.channels.memory-channel.type = memory # Bind the source and sink to the channel agent.sources.rabbitmq-source.channels = memory-channel agent.sinks.hdfs-sink.channel = memory-channel ``` 上述配置文件中,我们定义了一个名为“rabbitmq-source”的数据源,使用RabbitMQSource来接收来自RabbitMQ的数据。然后,我们定义了一个名为“hdfs-sink”的目的地,使用HDFS Sink将数据写入HDFS中。最后,我们定义了一个名为“memory-channel”的通道,用于缓存事件。 4. 启动Flume 使用以下命令启动Flume: ``` $ bin/flume-ng agent -n agent -c conf -f conf/flume.conf ``` 其中,`-n`指定代理的名称,`-c`指定配置文件目录,`-f`指定配置文件路径。 5. 测试 向RabbitMQ发送一些消息,可以通过以下命令查看HDFS中是否成功写入数据: ``` $ bin/hadoop fs -cat /flume/rabbitmq-data/* ``` 注意:这只是一个简单的示例,实际应用中需要根据具体情况进行配置和调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值