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