Hadoop(三)——核心之一HDFS

来源:互联网 发布:买保险 知乎 编辑:程序博客网 时间:2024/05/16 07:54
上篇讲述了Hadoop分布式集群环境的搭建,其实重要是HDFS分布式文件系统的搭建,MapReduce主要是需要我们程序员来进行编写算法来进行逻辑运算的。这篇就重点来讲述一下HDFS

HadoopDistribute File System,也就是Hadoop分布式文件系统)。


    一、HDFS的主要设计理念:


    1、存储超大文件,这里的“超大文件”是指几百MBGB甚至TBPB级别的文件。

    2、最高效的访问模式是 一次写入、多次读取(流式数据访问),HDFS存储的数据集作为hadoop的分析对象。在数据集生成后,长时间在此数据集上进行各种分析。每次分析都将设计该数据集的大部分数据甚至全部数据,因此读取整个数据集的时间延迟比读取第一条记录的时间延迟更重要。

     3、运行在普通廉价的服务器上,HDFS设计理念之一就是让它能运行在普通的硬件之上,即便硬件出现故障,也可以通过容错策略来保证数据的高可用。

 

    二,HDFS的体系结构:



简述:

    数据块(block):大文件会被分割成多个block进行存储,block大小默认为64MB。每一个block会在多个datanode上存储多份副本,默认是3份。


    namenode:1,负责管理文件目录、文件和block的对应关系以及block和datanode的对应关系还有datanode的副本信息,2,协调客户端对文件的访问,3,记录命名空间内的改动或本身属性的改变;4,使用事务日志记录HDFS元数据的变化,使用映像文件存储文件系统的命名空间,包括文件映射文件属性。


    datanode:datanode就负责存储了,当然大部分容错机制都是在datanode上实现的,一次写入多次读取不修改。

 

三,HDFS读写操作图:

      1,读取数据流程:

客户端要访问HDFS中的一个文件

首先从namenode获得组成这个文件的数据块位置列表

根据列表知道存储数据块的datanode

访问datanode获取数据

Namenode并不参与数据实际传输


     2,写入数据流程:

        客户端请求namenode创建新文件

客户端将数据写入DFSOutputStream

建立pipeline依次将目标数据块写入各个datanode,建立多个副本


 四,HDFS高可靠性原由,很容易理解:

冗余副本策略

机架策略

心跳机制

安全模式

校验和

回收站

元数据保护

快照机制

 

 五,HDFS文件操作方法:


      1Linux命令行操作:

         列出HDFS下的文件: ./bin/hadoop fs -ls [文件夹目录名]

         上传文件到HDFS:    ./bin/hadoop fs -put [上传文件路劲+名字]  [指定要上传的hadoop路径]

         复制到本地文件:./bin/hadoop fs -get  [hadoop中文件路劲+名字]    [本地文件夹]

         删除HDFS下的文件:./bin/hadoop fs -rmr [hadoop文件路径+名字]

         查看HDFS的基本统计信息: ./bin/hadoop dfsadmin -report


      2,API编程:这个就需要我们看HadoopAPI文档来进行Java开发的调用,然后实现文件的各种操作,给一个hadoopapi链接:http://hadoop.apache.org/docs/r1.2.1/api/index.html 

这里看书上的两个小例子:

     

    将输入的文件中的内容输出到屏幕上:

[java] view plain copy print?
  1. <span style="font-family:KaiTi_GB2312;font-size:18px;"package HDFS;  
  2.       
  3.     import org.apache.hadoop.fs.FsUrlStreamHandlerFactory;  
  4.     import org.apache.hadoop.io.IOUtils;  
  5.     import java.io.InputStream;  
  6.     import java.net.URL;  
  7.       
  8.     /** 
  9.      * 将文件的内容打印到屏幕上 
  10.      * @author Administrator 
  11.      * 
  12.      */  
  13.     public class URLCat {  
  14.         static {  
  15.             URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());  
  16.         }  
  17.       
  18.         //main方法  
  19.         public static void main(String[] args) throws Exception {  
  20.             //输入流  
  21.             InputStream in = null;  
  22.             try {  
  23.                 in = new URL(args[0]).openStream();  
  24.                 //将输入文件的内容输出到system.out,也就是屏幕上  
  25.                 IOUtils.copyBytes(in, System.out, 4096false);  
  26.             } finally {  
  27.                 IOUtils.closeStream(in);  
  28.             }  
  29.         }  
  30.     }  
  31. </span>  


      对一个文件的创建,写入,读取内容

[java] view plain copy print?
  1. <span style="font-family:KaiTi_GB2312;font-size:18px;"package HDFS;  
  2.       
  3.     import java.io.IOException;  
  4.     import org.apache.hadoop.conf.Configuration;  
  5.     import org.apache.hadoop.fs.FSDataInputStream;  
  6.     import org.apache.hadoop.fs.FSDataOutputStream;  
  7.     import org.apache.hadoop.fs.FileSystem;  
  8.     import org.apache.hadoop.fs.Path;  
  9.       
  10.     /** 
  11.      * 利用HDFS的API,使用Java编写文件创建,写入,读取 
  12.      * @author Administrator 
  13.      * 
  14.      */  
  15.     public class HDFSJavaAPIDemo {  
  16.           
  17.         public static void main(String[] args) throws IOException {  
  18.             Configuration conf = new Configuration();  
  19.             FileSystem fs = FileSystem.get(conf);  
  20.               
  21.             System.out.println(fs.getUri());  
  22.               
  23.             Path file = new Path("demo.txt");  
  24.               
  25.             if (fs.exists(file)) {  
  26.                 System.out.println("File exists.");  
  27.             } else {  
  28.                 // Writing to file  
  29.                 FSDataOutputStream outStream = fs.create(file);  
  30.                 outStream.writeUTF("Welcome to HDFS Java API!!!");  
  31.                 outStream.close();  
  32.             }  
  33.             // Reading from file  
  34.             FSDataInputStream inStream = fs.open(file);  
  35.             String data = inStream.readUTF();  
  36.             System.out.println(data);  
  37.             inStream.close();  
  38.             fs.close();  
  39.         }  
  40.     }  
  41. </span>  


   六,HDFS的忌讳:

1、将HDFS用于对数据访问要求低延迟的场景:由于HDFS是为高数据吞吐量应用而设计的,必然以高延迟为代价。

2、存储大量小文件:HDFS中元数据(文件的基本信息)存储在namenode的内存中,而namenode为单点,小文件数量大到一定程度,namenode内存就吃不消了。

 

  小结:HDFS分布式文件系统,是Hadoop能够进行大数据高效处理的基础平台,有了这个平台才能有后边Map-Reduce的计算框架的运用。这里想多说的是,作为开发程序员,我们该多看看HadoopAPI文档,在用中不断熟悉,不断掌握,就想JDKAPI文档一样。

0 0