zoukankan      html  css  js  c++  java
  • hadoop之hdfs学习

    简介

    HDFS(Hadoop Distributed File System )Hadoop分布式文件系统。是根据google发表的论文翻版的。论文为GFS(Google File System)Google 文件系统(中文英文)。

    HDFS有很多特点:

        ① 保存多个副本,且提供容错机制,副本丢失或宕机自动恢复。默认存3份。

        ② 运行在廉价的机器上。

        ③ 适合大数据的处理。多大?多小?HDFS默认会将文件分割成block,64M为1个block。然后将block按键值对存储在HDFS上,并将键值对的映射存到内存中。如果小文件太多,那内存的负担会很重。

    元素

     1、Namenode元素:在core-site.xml中进行参数的配置

      Namenode是整个文件系统的管理节点。它维护着整个文件系统的文件目录树,文件/目录的元信息和每个文件对应的数据块列表。接收用户的操作请求。

      文件包括:

      fsimage:元数据镜像文件。存储某一时段NameNode内存元数据信息。

      edits:操作日志文件。

      fstime:保存最近一次checkpoint的时间

      以上这些文件是保存在linux的文件系统中。  

     2、SecondaryNameNode元素:在masters中进行参数的配置

      SecondaryNameNode从NameNode上下载元数据信息(fsimage,edits),然后把二者合并,生成新的fsimage,在本地保存,并将其推送到NameNode,同时重置NameNode的edits.

     3、Datanode元素:在hdfs-site.xml中进行参数的配置

      DataNode提供真实文件数据的存储服务,它有一个文件块block的概念。

      文件块(block):最基本的存储单位。对于文件内容而言,一个文件的长度大小是size,那么从文件的0偏移开始,按照固定的大小,顺序对文件进行划分并编号,

      划分好的每一个块称一个Block。HDFS默认Block大小是64MB,以一个256MB文件,共有256/64=4个Block.

      不同于普通文件系统的是,HDFS中,如果一个文件小于一个数据块的大小,并不占用整个数据块存储空间

      Replication。多复本。默认是三个

    设计模型

      HDFS的设计如下图所示:

      

      Write请求描述:client请求namenode,在namenode保存相关的元数据信息,然后client将数据写到对于的datanode,同时datanode每个block备份到其他的主机上,

      Read请求描述:Client请求namenode,获取数据的元数据信息,然后client到对应的datanode读取block,如果该block数据损坏或者对应的主机出问题,client就会去其他datanode读取block。

      元元数据信息:文件的大小,创建时间,位置信息以及分块信息等等

      总之:不管是Write还是Read,Client都会先请求namenode,获取元数据信息以后再对Datanode进行操作

    JAVA操作:

     

    package cn.edu.hadoop.hdfs;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.URI;
    import java.net.URISyntaxException;
    import java.net.URL;
    
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.FSDataInputStream;
    import org.apache.hadoop.fs.FSDataOutputStream;
    import org.apache.hadoop.fs.FileSystem;
    import org.apache.hadoop.fs.FsUrlStreamHandlerFactory;
    import org.apache.hadoop.fs.Path;
    import org.apache.hadoop.io.IOUtils;
    
    public class HDFSTest {
        public static String url = "hdfs://master:9000";
    
        public static void main(String[] args) throws IOException, URISyntaxException {
            //test1();
            test2();
        }
        
        /**
         * java api操作
         * @throws IOException
         */
        public static void test1() throws IOException{
            URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());
            String filePath = url+"/user/file";
            URL url =new URL(filePath);
            InputStream in = url.openStream();
            /**
             * in  输入流
             * out 输出流
             * bufferSize 缓冲区
             * close  是否关闭流
             */
            IOUtils.copyBytes(in, System.out, 1024, true);
        }
        
        /**
         * hdfs api操作
         * @throws URISyntaxException 
         * @throws IOException 
         */
        public static void test2() throws IOException, URISyntaxException{
            FileSystem fileSystem = FileSystem.get(new URI(url), new Configuration());
            //创建文件
            fileSystem.mkdirs(new Path("/dir"));
            //上传文件
            FSDataOutputStream out = fileSystem.create(new Path("/dir/hello"));
            FileInputStream in = new FileInputStream(new File("C:\Users\HeYong\Desktop\linux.txt"));
            IOUtils.copyBytes(in, out, 1024, true);    
            
            //下载文件
            FSDataInputStream download = fileSystem.open(new Path("/dir/hello"));
            IOUtils.copyBytes(download, System.out, 1024, true);
            
            /*
             * 递归删除文件夹
             */
            fileSystem.delete(new Path("/dir"), true);
        }
    }
  • 相关阅读:
    动态规划(0-1背包)---划分数组为和相等的两部分
    动态规划(0-1背包)
    动态规划(最长递增子序列)---最长公共子序列
    动态规划(最长递增子序列)---最长摆动子序列
    动态规划(最长递增子序列)---最长递增子序列
    动态规划(最长递增子序列)
    动态规划(分割整数)---分割整数构成字母字符串
    浅谈进程同步和互斥的概念
    如何由Height Map生成Normal Map
    3D中的切线空间简介
  • 原文地址:https://www.cnblogs.com/googlemeoften/p/5795615.html
Copyright © 2011-2022 走看看