HDFS默认情况下,块的大小是64MB。与磁盘相比它的块是巨大的,数据转换的时间就比需找数据的开始块的时间大的多。因此这转换一个大文件的操作取决于磁盘的速度。

Namenodes 和Datanodes

Namenodes管理文件系统的命名空间。它维护文件系统的结构和属性信息对于所有的文件和目录在树形结构。这信息被持续的存储在本地的硬盘以两种文件的格式:命名空间的图像和编辑日志。

Datanodes是文件系统的工作空间。他们存储和获得块当他们被告知和他们报告回这namenodes带有的他们存储的块的列表。

命令接口:% hadoop fs -copyFromLocal input/docs/quangle.txt hdfs://localhost/user/tom/
quangle.txt

% hadoop fs -copyToLocal quangle.txt quangle.copy.txt
       % md5 input/docs/quangle.txt quangle.copy.txt
       MD5 (input/docs/quangle.txt) = a16f231da6b05e2ba7a339320e7dacd9

读取数据从一个Hadoop URL中:

InputStream in=null;

try{

in=new URL("hdfs://host/path").openStream();

}finally{IOUtils.closeStream(in);}

public class URLCat {
static {
URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());
}
public static void main(String[] args) throws Exception {
InputStream in = null;
try {
in = new URL(args[0]).openStream();
IOUtils.copyBytes(in, System.out, 4096, false);
} finally {
IOUtils.closeStream(in);
}
}
}

获取FileSystem
    public static FileSystem get(Configuration conf) throws IOException
    public static FileSystem get(URI uri, Configuration conf) throws IOException
    public static FileSystem get(URI uri, Configuration conf, String user) throws IOException

获取输入的流:

public FSDataInputStream open(Path f) throws IOException
   public abstract FSDataInputStream open(Path f, int bufferSize) throws IOException

其中可以获得文件指针的位置

public interface Seekable {
void seek(long pos) throws IOException;
long getPos() throws IOException;
}

写数据:

public FSDataOutputStream create(Path f) throws IOException获得写入的流

其中有回调接口

package org.apache.hadoop.util;
   public interface Progressable {
            public void progress();
   }

添加内容到文件的末尾

public FSDataOutputStream append(Path f) throws IOException

目录的操作:

public boolean mkdirs(Path f) throws IOException新建目录

查询文件系统:

File的属性数据:FileStatus中保存

这FileStatus类封装文件的属性数据为文件和目录,包括文件的长度,块的大小,重复度,修改时间,拥有者和权限信息。

这getFileStatus()在文件系统提供一种获得一个FileStatus对象对于一个单独的文件或目录。

public class ShowFileStatusTest {
          private MiniDFSCluster cluster; // use an in-process HDFS cluster for testing
          private FileSystem fs;
         @Before
          public void setUp() throws IOException {
                Configuration conf = new Configuration();
                if (System.getProperty("test.build.data") == null) {
                System.setProperty("test.build.data", "/tmp");

}
          cluster = new MiniDFSCluster(conf, 1, true, null);
          fs = cluster.getFileSystem();
          OutputStream out = fs.create(new Path("/dir/file"));
          out.write("content".getBytes("UTF-8"));
          out.close();
  }

}
cluster = new MiniDFSCluster(conf, 1, true, null);
fs = cluster.getFileSystem();
OutputStream out = fs.create(new Path("/dir/file"));
out.write("content".getBytes("UTF-8"));
out.close();
}
@After
public void tearDown() throws IOException {
if (fs != null) { fs.close(); }
if (cluster != null) { cluster.shutdown(); }
}
@Test(expected = FileNotFoundException.class)
public void throwsFileNotFoundForNonExistentFile() throws IOException {
fs.getFileStatus(new Path("no-such-file"));
}

@Test
public void fileStatusForFile() throws IOException {
Path file = new Path("/dir/file");
FileStatus stat = fs.getFileStatus(file);
assertThat(stat.getPath().toUri().getPath(), is("/dir/file"));
assertThat(stat.isDir(), is(false));
assertThat(stat.getLen(), is(7L));
assertThat(stat.getModificationTime(),
is(lessThanOrEqualTo(System.currentTimeMillis())));
assertThat(stat.getReplication(), is((short) 1));
assertThat(stat.getBlockSize(), is(64 * 1024 * 1024L));
assertThat(stat.getOwner(), is("tom"));
assertThat(stat.getGroup(), is("supergroup"));
assertThat(stat.getPermission().toString(), is("rw-r--r--"));
}
@Test
public void fileStatusForDirectory() throws IOException {
Path dir = new Path("/dir");
FileStatus stat = fs.getFileStatus(dir);
assertThat(stat.getPath().toUri().getPath(), is("/dir"));
assertThat(stat.isDir(), is(true));
assertThat(stat.getLen(), is(0L));
assertThat(stat.getModificationTime(),
is(lessThanOrEqualTo(System.currentTimeMillis())));
assertThat(stat.getReplication(), is((short) 0));
assertThat(stat.getBlockSize(), is(0L));
assertThat(stat.getOwner(), is("tom"));
assertThat(stat.getGroup(), is("supergroup"));
assertThat(stat.getPermission().toString(), is("rwxr-xr-x"));
}
}

列出文件:

发现一个单独文件或目录的信息是有用的,但是你也需要能够列出一个目录中内容。这就是FileSystem的listStatus()方法:

public FileStatus[] listStatus(Path f) throws IOException

public FileStatus[] listStatus(Path f,PathFilter filter) throws IOException

public FileStatus[] listStatus(Path[] files) throws IOException

public FileStatus[] listStatus(Path[] files,PathFilter filter) throw IOException

其中,PathFilter可以限制匹配的文件和目录。

文件模式:

它是共同需要的在一个单独操作处理一套文件。

public FileStatus[] globStatus(Path pathPattern) throws IOEXCEPTion

public FileStatus[] globStatus(Path pathPattern,PathFilter filter) throws IOException

PathFilter:

Glob patterns并不是总是足够强大的来描述你想要获得的一套文件。例如,它不能够排除一个特定文件使用一个glob格式。

package org.apache.hadoop.fs;
public interface PathFilter {
boolean accept(Path path);
}

删除数据:

使用delete()方法在FileSystem来永久的移除文件或者目录:

public boolean delete(Path f,boolean recursive)

如果recursive是true则一个非空的目录被删除和它的内容也被删除。

数据流动:

HDFS打开 Distributed FileSystem -》get block locations  from NameNode。

HDFS client读取FSData InputStream,读取数据从DataNode。
数据文件写的分析:

HDFS client 创建文件在Distributed FileSystem向NameNode请求创建新文件,完成后也要向NameNode发送消息。

HDFS client写数据通过FSData OutputStream 向datanodes写入数据。完成后关闭。

Hadoop的重复块的放置:

Hadoop的默认策略是放置第一个从发的在相同的节点和client。第二个重复的块被放在随机选择的一个节点和第一个不同的曺内。第三个放置在和第二个相同的曺但是不同的节点上。

保证一致性:

Path p = new Path("p");
FSDataOutputStream out = fs.create(p);
out.write("content".getBytes("UTF-8"));
out.flush();
out.sync();
assertThat(fs.getFileStatus(p).getLen(), is(((long) "content".length())));

并行拷贝:

% hadoop distcp hdfs://namenode1/foo hdfs://namenode2/bar

使用的存档:Hado% hadoop fs -lsr /my/filesop

Hadoop的分布式文件系统相关推荐

  1. Hadoop的分布式文件系统—— Hadoop权威指南3

    本章除了讲解HDFS,还从整个Hadoop文件系统的角度介绍了文件系统的命令行.FileSystem接口(Hadoop文件系统的客户端接口) 1. HDFS概述 1. HDFS的特性.应用场景(适合/ ...

  2. Hadoop HDFS分布式文件系统 常用命令汇总

    引言:我们维护hadoop系统的时候,必不可少需要对HDFS分布式文件系统做操作,例如拷贝一个文件/目录,查看HDFS文件系统目录下的内容,删除HDFS文件系统中的内容(文件/目录),还有HDFS管理 ...

  3. Hadoop (HDFS)分布式文件系统基本操作

    Hadoop HDFS提供了一组命令集来操作文件,它既可以操作Hadoop分布式文件系统,也可以操作本地文件系统.但是要加上theme(Hadoop文件系统用hdfs://,本地文件系统用file:/ ...

  4. hadoop与mysql的区别_数据库与hadoop与分布式文件系统的区别和联系

    转载一篇关系数据库与Hadoop的关系的文章 1. 用向外扩展代替向上扩展 扩展商用关系型数据库的代价是非常昂贵的.它们的设计更容易向上扩展.要运行一个更大 的数据库,就需要买一个更大的机器.事实上, ...

  5. Hadoop HDFS分布式文件系统原理及应用介绍

    HDFS有着高容错性特点,且设计用来部署在低廉的硬件上,提供高吞吐量来访问应用程序的数据,适合那些有着超大数据集的应用程序.HDFS放宽了POSIX的要求,可以实现流的形式访问文件系统中的数据. Ha ...

  6. Hadoop、分布式文件系统HDFS、YARN、MAPREDUCE

    日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) 1.1 什么是Hadoop Hadoop名字的由来 作者:Do ...

  7. Hadoop 分布式文件系统 - HDFS

    当数据集超过一个单独的物理计算机的存储能力时,便有必要将它分不到多个独立的计算机上.管理着跨计算机网络存储的文件系统称为分布式文件系统.Hadoop 的分布式文件系统称为 HDFS,它 是为 以流式数 ...

  8. 第3章:Hadoop分布式文件系统(1)

    当数据量增大到超出了单个物理计算机存储容量时,有必要把它分开存储在多个不同的计算机中.那些管理存储在多个网络互连的计算机中的文件系统被称为"分布式文件系统".由于这些计算机是基于网 ...

  9. Hadoop分布式文件系统(HDFS)之文件系统(详细版)

    交朋友增体面,不如交朋友益身心 教子弟求显荣,不如教子弟立品行 推荐书目电子版下载 Hadoop必读书目(精选) 本文参考文献包含于上述书籍 HDFS快速入门 Hadoop分布式文件系统(HDFS)快 ...

最新文章

  1. XXE漏洞检测及代码执行过程
  2. Memcache工作原理总结
  3. oracle易忘函数用法(5)
  4. rg1 蓝光危害rg0_LED(护眼)台灯|蓝光那些事
  5. 关于Unity中NGUI的背包实现之Scrollview(基于Camera)
  6. micropython移植教程_【教程】智能编程T-Watch手表初试micropython之电子秤教程
  7. 数学方面的能力该怎么培养
  8. Unity飞机大战源码下载
  9. Netch游戏加速器自建(糖豆人Free就是研究的动力)
  10. 更改putty默认配色方案
  11. D1: elevater design
  12. sqlserver如何把两张表的数据合并为一张表
  13. Git 进阶 —— 时光穿梭机
  14. HDU1238 Substrings
  15. 面向2022届毕业生-自动驾驶/SLAM/DL/C++ 岗位收集整理
  16. iOS 12 新功能亮相,必须升!
  17. 正点原子LCD转接板与最小系统板的连接
  18. 微信小程序-获取本小程序的appID
  19. 对电脑连接工业相机的一些想法,以及CameraFinder.Enumerate()找不到相机的原因
  20. 【转】红帽 Red Hat Linux相关产品iso镜像下载【迅雷快传】【百度云】【更新7.1】...

热门文章

  1. [Python图像处理] 七.图像阈值化处理及算法对比
  2. Swift之SwiftUI自定义star rating评分组件
  3. round四舍五入详解--python2与python3版本间区别
  4. 【Libevent】Libevent学习笔记(一):简介和安装
  5. 【Linux系统编程】进程间通信之共享内存
  6. mysql工_mysql
  7. 两个sql交集_数据库(sql)关键字
  8. csv与json互转_CSV文件转JSON
  9. java 最新sql注入原因以及预防方案(易理解)
  10. 什么是回调地狱以及promise的链式调用和aysnc/await