您的位置:首页 > 大数据 > Hadoop

HDFS初步学习的总结

2015-12-29 00:00 621 查看
摘要: 1.HDFS的基本概念和结构
2.HDFS的shell操作
3.HDFS的JAVA API
4.HDFS如何读文件
5.HDFS如何写文件

HDFS的基本概念和结构
首先我了解到,HDFS是Hadoop框架的一个分布式文件系统。所谓文件系统,就是在存储设备上组织和操作数据文件。当我们打开电脑的时候,无论是windows窗口界面双击单击操作文件,还是linux下用shell来操作文件,其实下层操作都是文件系统来做的。随着科技进步,数据量增大的今天,一个单机存储设备是逐渐放不下大量的数据了。所以在谷歌的三篇论文下,分布式文件系统(DFS)出现了。可以将多个机器看成一个整体,这样存储空间是够了,那么如何像在一台机器上操作文件呢?这就是DFS的作用。操作系统之上是文件系统,那么文件系统之上就搭载了我们的分布式文件系统。虽然分布式文件系统魅力很大,可是在设计过程中也有着诸多问题。比如,各个机器之间的网络传输问题。还有,玩意网络挂掉,那么文件怎么才能不丢失,也就是稳定性的问题。让我们看看HDFS如何解决这些问题。
要知道HDFS如何解决这些问题,我们需要先看看HDFS的体系结构。HDFS由一个namenode,一个secondarynamenode,多个datanode,还有一个客户端组成。NameNode是整个HDFS的管理节点,所以它并不是存储你要存储的文件的本身,而是这些文件的元数据。也就是文件的名字,大小,权限,修改时间等等。fsimage就是元数据的镜像文件,其中还有edits(操作日志文件)。这些文件都是保存在linux文件系统中的。DataNode节点是存储文件本身的,文件是分割成一个个文件块来存储的。为什么要弄成文件块来存储?第一很显然许多大文件一个节点是存不下来的,势必分成块。第二网络传输时万一宕掉,可以小部分重传。综上,文件块是HDFS中最基本的存储单位。一个文件块默认大小是128M(hadoop1.0版本是64M),默认块大小是可以修改的。我们要清楚一个概念,那就是如果两个130M的文件是有4个块文件,每个130M文件都是一个128M块文件和一个2M块文件,并不是你想象当中的每个块都是128M。除了将文件分块,每个块文件也有着副本,这也是为了我上面所说的稳定性,当一个机器挂了,想要里面的文件,就可以去其他机器找文件的副本。默认是三个副本,也可通过hdfs-site.xml中的replication属性修改副本数量。

HDFS的shell操作
HDFS的许多shell命令与linux的shell命令形似。如ls,cat等等。其中如果你要指定HDFS中的某个文件。那么你可以这样写hdfs://192.168.1.1(你的hadoop集群ip):9000(默认的端口)/parent/child 或者可以简写为)/parent/child 。
hdfs dfs -ls / (列出/目录下所有文件) hdfs dfs -appendToFile <localsrc> ... <dst> (追加文件内容到目标文件上) chgrp chmod chown用法与linux上的一样。copyFromLocal copyToLocal与get put一样,就是把文件载入到HDFS中和从HDFS中把文件下载下来。count列出文件夹数量,文件数量,总大小。cp复制文件夹,可以通过-p保留原有权限信息。du显示文件大小。text与cat效果类似,不过可以看zip文件。
hdfs dfsadmin -setQuota 10 /your 设置/your文件夹里面只有10个文件(包括他自己)。-clrQuota清除。hdfs dfsadmi
3ff0
n -setSpaceQuota 4k /your 设置只能放总量4k。-clrSpaceQuota清除。-safenode配上参数可以看是否处于安全模式。-report可以看hdfs的整个系统报告。

JAVA API

public class HdfsTest {
private FileSystem fileSystem;
@Before
public void getFileystem() throws Exception {
Configuration conf = new Configuration();
URI uri;
uri = new URI("hdfs://115.28.138.100:9000");
fileSystem = FileSystem.get(uri, conf, "hadoop");
}
@Test
public void testAdd() throws Exception {
fileSystem.mkdirs(new Path("hdfs://115.28.138.100:9000/niubia"));
}
@Test
public void testDelete() throws Exception{
fileSystem.delete(new Path("hdfs://115.28.138.100:9000/niubia"),false);
}
@Test
public void TestRead() throws Exception{
FSDataInputStream  fsDataInputStream=fileSystem.open(new Path("hdfs://115.28.138.100:9000/a.txt"));
FileOutputStream fileOutputStream=new FileOutputStream("D:\\eclipseforee\\eclipse\\a.txt");
IOUtils.copy(fsDataInputStream, fileOutputStream);

}
}

4.读文件
首先调用FileSystem的open方法,其实是DistributedFileSystem的open方法。通过rpc获取文件第一个block的location讯息,因为副本数大于1,所以有多个location参数返回过来。他们根据拓扑结构,将离客户端近的放在前面。接着返回流对象DFSInputStream(包装了FSDataInputStream)。就这样,一块一块接着读,对于客户端来说,放佛这个流是连续的一样。其中,若是某个块传输失败,则第二离客户端近的块拿来读,同时记录失败块所在的datanode,报告给namenode。剩余的block读的时候,会跳过这个datanode。

5.写文件

客户端再往hdfs写数据的时候,会首先在客户端缓存一个块大小的数据,接着通知namenode,namenode会为其分配一个块。接着客户端找到该块所在的datanode从而传输。如果副本数大于1,比如为3,则客户端写入的那个datanode再将块写入到另外一个datanode,接着这个datanode重复这个工作,达到副本数为3时停止。这个过程中,客户端始终保持连接。

6.其它

HDFS的HA,通俗的说就是两个namenode,也就是两个集群共用datanode,但是这两个集群的文件是不共享的。

HDFS的回收站,在/user/用户名/.Trash。

小文件如何解决?总所周知,HDFS是不擅长保存小文件的,因为小文件越多,namenode中的fsimage越大,而fsimage是在内存中的。所以,要解决小文件的问题。 方法可以自己控制程序合并成大文件,或者用archive(就是把多个小文件打个包),或者Sequence File,再比如HBase中的compact,或者MR中的CombineFileInputFormat
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  HDFS