hadoop-hdfs(三)

HDFS概念

1 数据块*

HDFS的一个数据块默认是64M,与元数据分开管理。

优点:

数据块的大小设计的较大,所以寻址占传输的时间比例较小,只需要计算传输速度即可。

便于简化管理,利于计算剩余空间、冗余备份(默认三个)

与元数据分开管理,保持他本身无属性的特性。

2 nameNode,DataNode*

nameNode:

1 命名空间

2 维护文件系统树(命名空间镜像文件)与目录(编辑日志文件)(本地磁盘)

3 保存每个块的元数据信息

4 维护多个dataNode

备份策略:写入远程磁盘、两个NameNode同时运行

DataNode

1 文件系统的工作节点

2 定期向NameNode发送块列表

3 收到NameNode和Client的调度

3 外部接口

Thrift:Hadoop提供给外部非JAVA语言调用的接口

HTTP:网页监控

FTP:传输文件

4 JAVA接口

1 URL API读取

@Test
    public void input1() throws MalformedURLException, IOException {
        URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());
        InputStream in = new URL("hdfs://192.168.1.100:9000/user/sunfan/input/file1.txt").openStream();
        byte[] buff = new byte[1024];
        int len;
        while (-1 != (len = in.read(buff))) {
            for (int i = 0; i < len; i++) {
                System.out.print((char) buff[i]);
            }
        }
        in.close();
    }

2 FileSystem API 读取FSDatainputStream流的使用(seek方法可以重新定位读取,和inputStream的skip不一样) *

    @Test
    public void input2() throws MalformedURLException, IOException {
        String uri = "hdfs://192.168.1.100:9000/user/sunfan/input/file1.txt";
        FileSystem fs = FileSystem.get(URI.create(uri), new Configuration());
        FSDataInputStream in = null;
        in = fs.open(new Path(uri));
        byte[] buff = new byte[1024];
        int len;
        while (-1 != (len = in.read(buff))) {
            for (int i = 0; i < len; i++) {
                System.out.print((char) buff[i]);
            }
        }
        in.seek(3);
        while (-1 != (len = in.read(buff))) {
            for (int i = 0; i < len; i++) {
                System.out.print((char) buff[i]);
            }
        }
        in.close();
    }

写入数据 FSDataOutPutStream

    @Test
    public void out3() throws IOException {
        String uri2 = "hdfs://192.168.1.100:9000/user/sunfan/input/file3.txt";
        FileSystem fs = FileSystem.get(URI.create(uri2), new Configuration());
        FSDataOutputStream out = fs.create(new Path(uri2));
        System.out.println(fs.exists(new Path(uri2)));
        out.write(97);
    }

本地文件的复制:注意这里重写Progressable来写进度条,用IOUtils.copy方法来复制

    @Test
    public void out3() throws IOException {
        long start = System.currentTimeMillis();
        FileInputStream in = new FileInputStream("C:\\Users\\sunfan\\Desktop\\copy.pdf");
        String uri2 = "hdfs://192.168.1.100:9000/user/sunfan/input/file3.txt";
        FileSystem fs = FileSystem.get(URI.create(uri2), new Configuration());
        FSDataOutputStream out = fs.create(new Path(uri2), new Progressable() {
            public void progress() {
                System.out.print(".");
            }
        });
        IOUtils.copyBytes(in, out, 4096, true);
        System.out.println(System.currentTimeMillis()-start);
    }

读取文件的详细信息:通过fs.getFileStatus得到FileStatus

    @Test
    public void showFilesystem() throws IOException {
        String dir = "hdfs://192.168.1.100:9000/user/sunfan/input";
        FileSystem fs = FileSystem.get(URI.create("hdfs://192.168.1.100:9000"), new Configuration());
        FileStatus status = fs.getFileStatus(new Path(dir));
        System.out.println(status.getPermission());
    }

读取文件列表:通过fs.listStatus获取FileStatus数组

    @Test
    public void showFilesystem2() throws IOException {
        String dir = "hdfs://192.168.1.100:9000/user/sunfan/input";
        FileSystem fs = FileSystem.get(URI.create(dir), new Configuration());
        FileStatus[] status = fs.listStatus(new Path("hdfs://192.168.1.100:9000/user/sunfan/input"));
        for (FileStatus fileStatus : status) {
            System.out.println(fileStatus.getPath());
        }
    }
    

用正则读取文件:通过fs.globStatus读取

    @Test
    public void showFilesystem2() throws IOException {
        String dir = "hdfs://192.168.1.100:9000/user/sunfan/input";
        FileSystem fs = FileSystem.get(URI.create(dir), new Configuration());
        FileStatus[] status = fs.globStatus(new Path("hdfs://192.168.1.100:9000/user/sunfan/input/*"));
        for (FileStatus fileStatus : status) {
            System.out.println(fileStatus.getPath());
        }
    }
时间: 2024-10-10 11:27:09

hadoop-hdfs(三)的相关文章

【Hadoop】三、HDFS命令行接口

??通过前面对HDFS基本概念.高可用性.数据读写流程的介绍,我们对HDFS已经有了大致的了解.这里我们还需要明确一点:Hadoop作为一个完整的分布式系统,它有一个抽象的文件系统的概念,而我们介绍的HDFS只是其中的一个实现,一个最常用的实现,实际上还有很多其他的分布式文件系统. ??Hadoop对文件系统提供了很多接口,一般使用URI(统一资源定位符)来表示选取的文件系统具体是哪一个,比如file://表示本地文件系统,而hdfs://表示HDFS,还有其他一些具体的实现,但是不常用到. ?

Hadoop HDFS (3) JAVA访问HDFS

现在我们来深入了解一下Hadoop的FileSystem类.这个类是用来跟Hadoop的文件系统进行交互的.虽然我们这里主要是针对HDFS,但是我们还是应该让我们的代码只使用抽象类FileSystem,这样我们的代码就可以跟任何一个Hadoop的文件系统交互了.在写测试代码时,我们可以用本地文件系统测试,部署时使用HDFS,只需配置一下,不需要修改代码了. 在Hadoop 1.x以后的版本中引入了一个新的文件系统接口叫FileContext,一个FileContext实例可以处理多种文件系统,而

Hadoop HDFS编程 API入门系列之简单综合版本1(四)

不多说,直接上代码. 代码 package zhouls.bigdata.myWholeHadoop.HDFS.hdfs4; import java.io.IOException; import java.net.URISyntaxException;import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.fs.BlockLocation;import org.apache.hadoop.fs.FileStatus

Hadoop学习三十二:Win7下无法提交MapReduce Job到集群环境

一. 对hadoop eclipse plugin认识不足 http://zy19982004.iteye.com/blog/2024467曾经说到我最hadoop eclipse plugin作用的认识.但事实上我犯了一个错误,Win7 Eclipse里的MyWordCount程序一直在本地运行,没有提交到集群环境上运行(查看192.168.1.200:50030)没有这个Job.运行方式分为两种,右键Run As Java Application Run on Hadoop 如果说Run A

大数据10小时入门Hadoop+HDFS+YARN+MapReduce+Spark视频教程

38套大数据,云计算,架构,数据分析师,Hadoop,Spark,Storm,Kafka,人工智能,机器学习,深度学习,项目实战视频教程 视频课程包含: 38套大数据和人工智能精品高级课包含:大数据,云计算,架构,数据挖掘实战,实时推荐系统实战,电视收视率项目实战,实时流统计项目实战,离线电商分析项目实战,Spark大型项目实战用户分析,智能客户系统项目实战,Linux基础,Hadoop,Spark,Storm,Docker,Mapreduce,Kafka,Flume,OpenStack,Hiv

Hadoop HDFS 基础使用

目录 1.HDFS 前言 ................................................................................................................................... 1 2.HDFS 相关概念和特性 ........................................................................................

[Hadoop]HDFS机架感知策略

HDFS NameNode对文件块复制相关所有事物负责,它周期性接受来自于DataNode的HeartBeat和BlockReport信息,HDFS文件块副本的放置对于系统整体的可靠性和性能有关键性影响. 一个简单但非优化的副本放置策略是,把副本分别放在不同机架,甚至不同IDC.这样可以防止整个机架.甚至整个IDC崩溃带来的错误,但是这样文件写必须在多个机架之间.甚至IDC之间传输,增加了副本写的代价. 在缺省配置下副本数是3个,通常的策略是:第一个副本放在和Client相同机架的Node里(如

Hadoop hdfs&mapreduce核心概念

1.HDFS(分布式文件系统体系) 1.1.NameNode:(名称节点) Hdfs的守护程序 记录文件是如何分割成数据块的,以及这些数据块被存储到了哪些节点上 对内存和I/O进行集中管理 是个单点,发生故障将使集群崩溃 1.2.SecondaryNamenode(辅助名称节点):发生故障进行人工的设置才能实现集群崩溃的问题 监控HDFS状态的辅助后台程序 每个集群都有一个 与NameNode进行通讯,定期保存HDFS元数据快照 与NameNode故障可以作为备用NameNode使用 1.3.D

kafka-connect-hdfs连接hadoop hdfs时候,竟然是单点的,太可怕了。。。果断改成HA

2017-08-16 11:57:28,237 WARN [org.apache.hadoop.hdfs.LeaseRenewer][458] - <Failed to renew lease for [DFSClient_NONMAPREDUCE_-1756242047_26] for 30 seconds. Will retry shortly ...> org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.ipc.StandbyE

Datanode启动问题 FATAL org.apache.hadoop.hdfs.server.datanode.DataNode: Initialization failed for Block pool &lt;registering&gt;

2017-04-15 21:21:15,423 INFO org.apache.hadoop.hdfs.server.datanode.DataNode: supergroup = supergroup 2017-04-15 21:21:15,467 INFO org.apache.hadoop.ipc.CallQueueManager: Using callQueue: class java.util.concurrent.LinkedBlockingQueue queueCapacity: