HDFS中的数据流

博客内容来自我啃的Hadoop权威指南,记录一下帮助自己理一下思路

一、文件读取

  • 步骤1,客户端通过调用 FileSystem 对象的 open() 方法来打开想读取的文件,对于 HDFS 来说,这个对象是分布式文件系统(DistributedFileSystem)的一个实例
  • 步骤2,DistributedFileSystem 通过使用 RPC 来调用 namenode ,获取文件的存储位置,以确定文件起始块的位置。namenode 返回文件所有组成块的副本的 datanode 地址。并且这些 datanode 地址信息是已经排过序的。DistributedFileSystem 的 open() 方法返回一个 FSDataInputStream 对象给客户端读取数据。FSDataInputStream 类封装了DFSInputStream 对象,该对象管理着 datanode 和 namenode 的 I/O。
  • 步骤3,客户端对 FSDataInputStream 对象调用 read() 方法,存储着文件起始几个块的datanode地址的DFSInputStream随即连接距离最近的文件中第一个块所在的datanode。
  • 步骤4,通过对数据流反复调用read()方法,可以将数据从datanode传输到客户端。
  • 步骤5,到达块的末端时,DFSInputStream关闭与该datanode的连接,然后寻找下一个块的最佳datanode。
  • 步骤6,客户端从流中读取数据时,块是按照打开DFSInputStream与datanode新建连接的顺序读取的,它也会根据需要询问namenode来检索下一批数据块的datanode位置。一旦客户端完成读取,就对FSDataInputStream调用close()方法。

二、写入文件

  • 步骤1,客户端通过对DistributedFileSystem对象调用create()函数来新建文件。
  • 步骤2,DistributedFileSystem对namenode创建一个RPC调用,在文件系统的命名空间中新建一个文件,此时该文件中还没有相应的数据块。namenode执行各种不同的检查以确保这个文件不存在以及客户端有新建文件的权限。如果这些检查均通过,namenode就会为创建新文件记录一条记录
  • 步骤3,客户端写入数据。
  • 步骤4,在客户端写入数据时,DFSOutputStream将它分成一个个的数据包,并写入内部队列,称为“数据队列”(data queue)。DataStreamer处理数据队列,它的责任是根据datanode列表来要求namenode分配适合的新块来存储数据复本。这一组datanode构成一个管线——我们假设复本数为3,所以管线中有3个节点。DataStreamer将数据包流式传输到管线中第一个datanode,该datanode存储数据包并将它发送到管线中的第二个datanode。同样,第二个datanode存储该数据包并且发送给管线中的第三个(也是最后一个)datanode。
  • 步骤5,DFSOutputStream也维护着一个内部数据包队列来等待datanode的收到确认回执,称为“确认队列”(ack queue)。收到管道中所有datanode确认信息后,该数据包才会从确认队列删除
  • 步骤6,客户端完成数据的写入后,对数据流调用close()方法
  • 步骤7,该操作将剩余的所有数据包写入datanode管线,并在联系到namenode且发送文件写入完成信号之前,等待确认。namenode已经知道文件由哪些块组成(通过Datastreamer请求分配数据块),所以它在返回成功之前只需要等待数据块进行最小量的复制。

原文地址:https://www.cnblogs.com/frankxx/p/9280764.html

时间: 2024-10-11 00:48:23

HDFS中的数据流的相关文章

HDFS中的读写数据流

1.文件的读取 在客户端执行读取操作时,客户端和HDFS交互过程以及NameNode和各DataNode之间的数据流是怎样的?下面将围绕图1进行具体讲解. 图 1 客户端从HDFS中读取数据 1)客户端通过调用FileSystem对象中的open()函数来读取它做需要的数据.FileSystem是HDFS中DistributedFileSystem的一个实例. 2)DistributedFileSystem会通过RPC协议调用NameNode来确定请求文件块所在的位置. 这里需要注意的是,Nam

HDFS中的命令行

HDFS中的命令行 本文介绍了HDFS以命令行执行的时候.几个经常使用的命令行的作用和怎样使用~ 1. fs fs是启动命令行动作,该命令用于提供一系列子命令. 使用形式为hadoop fs –cmd <args> 当中,cmd是子命令,args是详细的命令操作. 比如hadoop fs –help 或者说fs是其余子命令的父亲.其余都是在"-cmd"的模式下的! 2. –cat 输出 hadoop fs –cat URI 将路径指定的文件输出到屏幕 3. –copyFro

HBase结合MapReduce批量导入(HDFS中的数据导入到HBase)

HBase结合MapReduce批量导入 1 package hbase; 2 3 import java.text.SimpleDateFormat; 4 import java.util.Date; 5 6 import org.apache.hadoop.conf.Configuration; 7 import org.apache.hadoop.hbase.client.Put; 8 import org.apache.hadoop.hbase.mapreduce.TableOutput

hadoop学习;大数据集在HDFS中存为单个文件;安装linux下eclipse出错解决;查看.class文件插件

sudo apt-get install eclipse 安装后打开eclipse,提示出错 An error has occurred. See the log file /home/pengeorge/.eclipse/org.eclipse.platform_3.7.0_155965261/configuration/1342406790169.log. 查看错误日志然后解决 打开log文件,看到以下的错误 !SESSION 2012-07-16 10:46:29.992 --------

HDFS中JAVA API的使用

转自:http://www.cnblogs.com/liuling/p/2013-6-17-01.html 相关源代码:http://www.cnblogs.com/ggjucheng/archive/2013/02/19/2917020.html HDFS是一个分布式文件系统,既然是文件系统,就可以对其文件进行操作,比如说新建文件.删除文件.读取文件内容等操作.下面记录一下使用JAVA API对HDFS中的文件进行操作的过程. 对分HDFS中的文件操作主要涉及一下几个类: Configurat

Linux启动kettle及linux和windows中kettle往hdfs中写数据(3)

在xmanager中的xshell运行进入图形化界面 1 sh spoon.sh 新建一个job 1.往hdfs中写数据 1)linux中kettle往hdfs中写数据 双击hadoop copy files 运行此job 查看数据: 1)windows中kettle往hdfs中写数据 Windows中往power服务器中hdfs写数据 日志: 2016/07/28 16:21:14 - Version checker - OK 2016/07/28 16:21:57 - 数据整合工具-作业设计

mysql导入到hdfs中常见问题

mysql导入到hdfs中命令:sqoop import --connect jdbc:mysql://192.168.0.161:3306/angel --username anqi -password anqi --table test2 --fields-terminated-by '\t' -m 1 常见问题1:Warning: /opt/cloudera/parcels/CDH-5.12.0-1.cdh5.12.0.p0.29/bin/../lib/sqoop/../accumulo

Android4.2.2的Stagefright中编解码器数据流的维护

本文均属自己阅读源码的点滴总结,转账请注明出处谢谢. 欢迎和大家交流.qq:1037701636 email:[email protected] Android源码版本Version:4.2.2; 硬件平台 全志A31 前沿: 在前面的博文中,基本提到的是stagefright相关的控制流,具体分析了android架构中的MediaExtractor.AwesomePlayer.StagefrightPlayer.OMXCodec等的创建,底层OMXNodinstance实例的创建.分析了OMX

使用Sqoop1.4.4将MySQL数据库表中数据导入到HDFS中

问题导读:         1.--connect参数作用? 2.使用哪个参数从控制台读取数据库访问密码? 3.Sqoop将关系型数据库表中数据导入HDFS基本参数要求及命令? 4.数据默认导入HDFS文件系统中的路径? 5.--columns参数的作用? 6.--where参数的作用? 一.部分关键参数介绍 参数介绍 --connect <jdbc-uri> 指定关系型数据库JDBC连接字符串 --connection-manager <class-name> 指定数据库使用的管