hadoop自学轨迹-简单认识HDFS

来源:互联网 发布:部落冲突8本满科技数据 编辑:程序博客网 时间:2024/05/18 23:55

1.  分布式文件系统简介

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

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

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

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

2.  HDFS

分布式文件管理系统很多,HDFS只是其中一种。适用于一次写入多次读取的流式数据访问模式,不支持并发写情况,适合存储超大文件,小文件不合适

3.  HDFS的shell操作

既然HDFS 是存取数据的分布式文件系统,那么对HDFS 的操作,就是文件系统的基本

操作,比如文件的创建、修改、删除、修改权限等,文件夹的创建、删除、重命名等。

l -help [cmd] //显示命令的帮助信息

l -ls(r) <path>   //显示当前目录下所有文件

l -du(s) <path>   //显示目录中所有文件大小

l -count[-q] <path>   //显示目录中文件数量

l -mv <src> <dst> //移动多个文件到目标目录

l -cp <src> <dst> //复制多个文件到目标目录

l -rm(r)      //删除文件(夹)

l -put <localsrc> <dst>   //本地文件复制到hdfs

l -copyFromLocal  //同put

l -moveFromLocal  //从本地文件移动到hdfs

l -get [-ignoreCrc] <src> <localdst>  //复制文件到本地,可以忽略crc校验

l -getmerge <src> <localdst>      //将源目录中的所有文件排序合并到一个文件中

l -cat <src>  //在终端显示文件内容

l -text <src> //在终端显示文件内容

l -copyToLocal [-ignoreCrc] <src> <localdst>  //复制到本地

l -moveToLocal <src> <localdst>

l -mkdir <path>   //创建文件夹

l -touchz <path>  //创建一个空文件

4. HDFS体系结构与基本概念

一句话描述HDFS:把客户端的大文件存放在很多节点的数据块中

 

4.1 NameNode

NameNode的作用是管理文件目录结构,是管理数据节点的。存储着文件/目录的元信息和每个文件对应的数据块列表。接收用户的操作请求。名字节点维护两套数据,一套是文件目录与数据块之间的关系,另一套是数据块与节点之间的关系。前一套数据是静态持久化到磁盘上的,通过fsimage和edits文件来维护;后一套数据是动态的,每当集群启动的时候,会自动build这些信息。

    fsimage和edits文件存放在配置文件hdfs-site.xml中dfs.name.dir属性和dfs.name.edits.dir指定的位置。

 

 

4.2 DataNode

DataNode是HDFS真正存储数据的。

文件块(block):最基本的存储单位对于文件内容而言,一个文件的长度大小是size,那么从文件的0偏移开始,按照固定的大小,顺序对文件进行划分并编号,划分好的每一个块称一个Block。HDFS默认Block大小是64MB以一个256MB文件,共有256/64=4个Block.Block本质上是一个逻辑概念,意味着Block里不会真正的存储数据,只是划分文件的。划分后的文件具体存放在hdfs-site.xml配置文件属性dfs.data.dir指定的位置。

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

l Replication。多复本。默认是三个。

 

4.3 SecondaryNameNode

SecondaryNameNode只有一个职责,就是合并NameNode中的edits和fsimage。

合并原理:

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

5.HDFSjava访问接口

万能的FileSystem,使用FileSystem API读写数据:创建文件夹、写文件、读文件、查看目录列表及文件详细信息、删除文件

package jeremy.hadoop.hdfs;import java.io.ByteArrayInputStream;import java.io.IOException;import java.net.URI;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;public class FileSystemTest {private static final String uri = "hdfs://192.168.153.100:9000";private static final String path = "/test";private static final String file = "/test/text";public static void main(String[] args) throws IOException {Configuration conf = new Configuration();FileSystem fs = FileSystem.get(URI.create(uri), conf);Path filepath = new Path(path);// 1.在根目录下创建文件夹if (!fs.exists(filepath)) {fs.mkdirs(filepath);}// 2.写文件FSDataOutputStream out = fs.create(new Path(file));IOUtils.copyBytes(new ByteArrayInputStream("Hello World !".getBytes()), out, conf, true);// 3.读文件FSDataInputStream in = fs.open(new Path(file));IOUtils.copyBytes(in, System.out, conf, true);// 4.查看目录列表和文件详细信息FileStatus[] fsstatus = fs.listStatus(new Path("/"));for (FileStatus status : fsstatus) {if (status.isDir()) {System.out.println("目录:" + status.getPath());} else {System.out.println("文件:" + status.getPath());}}// 5.删除文件和目录fs.delete(filepath, true);// 递归删除文件和目录}}


0 0
原创粉丝点击