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
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
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
相关文章推荐
- hadoop的hdfs文件操作实现上传文件到hdfs
- java连接hdfs ha和调用mapreduce jar示例
- java实现将ftp和http的文件直接传送到hdfs
- 在Hadoop2.5.0下利用Java读写HDFS
- HDFS 文件操作
- Spark中将对象序列化存储到hdfs
- 读<王垠:一种新的操作系统设计>
- hadoop中RPC通信文件上传原理
- 测试Hadoop的hdfs的问题?
- 高可用,完全分布式Hadoop集群HDFS和MapReduce安装配置指南
- hadoop特性讲解
- HDFS 恢复某时刻删除的文件
- #Note# Analyzing Twitter Data with Apache Hadoo...
- tachyon与hdfs,以及spark整合
- CentOS6.5安装Hadoop2.7.1
- HDFS Federation(HDFS 联盟)介绍
- HDFS小文件处理解决方案总结+facebook(HayStack) + 淘宝(TFS)
- HDFS文件系统和OpenStack swift对象存储有何不同
- Hadoop分布式文件系统和OpenStack对象存储有何不同
- Hadoop