纵有疾风起
人生不言弃

HDFS学习笔记

一、分布式文件系统与HDFS

数据量越来越多,在一个操作系统管辖的范围存不下了,那么就分配到更多的操作系统管理的磁盘中,但是不方便管理和维护,因此迫切需要一种系统来管理多台机器上的文件,这就是分布式文件管理系统 。

这是一种允许文件通过网络在多台主机上分享的文件系统,可让多机器上的多用户分享文件和存储空间。

通透性。让实际上是通过网络来访问文件的动作,由程序与用户看来,就像是访问本地的磁盘一般。

容错。即使系统中有某些节点脱机,整体来说系统仍然可以持续运作而不会有数据损失。

分布式文件管理系统很多,hdfs只是其中一种。适用于一次写入多次查询的情况,不支持并发写情况,小文件不合适。

二、HDFS体系结构与基本概念

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

文件包括:
fsimage:元数据镜像文件。存储某一时段NameNode内存元数据信息。
edits:操作日志文件。
fstime:保存最近一次checkpoint的时间
以上这些文件是保存在linux的文件系统中

2、Datanode
提供真实文件数据的存储服务。

文件块(block):最基本的存储单位。
对于文件内容而言,一个文件的长度大小是size,那么从文件的0偏移开始,按照固定的大小,顺序对文件进行划分并编号,划分好的每一个块称一个Block。
HDFS默认Block大小是64MB,以一个256MB文件,共有256/64=4个Block.
不同于普通文件系统的是:在HDFS中,如果一个文件小于一个数据块的大小,并不占用整个数据块存储空间
Replication。多复本。默认是三个。

3、SecondaryNameNode
HA的一个解决方案。但不支持热备。配置即可。

执行过程:从NameNode上下载元数据信息(fsimage,edits),然后把二者合并,生成新的fsimage,在本地保存,并将其推送到NameNode,同时重置NameNode的edits.
默认在安装在NameNode节点上,但这样不安全

三、HDFS的shell操作
调用文件系统(FS)Shell命令应使用 bin/hadoop fs 的形式。

所有的FS shell命令使用URI路径作为参数。

URI格式是scheme://authority/path。HDFS的scheme是hdfs,对本地文件系统,scheme是file。其中scheme和authority参数都是可选的,如果未加指定,就会使用配置中指定的默认scheme。
例如:/parent/child可以表示成hdfs://namenode:namenodePort/parent/child,或者更简单的/parent/child(假设配置文件是namenode:namenodePort)
大多数FS Shell命令的行为和对应的Unix Shell命令类似。

1、HDFS fs命令

-help [cmd] //显示命令的帮助信息 -ls(r) <path> //显示当前目录下所有文件 -du(s) <path> //显示目录中所有文件大小 -count[-q] <path> //显示目录中文件数量 -mv <src> <dst> //移动多个文件到目标目录 -cp <src> <dst> //复制多个文件到目标目录 -rm(r) //删除文件(夹) -put <localsrc> <dst> //本地文件复制到hdfs -copyFromLocal //同put -moveFromLocal //从本地文件移动到hdfs -get [-ignoreCrc] <src> <localdst> //复制文件到本地,可以忽略crc校验 -getmerge <src> <localdst> //将源目录中的所有文件排序合并到一个文件中 -cat <src> //在终端显示文件内容 -text <src> //在终端显示文件内容 -copyToLocal [-ignoreCrc] <src> <localdst> //复制到本地 -moveToLocal <src> <localdst> -mkdir <path> //创建文件夹 -touchz <path> //创建一个空文件

2、HDFS的Shell命令操作

hadoop fs -ls /  查看HDFS根目录

hadoop fs -mkdir /test 在根目录创建一个目录test

hadoop fs -put  ./test.txt  /test 
或者
hadoop fs -copyFromLocal  ./test.txt  /test

hadoop fs -get  /test/test.txt  .
或者
hadoop fs -getToLocal  /test/test.txt   .

hadoop fs -cp /test/test.txt /test1

hadoop fs -rm /test1/test.txt

hadoop fs -mv /test/test.txt /test1

hadoop fs -rmr /test1   

四、HDFS的java访问接口——FileSystem

写文件 create
读取文件 open
删除文件delete
创建目录 mkdirs
删除文件或目录 delete
列出目录的内容 listStatus
显示文件系统的目录和文件的元数据信息 getFileStatus

package hdfs;

import java.io.FileInputStream;
import java.io.IOException;
import java.net.URI;

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

/** * FileSystem * @author liguodong * */
public class HDFSApplication {

    static final String PATH = "hdfs://liguodong:9000/";
    //static final String DIR = "hdfs://liguodong:9000/d1";
    static final String DIR = "/d1";
    static final String FILE = "/d1/hello";
    //FileSystem
    public static void main(String[] args) throws Exception{

        final FileSystem fileSystem = getFileSystem();

        //创建文件夹 hadoop fs -mkdir /f1
        //mkdir(fileSystem); 
        //删除文件夹
        //delete(fileSystem);
        //上传文件夹 hadoop fs -put src des
        //putData(fileSystem);

        //hadoop fs -lsr /
        //hadoop fs -text /d1/hello

        //下载文件夹hadoop fs -get src des
        //getData(fileSystem);

        //浏览文件夹
        browseFile(fileSystem);

    }

    private static void browseFile(FileSystem fileSystem) throws IOException
    {
        //final FileStatus[] listStatus = fileSystem.listStatus(new Path("/"));
        final FileStatus[] listStatus = fileSystem.listStatus(new Path(DIR));

        for (FileStatus fileStatus : listStatus) {
            String isDir = fileStatus.isDir()?"文件夹":"文件";
            final String permission = fileStatus.getPermission().toString();//权限
            final short replication = fileStatus.getReplication();//副本
            final long len = fileStatus.getLen();
            final String path = fileStatus.getPath().toString();//路径
            System.out.println(isDir+"\t"+permission+"\t"+replication+"\t"+len+"\t"+path);

        }       
    }

    private static void getData(FileSystem fileSystem) throws IOException
    {
        final FSDataInputStream in = fileSystem.open(new Path(FILE));
        IOUtils.copyBytes(in, System.out, 1024, true);      
    }

    private static void putData(FileSystem fileSystem) throws IOException
    {
        final FSDataOutputStream out = fileSystem.create(new Path(FILE));       
        final FileInputStream in = new FileInputStream("G:/love.txt");
        IOUtils.copyBytes(in, out, 1024, true);

    }

    private static void delete(FileSystem fileSystem) throws IOException
    {
        fileSystem.delete(new Path(DIR), true);
    }

    private static void mkdir(FileSystem fileSystem) throws IOException
    {
        fileSystem.mkdirs(new Path(DIR));
    }


    private static FileSystem getFileSystem() throws IOException, URISyntaxException {
        return  FileSystem.get(new URI(PATH), new Configuration());
    }
}

原文链接:https://blog.csdn.net/scgaliguodong123_/article/details/44589425

本站声明:网站内容来源于网络,如有侵权,请联系我们,我们将及时处理。

未经允许不得转载:起风网 » HDFS学习笔记
分享到: 生成海报

评论 抢沙发

评论前必须登录!

立即登录