Hadoop学习

文章目录

用在普通硬件设备上的分布式文件系统,是Hadoop的一部分,分布式文件系统是一种允许文件通过网络在多台主机上共享的文件系统,可以让多台机器上的用户分享文件和存储空间。

HDFS架构

Namenode和Datanode

NameNode是整个文件系统的管理节点。它维护着整个文件系统的文件目录树,文件/目录的元信息和每个文件对应的数据块列表。同是接收用户的请求。
文件包括:
fsimage:元数据镜像文件。存储某一时段NameNode内存元数据信息。
edits:操作日志文件。
fstime:保存最近一次checkpoint的时间。
以上这些文件都是保存的Linux文件系统中。

1
2
3
4
5
6
7
8
9
10
11
12
13
--current
--version
--edits
--fsimage
--fstime
--image
--fsimage
--in_use.lock
--pervious.checkpoint
--version
--edits
--fsimage
--fstime

DataNode提供真实数据的存储服务,保存Block,启动datanode线程向NameNode汇报信息,发送心跳与namenode
保持联系。
文件块(block):最基本的存储单位,在Hadoop2中HDFS的默认大小是128M,Hadoop1.X中为64M,不同于普通文件系统的是,HDFS中,如果一个文件小于一个数据块的大小,并不占用整个数据块存储空间,但仍需要一个文件块。
HDFS架构图:
HDFS架构图
首先客户端(client)和namenode进行通讯,获取一些元数据信息,然后namenode查询相应的元数据信息返回给客户端(注意:元数据信息保存在内存和磁盘中各有一份,即安全又快速);
然后客户端开始读取数据,注意在读取时依次读取,不会同时读取(会采用数据就近原则);
同时namanode会给dataname一些信息,datanode会进行数据的水平复制。

元数据存储

1
2
NameNode(FileName,replicas,block-ids,id2host...)
/test/a.log,3,{blk_1,blk_2},[{blk_1:[h0,h1,h3]},{blk_2:[h0,h2,h4]}]

说明:
a.log存放了3个副本,文件被切分成了三块,分别是:blk_1,blk_2,第一块存放在h0,h1,h3三台机器上,第二块存放在h0,h2,h4上。

HDFS-SHELL命令

调用文件系统(FS)Shell命令应使用 bin/hadoop fs 的形式。
所有的FS shell命令使用URI路径作为参数。
URI格式是scheme://authority/path。HDFS的scheme是hdfs,对本地文件系统,scheme是file。其中scheme和authority参数都是可选的,如果未加指定,就会使用配置中指定的默认scheme。
创建文件夹

1
hadoop fs -mkdir /user/root/input

上传文件到input下
1
hadoop fs -put test.txt /user/root/input

查看文件内容
1
hadoop fs -cat/tail/text /user/root/input/test.txt

将文件下载到本地
1
hadoop fs -get /user/root/input/test.txt  /usr/local

删除文件
1
hadoop fs -rmr /user/root/input/test.txt

dfsadmin命令
1
2
3
-report 报告文件系统基本信息
-safemode enter|leave|get|wait
-refreshNodes重新获取hosts

fsck命令
1
hadoop fsck / -files -blocks -locations 

Java-API

客户端与HDFS读交互
客户端与HDFS读交互
客户端与HDFS写交互
客户端与HDFS写交互
JavaAPI接口
GitHub

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
step1:得到configuration对象
step2:得到FileSystem对象
step3:进行文件操作
在HDFS上创建文件目录 mkdirs(Path)
在HDFS上创建文件 FSDataOutputStream fsout = coreSys.create(Path);
BufferedOutputStream bout = new BufferedOutputStream(fsout);
bout.write(content.getBytes(), 0, content.getBytes().length);
从本地上传任意文件到服务器HDFS环境
copyFromLocalFile(srcPath, remotePath);
重命名文件名 rename(oldFileName, newFileName);
删除文件 delete(filePath, false);
查看某个文件在HDFS集群的位置
FileStatus fileStaus=coreSys.getFileStatus(targetFile);
BlockLocation []bloLocations=coreSys.getFileBlockLocations(fileStaus, 0,fileStaus.getLen());
for(int i=0;i<bloLocations.length;i++){
System.out.println("block_"+i+"_location:"+bloLocations[i].getHosts()[0]);
}