将文件写入hdfs|hdfs api创建文件并写入内容

|

Ⅰ Hadoop 自身提供将文件从文件系统复制到 HDFS 的功能,有人了解这方面的东东么

命令行 dfs -put 就可以要是java程序的话 主要看FileSystem那个类相关接口 还有FIleUtil 这个里面的一些接口!

Ⅱ hdfs工作流程

1. hdfs基本工作流程

1. hdfs初始化目录结构

hdfs namenode -format 只是初始化了namenode的工作目录而datanode的工作目录是在datanode启动后自己初始化的

namenode在format初始化的时候会形成两个标识:blockPoolId:clusterId:

新的datanode加入时,会获取这两个标识作为自己工作目录中的标识

一旦namenode重新format后,namenode的身份标识已变,而datanode如果依然持有原来的id,就不会被namenode识别

2. hdfs的工作机制

hdfs集群分为两大角色:NameNode,DataNode (Secondary NameNode)

NameNode负责管理整个文件的元数据(命名空间信息,块信息) 相当于Master

DataNode负责管理用户的文件数据块 相当于Salve

文件会按照固定的大小(block=128M)切成若干块后分布式存储在若干个datanode节点上

每一个文件块有多个副本(默认是三个),存在不同的datanode上

DataNode会定期向NameNode汇报自身所保存的文件block信息,而namenode则会负责保持文件副本数量

hdfs的内部工作机制会对客户的保持透明,客户端请求方法hdfs都是通过向namenode申请来进行访问

SecondaryNameNode有两个作用,一是镜像备份,二是日志与镜像的定期合并

3. hdfs写入数据流程

1.客户端要向hdfs写入数据,首先要跟namenode通信以确认可以写文件并获得接收文件block的datanode,然后,客户端按照顺序将文件block逐个传给相应datanode,并由接收到block的datanode负责向其他datanode复制block副本

4. 写入数据步骤详细解析

客户端向namenode通信,请求上传文件,namenode检查目标文件是否已经存在,父目录是否存在

namenode返回给客户端,告知是否可以上传

客户端请求第一个block该传输到那些datanode服务器上

namenode返回3个datanode服务器abc

客户端请求3台datanode的一台a上传数据(本质上是一个rpc调用,建立pipeline),A收到请求后会继续调用b,然后b调用c,将整个pipeline建立完成,逐级返回客户端。

客户端开始忘a上传第一个block(先从磁盘读取数据放入本地内存缓存),以packet为单位,a收到一个packet将会传给b,b传给c,a每传一个packet会放入一个应答队列等待应答

宕一个block传输完之后,客户端再次请求namenode上传第二个block的服务器

Ⅲ hadoop的几个问题 1.将本地文件复制到hdfs中,那么在hdfs中这个文件是存放在namenode还是分开放在datanode

试着回答:先说明一下:1. namenode负责管理目录和文件信息,真正的文件块是存放在datanode上。2. 每个map和rece(即task)都是java进程,默版认是有单独的jvm的,所以不可能同一个类的对象会在不同节点上。看你的描述是把namenode,datanode和jobtracker,tasktracker有点混了。所以:问题1. 分块存放在datanode上问题2.inputformat是在datanode上,确切的说是在tasktracker中。每权个map和rece都会有自己的对象,当多个map读入一个文件时,实际上不同的map是读的文件不同的块,rece也是一样,各个任务读入的数据是不相交的。问题3.rece输出肯定是在hdfs上,和普通文件一样在datanode上。问题4.每个recer会有自己的outputformat对象,与前面inputformat原因一样。

Ⅳ hdfs api创建文件并写入内容

Hadoop中关于文件操作类基本上全部是在"org.apache.hadoop.fs"包中,这些API能够支持的操作包含:打开文件,读写文件,删除文件等。

Hadoop类库中最终面向用户提供的接口类是FileSystem,该类是个抽象类,只能通过来类的get方法得到具体类。get方法存在几个重载版本,常用的是这个:


赞 (0)