IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> Java操作hdfs以及block块如何划分与相连 -> 正文阅读

[大数据]Java操作hdfs以及block块如何划分与相连

创建连接

使用Java操作hdfs,其实是使用hdfs的文件管理系统file system(在hdfs-site.xml中)

FileSystem fs;
    @Before
    public void main() throws Exception{
        //获取配置文件,通过configuration这个类
        Configuration configuration = new Configuration();
        //设置副本数
        configuration.set("dfs.replication","1");
        //获取指定的连接地址
        //端口9000在core-site.xml中,50070只是一个前端的界面端口号
        URI uri = new URI("hdfs://master:9000");
        //创建获取文件管理系统的对象,通过对象操作hdfs
        fs = FileSystem.get(uri, configuration);
    }

创建目录或文件

值得注意的是mkdirs方法里面需要的是Path,而不是一个直接的路径

 @Test
    public void mk() throws Exception{
        boolean mkdirs = fs.mkdirs(new Path("/test/test/test"));
        System.out.println(mkdirs);
    }

删除目录或文件

public void delete() throws Exception{
        //boolean表示是否可以迭代删除
        //为true可以,false不可以
        boolean delete = fs.delete(new Path("/test"), true);
        System.out.println(delete);
    }

查看文件状态

 @Test //查看文件状态
    public void listStatus() throws Exception{
        FileStatus[] fileStatuses = fs.listStatus(new Path("/datas"));

        for (FileStatus f:fileStatuses) {
            System.out.println(f.getBlockSize());//固定是128MB
            System.out.println(f.getLen());//表示的是当前的数据量
            System.out.println(f.getReplication());//表示的是副本数量,配置文件里面设置过了,刚开始的初始化也设置了
            System.out.println(f.getPermission());//权限
            System.out.println(f.getPath());//详细地址(路径)
            System.out.println("--------");
        }

简而言之,这里面的代码查的是这些东西

在这里插入图片描述

文件切分一个block块

现在查的是这这个块里面的内容
在这里插入图片描述
发现代码查出的内容与上面一样
在这里插入图片描述

 @Test //查看块的状态
    public void listBlockLocation() throws IOException {
        //这个块是一个数组,是因为有可能不止一个块
        BlockLocation[] fileBlockLocations = fs.getFileBlockLocations(
                new Path("/datas/students.txt"),
                0,
                10
        );
        for(BlockLocation blockLocation:fileBlockLocations){
//            System.out.println(blockLocation.getHosts());//这里获取的是一个地址,说明是一个容器,继续遍历
            String[] hosts = blockLocation.getHosts();
            for (String s:hosts) {
                System.out.println(s);
            }

            System.out.println(blockLocation.getLength());
//            System.out.println(blockLocation.getNames());//这里也是一个地址,继续遍历
            String[] names = blockLocation.getNames();
            for (String s:names) {
                System.out.println(s);
            }

            System.out.println(blockLocation.getOffset());//偏移量0,指的是Block0里面的0
//            System.out.println(blockLocation.getTopologyPaths());//这里也是一个地址,继续遍历
            String[] topologyPaths = blockLocation.getTopologyPaths();
            for (String s:topologyPaths) {
                System.out.println(s);
            }

        }
    }

文件切分多个block块

@Test
    //文件切分多个block块
    public void getBlockLocation() throws Exception{
        BlockLocation[] fileBlockLocations = fs.getFileBlockLocations(new Path("/datas/bigstudent.txt"), 0, 1000000000);
        for (BlockLocation blockLocation:fileBlockLocations){
            String[] hosts = blockLocation.getHosts();
            for(int i=0;i<hosts.length;i++){
                System.out.println(hosts[i]+"---"+blockLocation.getOffset());
            }
        }

所有完整代码

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.BlockLocation;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.junit.Before;
import org.junit.Test;


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

public class hdfsAPI {
    //1.获取hdfs的文件管理系统file system(hdfs-site.xml)
    FileSystem fs;
    @Before
    public void main() throws Exception{
        //获取配置文件,通过configuration这个类
        Configuration configuration = new Configuration();
        //设置副本数
        configuration.set("dfs.replication","1");
        //获取指定的连接地址
        //端口9000在core-site.xml中,50070只是一个前端的界面端口号
        URI uri = new URI("hdfs://master:9000");
        //创建获取文件管理系统的对象,通过对象操作hdfs
        fs = FileSystem.get(uri, configuration);
    }

    @Test
    public void mk() throws Exception{
        boolean mkdirs = fs.mkdirs(new Path("/test/test/test"));
        System.out.println(mkdirs);
    }

    @Test
    public void delete() throws Exception{
        //boolean表示是否可以迭代删除
        //为true可以,false不可以
        boolean delete = fs.delete(new Path("/test"), true);
        System.out.println(delete);
    }

    @Test //查看文件状态
    public void listStatus() throws Exception{
        FileStatus[] fileStatuses = fs.listStatus(new Path("/datas"));

        for (FileStatus f:fileStatuses) {
            System.out.println(f.getBlockSize());//固定是128MB
            System.out.println(f.getLen());//表示的是当前的数据量
            System.out.println(f.getReplication());//表示的是副本数量,配置文件里面设置过了,刚开始的初始化也设置了
            System.out.println(f.getPermission());//权限
            System.out.println(f.getPath());//详细地址(路径)
            System.out.println("--------");
        }



    }

    @Test //查看块的状态
    //文件切分一个block块
    public void listBlockLocation() throws IOException {
        //这个块是一个数组,是因为有可能不止一个块
        BlockLocation[] fileBlockLocations = fs.getFileBlockLocations(
                new Path("/datas/bigstudent.txt"),
                0,
                10
        );
        for(BlockLocation blockLocation:fileBlockLocations){
//            System.out.println(blockLocation.getHosts());//这里获取的是一个地址,说明是一个容器,继续遍历
            String[] hosts = blockLocation.getHosts();
            for (String s:hosts) {
                System.out.println(s);
            }

            System.out.println(blockLocation.getLength());
//            System.out.println(blockLocation.getNames());//这里也是一个地址,继续遍历
            String[] names = blockLocation.getNames();
            for (String s:names) {
                System.out.println(s);
            }

            System.out.println(blockLocation.getOffset());//偏移量0,指的是Block0里面的0
//            System.out.println(blockLocation.getTopologyPaths());//这里也是一个地址,继续遍历
            String[] topologyPaths = blockLocation.getTopologyPaths();
            for (String s:topologyPaths) {
                System.out.println(s);
            }

        }
    }

    @Test
    //文件切分多个block块
    public void getBlockLocation() throws Exception{
        BlockLocation[] fileBlockLocations = fs.getFileBlockLocations(new Path("/datas/bigstudent.txt"), 0, 1000000000);
        for (BlockLocation blockLocation:fileBlockLocations){
            String[] hosts = blockLocation.getHosts();
            for(int i=0;i<hosts.length;i++){
                System.out.println(hosts[i]+"---"+blockLocation.getOffset());
            }
        }
    }
    
}


block块如何划分

一个文件大于128MB,并且也超出了10%的缓存,就会被瓜分到不同的block块中,且分去的地方不尽相同。有些被分到了node1,有些分到了node2,而master中是不存数据的
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

每一块的数据如何相连

不同的数据被分成了许多的block块,那么机器是怎么知道哪几个block块是对应一个数据的呢?
在这里插入图片描述
不同的block块虽然被放到了不同的节点(node)中,但是拿数据的时候是根据ID号来取数据的,同一个数据的ID号是连一起的(读一个数据文件,比如students.txt的时候,寻找的只是这个文件里面的block块的ID,不会去找别的ID)
在这里插入图片描述
感谢阅读,我是啊帅和和,一位大数据专业大四学生,祝你快乐。

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-09-19 08:02:49  更:2021-09-19 08:04:38 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 19:56:40-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码