img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

⚫ 客户端与数据节点的交互是通过RPC(Remote Procedure Call)来实现的。在设计上,名称节点不会主动发起RPC,而是响应来自客户端和数据节点的RPC请求。

在客户端可以使用shell或是JavaApi进行HDFS的简单操作。

2.2.5 局限性

⚫ 命名空间的限制:名称节点是保存在内存中的,因此,名称节点能够容纳的对象(文件、块)的个数会受到内存空间大小的限制。
⚫ 性能的瓶颈:整个分布式文件系统的吞吐量,受限于单个名称节点的吞吐量。
⚫ 隔离问题:由于集群中只有一个名称节点,只有一个命名空间,因此,无法对不同应用程序进行隔离。
⚫ 集群的可用性:一旦这个唯一的名称节点发生故障,会导致整个集群变得不可用。

3. 利用Shell命令HDFS进行交互

3.1 概要
  • hadoop fs 适用于任何不同的文件系统,比如本地文件系统和 HDFS 文件系统:所有的的 FS shell 命令使用 URI 路径作为参数。URI 格式是 scheme://authority/path。对 HDFS文件系统,scheme 是 hdfs,对本地文件系统,scheme 是 file。
  • hadoop dfs 只能适用于 HDFS 文件系统
  • hdfs dfs 跟 hadoop dfs 的命令作用一样,也只能适用于 HDFS 文件系统
3.2 目录操作

创建HDFS的目录

hdfs dfs -mkdir /目录

在这里插入图片描述
注意要一层一层创建目录,好像不能一蹴而就。

列出HDFS的所有目录

hdfs dfs -ls

在这里插入图片描述

删除HDFS的目录

hdfs dfs -rm -r /目录

在这里插入图片描述

3.3 文件操作

文件上传

hdfs dfs -put 源路径 目的路径

在主机里创建文件
在这里插入图片描述
然后上传到HDFS中
在这里插入图片描述
文件内容查看

hdfs dfs -cat 文件路径

在这里插入图片描述

文件下载

hdfs dfs -get 源文件地址 下载到的路径

在这里插入图片描述
查看是否下载成功
在这里插入图片描述

文件的移动

hdfs dfs -mv 文件路径 目的目录

在这里插入图片描述
文件的复制

hdfs dfs -cp 文件路径 目的目录

在这里插入图片描述在这里插入图片描述

文件的创建

hdfs dfs -touch 文件路径

在这里插入图片描述

文件的追加

hdfs dfs -appendToFile 追加的内容文件路径 被追加的文件路径

在本地创建一个文件
在这里插入图片描述
对其进行添加操作
在这里插入图片描述

文件查看

hdfs dfs -text 文件路径

在这里插入图片描述

文件删除

hdfs dfs -rm 文件路径

在这里插入图片描述

4. 利用web界面管理HDFS

访问url:http://localhost:9870
就可以看到管理页面的!应该是可以的!我没试过。
附上老师的截图
在这里插入图片描述

5. 使用JavaApi进行管理HDFS

5.1 导包并测试

Idea导入hadoop jar包
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
找到文件路径安装即可。

在这里插入图片描述
添加指定的jar文件
在这里插入图片描述
看到这里的jar包即可成功了。

在这里插入图片描述
测试代码

在这里插入图片描述
可以运行就行了!

5.2 题目
第一题

编写Java代码实现功能:判断指定文件在HDFS中是否存在,若不存在,则创建该文件,若存在,则打开文件进行内容追加;

在本地创建一个文件夹用于追加使用。
在这里插入图片描述

import java.io.\*;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

public class HDFSmkdir {
    public static void appendToFile(Configuration conf, String localFilePath, String remoteFilePath) {
        Path remotePath = new Path(remoteFilePath); //传入hdfs文件路径
        try( 
        FileSystem fs = FileSystem.get(conf); 
        FileInputStream in = new FileInputStream(localFilePath);){
        //new一个文件的输入流的对象,并加入需要add的文件路径
            FSDataOutputStream out = fs.append(remotePath);  // 将hdfs中的文件读入
            byte[] data = new byte[1024]; 
            /\*
 从输出流中读取一定数量的字节,并将其存储在缓冲区数组data中。返回:
 读入缓冲区的总字节数;
 如果因为已经到达流末尾而不再有数据可用,则返回 -1。
 \*/
            int read = -1;
            while((read = in.read(data)) > 0) {
                out.write(data,0,read); // 添加hdfs文件之中
            }
            out.close(); // 关闭hdfs的文件
        }catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        new Mkdir(); //主函数new一个Mkdir对象
    }
}

class Mkdir{
    public Mkdir(){
        String filename = "/user/hadoop/input/hdfs-site.xml";  //需要添加本地内容的文件
        Configuration conf = new Configuration(); // new一个配置文件的对象
        conf.set("dfs.client.block.write.replace-datanode-on-failure.enable", "true");
     /\*
 在进行pipeline写数据(上传数据的方式)时,
 如果DN或者磁盘故障,客户端将尝试移除失败的DN,然后写到剩下的磁盘。
 一个结果是,pipeline中的DN减少了。这个特性是添加新的DN到pipeline。
 这是一个站点范围的选项。
 \*/
        conf.set("dfs.client.block.write.replace-datanode-on-failure.policy","NEVER");
    /\*
 此属性仅在dfs.client.block.write.replace-datanode-on-failure.enable设置为true时有效。
 ALWAYS: 总是添加新的DN
 NEVER: 从不添加新的DN
 DEFAULT: 设r是副本数,n是要写的DN数。在r>=3并且floor(r/2)>=n或者r>n(前提是文件是 hflushed/appended)时添加新的DN。
 \*/
        conf.set("fs.defaultFS", "hdfs://localhost:9000");
    /\*
 默认文件系统的名称。URI形式。uri's的scheme需要由(fs.SCHEME.impl)指定文件系统实现类。 uri's的authority部分用来指定host, port等。默认是本地文件系统。
 HA方式,这里设置服务名,例如:hdfs://111111
 HDFS的客户端访问HDFS需要此参数。
 伪分布是这样的,如果是全分布的话,应该是你的映射名字不是localhost了。应该。 
 \*/
        conf.set("fs.hdfs.impl", "org.apache.hadoop.hdfs.DistributedFileSystem");
        try {
            FileSystem fs = FileSystem.get(conf);
            Path path = new Path(filename);
            if(fs.exists(path)) {
                System.out.println("File \""+ filename +"\" Exist!");
                // 文件存在,追加内容
                try {
                    String localFilePath = "/home/zqc/add.txt"; 
                    //需要追加的文件内容的路径
                    HDFSmkdir.appendToFile(conf, localFilePath, filename);
                    System.out.println("File Written Successfully!");
                }catch(Exception e) {
                    e.printStackTrace();
                }
            }
            else {
                System.out.println("File \""+ filename +"\" Not Exist!");
                fs.createNewFile(path); 	// 文件不存在,创建文件
                System.out.println("File Created Successfully!");
            }
        }catch(IOException e)
        {
            e.printStackTrace();
        }
    }
}

编译器终端显示没有错误。在这里插入图片描述
然后在shell中cat是否添加
在这里插入图片描述
成功!追加成功!

第二题

编写Java代码实现功能:通过用户实时输入内容或本地文本内容完成HDFS文件写入操作,用户输入“exit”结束写入;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Scanner;

public class HDFSFileWritten {
    public static void appendToFile(Configuration conf, String localFilePath, String remoteFilePath) {
        Path remotePath = new Path(remoteFilePath);
        try (FileSystem fs = FileSystem.get(conf);
             FileInputStream in = new FileInputStream(localFilePath);) {
            FSDataOutputStream out = fs.append(remotePath);
            byte[] data = new byte[1024];
            int read = -1;
            while ((read = in.read(data)) > 0) {
                out.write(data, 0, read);
            }
            out.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        new HDFSWrite();
    }
}

class HDFSWrite {
    public HDFSWrite() {
        System.out.println("Please Choose The Way To Write");
        System.out.println("1.Written On Real Time");
        System.out.println("2.Written By Local File");
        Scanner str = new Scanner(System.in);
        String s = str.nextLine();
        String filename = "/user/hadoop/input/hdfs-site.xml";
        Path writtenpath = new Path(filename);
        Configuration conf = new Configuration();
        //配置信息都和上面的一样的!
        conf.set("dfs.client.block.write.replace-datanode-on-failure.enable", "true");
        conf.set("dfs.client.block.write.replace-datanode-on-failure.policy", "NEVER");
        conf.set("fs.defaultFS", "hdfs://localhost:9000");
        conf.set("fs.hdfs.impl", "org.apache.hadoop.hdfs.DistributedFileSystem");
        if (s.equals("1")) { //如果选择了1的话,就是自己输入
            System.out.println("Please Input The Content You Want To Append:");
            Scanner scanner = new Scanner(System.in);
            String string;
            try { //一个死循环
                while (true) {
                    FileSystem fs = FileSystem.get(conf);
                    FSDataOutputStream fsdataoutput = fs.append(writtenpath);
                    string = scanner.nextLine();
                    if (string.equals("exit")) { 	//如果输入是exit就退出
                        System.out.println("APPEND SUCCESSFULLY");
                        break;
                    }
                    try {	// 不然的话就是输入输入文件的内容
                        fsdataoutput.write(string.getBytes());
                        fsdataoutput.flush();
                        fsdataoutput.close();
                    } catch (Exception e) {
                        e.printStackTrace();


![img](https://img-blog.csdnimg.cn/img_convert/4c9f5396d95f9b0b9911f0dd7aebe832.png)
![img](https://img-blog.csdnimg.cn/img_convert/5f4f3e16e345b4cc623f453d08e803f2.png)
![img](https://img-blog.csdnimg.cn/img_convert/8425b83687cf0df5a05d4c8c45e437eb.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**

             } catch (Exception e) {
                        e.printStackTrace();


[外链图片转存中...(img-SJNgoP9O-1715712655388)]
[外链图片转存中...(img-R9bUN4Kx-1715712655388)]
[外链图片转存中...(img-WQEtWGyH-1715712655388)]

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐