从零开始最短路径学习Hadoop之03----HDFS分布式文件系统

原创
2017/01/17 08:58
阅读数 8
1.当数据集的大小超过一台独立物理计算机的存储能力的时候,就有必要对数据进行分区partition并存储到若干台单独的计算机上。管理跨多台计算机存储的文件系统称为分布式文件系统。

2. Hadoop有一个称为HDFS(Hadoop Distributed FileSsytem)的分布式系统。

3. HDFS设计
    超大文件:几百MB,几百GB,几百TB,PB级别数据。
    流式数据访问:一次写入,多次读取。
    商用硬件:不可靠的文件,故障率高。

4. Hadoop的不利之处,不适应以下三种情况:
    低时间延迟的数据访问;
    大量的小文件;
    多用户写入,任意修改文件;

5. HDFS的概念:
    5.1  数据要分块,通常是64M。
            " hadoop fsck / -files -blocks"
    5.2  namenode和datanode
            namenode是管理者,一个。datanode是工作者,多个。
            命名空间镜像文件,编辑日志文件。
            SecondaryNameNode,第二名称节点。
    5.3 命令行接口:
           " hadoop fs -help"
    5.4 Hadoop文件系统
            HDFS是hadoop有一个抽象的文件系统概念。HDFS是其中一个实现。还有其他各种实现。
    5.5 接口:
            Java API可以调用所有Hadoop文件系统的交互操作。也能操作Thrift,C语言,FUSE, WebDAV,HTTP,FTP。

6 从Hadoop URL中读取数据
    6.1 最常用的是FileSystem API读取数据。
    6.2 FileSystemCat.java
package com.cere;

import java.net.URI;
import java.io.InputStream;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;

public class FileSystemCat{
    public static void main(String[] args) throws Exception{
        String uri = args[0];
        Configuration conf = new Configuration();
        FileSystem fs = FileSystem.get(URI.create(uri), conf);
        InputStream in = null;
        try{
            in = fs.open(new Path(uri));
            IOUtils.copyBytes(in, System.out, 4096, false);
        }finally{
            IOUtils.closeStream(in);
        }
    }
}

    6.3 编译: brian@brian-i3:~/all/work/learn/hadoop/hdp-train/class-3/p1$ javac -classpath /home/brian/usr/hadoop/hadoop-1.1.2/hadoop-core-1.1.2.jar -d ./classes/ src/*.java
    6.4 打包: brian@brian-i3:~/all/work/learn/hadoop/hdp-train/class-3/p1$ jar -cvf fsc.jar -C ./classes/ .
    6.5 执行: brian@brian-i3:~/all/work/learn/hadoop/hdp-train/class-3/p1$ ~/usr/hadoop/hadoop-1.1.2/bin/hadoop jar fsc.jar com.cere.FileSystemCat o3/part-r-00000

7. 文件定位 seek
    InputStream的可以对文件进行定位seek,可以定位到任何位置。在6的文件里加上几条语句,就可以返回文件头,再次进行读写。
    7.1 FileSystemCat.java
package com.cere;

import java.net.URI;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;

public class FileSystemCat{
    public static void main(String[] args) throws Exception{
        String uri = args[0];
        Configuration conf = new Configuration();
        FileSystem fs = FileSystem.get(URI.create(uri), conf);
        FSDataInputStream in = null;
        try{
            in = fs.open(new Path(uri));
            IOUtils.copyBytes(in, System.out, 4096, false);
            in.seek(0);
            IOUtils.copyBytes(in, System.out, 4096, false);
        }finally{
            IOUtils.closeStream(in);
        }
    }
}

    7.2 编译: brian@brian-i3:~/all/work/learn/hadoop/hdp-train/class-3/p2$ javac -classpath /home/brian/usr/hadoop/hadoop-1.1.2/hadoop-core-1.1.2.jar -d ./classes/ src/*.java 
    7.3 打包: brian@brian-i3:~/all/work/learn/hadoop/hdp-train/class-3/p2$ jar -cvf fsc.jar -C ./classes/ .
    7.4 运行: brian@brian-i3:~/all/work/learn/hadoop/hdp-train/class-3/p2$ ~/usr/hadoop/hadoop-1.1.2/bin/hadoop jar fsc.jar  com.cere.FileSystemCat o3/part-r-00000
    7.5 打印了两遍。如果是seek(10),就跳过10个字节打印。
    7.6 FSDataInputStream实现了PositionedReadable接口,从一个指定偏移量读取文件的一部分。
    7.7 seek函数是高开销,尽量少用。

8 将本地文件复制到hdfs系统
    8.1 FileCopyWithProgress.java
package com.cere;

import java.net.URI;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.util.Progressable;

public class FileCopyWithProgress{
    public static void main(String[] args) throws Exception{
        String localsrc = args[0];
        String dst = args[1];
        InputStream in = new BufferedInputStream(new FileInputStream(localsrc));

        Configuration conf = new Configuration();
        FileSystem fs = FileSystem.get(URI.create(dst), conf);
        OutputStream out = fs.create(new Path(dst), new Progressable(){
            public void progress(){
                System.out.print(".");
            }
        });
        IOUtils.copyBytes(in, out, 4096, true);
    }
}

    8.2 编译: brian@brian-i3:~/all/work/learn/hadoop/hdp-train/class-3/p3$ javac -classpath /home/brian/usr/hadoop/hadoop-1.1.2/hadoop-core-1.1.2.jar -d ./classes/ src/*.java
    8.3 打包: brian@brian-i3:~/all/work/learn/hadoop/hdp-train/class-3/p3$ jar -cvf fcwp.jar -C ./classes/ .
    8.4 运行: brian@brian-i3:~/all/work/learn/hadoop/hdp-train/class-3/p3$ ~/usr/hadoop/hadoop-1.1.2/bin/hadoop jar fcwp.jar com.cere.FileCopyWithProgress ~/usr/hadoop/hadoop-1.1.2/hadoop-examples-1.1.2.jar hadoop-examples.jar
    8.5 查看结果: brian@brian-i3:~/all/work/learn/hadoop/hdp-train/class-3/p3$ ~/usr/hadoop/hadoop-1.1.2/bin/hadoop fs -lsr
            能看到hadoop-examples.jar已经hdfs文件系统里了。
    8.6 FSDataOutputStream可以查询文件当前位置的方法。但不能seek,不能随机写。

9. 目录:不需要显示创建目录,调用create方法时候写入文件会自动创建父目录。

10. 文件元数据FileStatus
    它封装了文件系统的文件和目录的元数据,包括文件长度,块大小,备份,修改时间,所有者,权限等信息
    10.1 ShowFileStatus.java
package com.cere;

import java.net.URI;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.Path;

public class ShowFileStatus{
    public static void main(String[] args) throws Exception{
        Configuration conf = new Configuration();
        String uri = args[0];
        FileSystem fs = FileSystem.get(URI.create(uri),conf);
        Path file = new Path(uri);
        FileStatus stat = fs.getFileStatus(file);
        System.out.println(stat.getPath());
        System.out.println(stat.getLen());
        System.out.println(stat.getModificationTime());
        System.out.println(stat.getOwner());
        System.out.println(stat.getReplication());
        System.out.println(stat.getBlockSize());
        System.out.println(stat.getGroup());
        System.out.println(stat.getPermission().toString());
    }
}

    10.2 编译: brian@brian-i3:~/all/work/learn/hadoop/hdp-train/class-3/p4$ javac -classpath /home/brian/usr/hadoop/hadoop-1.1.2/hadoop-core-1.1.2.jar -d ./classes/ src/*.java
    10.3 打包: brian@brian-i3:~/all/work/learn/hadoop/hdp-train/class-3/p4$ jar -cvf sfs.jar -C ./classes/ .
    10.4 执行: brian@brian-i3:~/all/work/learn/hadoop/hdp-train/class-3/p4$ ~/usr/hadoop/hadoop-1.1.2/bin/hadoop jar sfs.jar com.cere.ShowFileStatus 1901.dat

11. 列出一个目录下所有文件
    11.1 ListStatus.java
package com.cere;

import java.net.URI;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.FileUtil;

public class ListStatus{
    public static void main(String[] args) throws Exception{
        Configuration conf = new Configuration();
        String uri = args[0];
        FileSystem fs = FileSystem.get(URI.create(uri),conf);

        Path[] paths = new Path[args.length];
        for(int i = 0; i < args.length; i++){
            paths[i] = new Path(args[i]);
        }

        FileStatus[] status = fs.listStatus(paths);
        Path[] listedPaths = FileUtil.stat2Paths(status);
        for(Path p : listedPaths){
            System.out.println(p);
        }
    }
}

    11.2 编译: brian@brian-i3:~/all/work/learn/hadoop/hdp-train/class-3/p5$ javac -classpath /home/brian/usr/hadoop/hadoop-1.1.2/hadoop-core-1.1.2.jar  -d ./classes/ src/*.java
    11.3 打包: brian@brian-i3:~/all/work/learn/hadoop/hdp-train/class-3/p5$ jar -cvf ls.jar -C ./classes/ .
    11.4 执行: brian@brian-i3:~/all/work/learn/hadoop/hdp-train/class-3/p5$ ~/usr/hadoop/hadoop-1.1.2/bin/hadoop jar ls.jar  com.cere.ListStatus hdfs://localhost:9000/user/brian
    11.5 可以有通配模式。可以用PathFilter过滤文件。

12. 删除文件,用函数delete。

13. 文件流的读取和写入剖析。这是hadoop内部处理的,现在可以不用管。

14.一致性模型,每次写满一个块,才能看到一个块。可以强制同步,用sync函数。

15. distcp可以并行复制。

16. hadoop archieve 工具可以进行文件存档。
展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部