hadoop离线 day08 分布式文件系统的介绍的javaAPI操作

1391-王同学

发表文章数:51

热门标签

, , , , ,
首页 » 大数据 » 正文

1、HDFS 分布式文件系统详细介绍

hadoop离线 day08 分布式文件系统的介绍的javaAPI操作

**文件系统**:是一个顶层的抽象,具体的抽象,需要取决于你自己的获取的实例,我们可以通过文件系统获取本地文件系统,也可以获取分布式文件系统。
  • FTP:// ftp文件系统,可以做文件的上传和下载
  • webHdfs,浏览器操作文件系统,可以允许我们通过浏览器上传、下载、修改HDFS上面的文件
  • hdfs:分布式文件系统,最重要的一个
  • local:本地文件系统

HDFS分布式文件系统设计的目标
1、硬件错误是常态,特别是硬盘的损坏是常态
2、数据流访问,所有的数据访问都是大量的数据,使用IO流一直操作,追求的是稳定,不是效率
3、大数据集 假设所欲存储到HDFS的数据都是海量的数据,不擅长处理小文件(一个小文件占用一个元数据,元数据都存在内存中)
4、简单的相关模型 假设文件一次写入、多次读取,不会有频繁的更新,比较擅长存储一些历史数据
5、移动计算比移动数据便宜
6、多种软硬件的可移植性

2、HDFS的架构图

hadoop离线 day08 分布式文件系统的介绍的javaAPI操作

3、HDFS的元数据信息的管理

namenode负责更新保存元数据信息
datanode负责处理用户数据的读写
客户端通过namenode查找某个数据的所有的block块在哪些datanode上面,然后
数据副本的存放机制:namenode会首先找距离客户端最近的一台机器上传block
namenode负责数据block块的复制,定期的检测block的副本数,如果不够3个,则继续复制。

namenode的元数据保存在两个地方,一个是内存,一个是磁盘,存的是元数据的快照,如果快照非常大,停机再启动代价非常大。

block块的大小,可以根据实际工作当中的文件特性来调整,如果都是一些大文件,可以稍微调大block块的大小,以减少block元数据信息的数量。

块缓存:distributedCache 可以用来实现我们的文件的缓存

hdfs的权限验证:采用与Linux类似的权限验证机制,权限验证较弱,防止好人做错事,不能防止坏人做坏事

fimage:保存的是一份最完整的元数据信息,存放在两个地方,一个是磁盘,一个是内存,hdfs可以保存多少数据,取决于namenode的内存大小,hdfs推荐大量的大文件,不擅长小文件。

edits:保存的是最近一段时间的操作的元数据信息
如何确定
合并谁来做? secondaryNameNode 来做
合并触发:文件大小触发(默认64M)、时间间隔触发(默认3600秒)。

FSimage文件当中的文件信息查看

cd  /export/servers/hadoop-2.6.0-cdh5.14.0/hadoopDatas/namenodeDatas/current
hdfs oiv -i fsimage_0000000000000000864 -p XML -o hello.xml

edits文件中信息查看

cd /export/servers/hadoop-2.6.0-cdh5.14.0/hadoopDatas/nn/edits/current
hdfs oev -i edits_0000000000000000351-0000000000000000351 -o edits.txt XML

secondaryNameNode如何辅助管理FSimage和edits文件
hadoop离线 day08 分布式文件系统的介绍的javaAPI操作

4、文件的写入和读取过程

hdfs的文件写入过程
hadoop离线 day08 分布式文件系统的介绍的javaAPI操作

hdfs的文件读取过程

hadoop离线 day08 分布式文件系统的介绍的javaAPI操作

5、HDFS的javaAPI的操作

如何解决winutils的问题
第一步:把这个文件夹 3、大数据离线第三天/解决winutils的问题/hadoop-2.6.0-cdh5.14.0 拷贝到一个没有中文没有空格的路径下
第二步:配置windows的hadoop_home环境变量
第三步:将这个路径下面的 hadoop-2.6.0-cdh5.14.0/bin/hadoop.dll 这个文件,丢到C:/Windows/System32 这个路径下
第四步:关闭windows重启

import org.apache.commons.io.IOUtils;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.junit.Test;
import sun.security.krb5.internal.PAData;

import java.io.*;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;

public class HdfsOperate {
    @Test
    public  void  downHdfsFile() throws Exception {

        //第一步:注册hdfs的驱动文件,表示我们使用hdfs://这种协议访问我们的hdfs文件系统
        URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());
        //URL需要接受一个文件访问的地址
        String  url = "hdfs://node01:8020/install2.log";
        //获取到了一个inputStream
        InputStream inputStream = new URL(url).openStream();

        OutputStream outputStream = new FileOutputStream(new File("c://hello.txt"));

        //通过工具类,将我们 的输入流,读取到输出流,里面去
        IOUtils.copy(inputStream,outputStream);
        //关闭io流
        IOUtils.closeQuietly(inputStream);
        IOUtils.closeQuietly(outputStream);

    }


    /**
     * 获取文件系统的几种方式
     */
    @Test
    public  void getFileSystem1() throws IOException {
        //FileSystem是一个抽象类,获取抽象类的实例 有两种方式,第一种,看看这个抽象类有么有提供什么方法,返回他本身
        //第二种方式,找子类
        Configuration configuration = new Configuration();
        //如果这里不加任何配置,这里获取到的就是本地文件系统
        configuration.set("fs.defaultFS","hdfs://node01:8020");
        FileSystem fileSystem = FileSystem.get(configuration);
        System.out.println(fileSystem.toString());
        fileSystem.close();

    }

    /**
     * 第二种方式获取hdfs分布式文件系统
     */
    @Test
    public  void  getFileSystem2() throws Exception {
        Configuration configuration = new Configuration();
        //通过我们指定URI来获取分布式文件系统
        FileSystem fileSystem = FileSystem.get(new URI("hdfs://node01:8020"), configuration);
        System.out.println(fileSystem.toString());
        fileSystem.close();
    }


    /**
     * 第三种获取分布式文件系统的方法
     */
    @Test
    public  void getFileSystem3() throws IOException {
        Configuration configuration = new Configuration();
        configuration.set("fs.defaultFS","hdfs://node01:8020");
        FileSystem fileSystem = FileSystem.newInstance(configuration);
        System.out.println(fileSystem.toString());
        fileSystem.close();
    }
}    

分布式文件系统MapReduce的入门

未经允许不得转载:作者:1391-王同学, 转载或复制请以 超链接形式 并注明出处 拜师资源博客
原文地址:《hadoop离线 day08 分布式文件系统的介绍的javaAPI操作》 发布于2020-12-07

分享到:
赞(0) 打赏

评论 抢沙发

评论前必须登录!

  注册



长按图片转发给朋友

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

Vieu3.3主题
专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板。

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

Q Q 登 录
微 博 登 录