Hadoop第四章:Client客户端2.0

系列文章目录

系列文章目录

Hadoop第一章:环境搭建
Hadoop第二章:集群搭建(上)
Hadoop第二章:集群搭建(中)
Hadoop第二章:集群搭建(下)
Hadoop第三章:Shell命令
Hadoop第四章:Client客户端
Hadoop第四章:Client客户端2.0



前言

在上一次的博客中我们完成了了Client的基础模板,这次我们将其完善。


提示:以下是本篇文章正文内容,下面案例可供参考

一、简单封装

核心代码

public class HdfsClient {
    //连接集群的nn地址

    @Test
    public void testmkdir() throws URISyntaxException, IOException, InterruptedException {
        //连接地址
        URI uri=new URI("hdfs://hadoop102:8020");
        //配置文件
        Configuration configuration=new Configuration();
        //用户
        String user="atguigu";
        //获取客户端对象
        FileSystem fs=FileSystem.get(uri,configuration,user);
        //创建一个文件夹
        fs.mkdirs(new Path("/xiyou/huaguoshan"));
        //关闭资源
        fs.close();
    }
}

可以看到我们将整个过程中的连接集群,执行命令,以及最后的连接断开,都写到了一个函数中,这很明显不利用代码的我们应该将其分别封装在三个函数中。

public class HdfsClient {

    private FileSystem fs;

    @Before
    public void init() throws URISyntaxException, IOException, InterruptedException {
        //连接地址
        URI uri=new URI("hdfs://hadoop102:8020");
        //配置文件
        Configuration configuration=new Configuration();
        //用户
        String user="atguigu";
        //获取客户端对象
        fs = FileSystem.get(uri,configuration,user);
    }

    @After
    public void close() throws IOException {
        //关闭资源
        fs.close();
    }

    @Test
    public void testmkdir() throws  IOException {
        //创建一个文件夹
        fs.mkdirs(new Path("/xiyou/huaguoshan1"));
    }
}

现在我们在创建一个文件。
在这里插入图片描述
现在我们只需要在命令部分进行修改即可。

二、上传文件

核心代码
在这里插入图片描述
只测试某一个test

    @Test
    public void testPut() throws IOException {
        //参数 1.是否删除源文件 2.是否强制覆盖 3.本地文件路径 4.hadoop文件路径
        fs.copyFromLocalFile(false,false,new Path("D:\\learn\\test.txt"),new Path("/"));
    }

副本数量优先级

在这里插入图片描述

正常情况下,这里会出现三个副本,因为咱们集群有三个节点,但是这个数量可以设置吗,当然是可以的,我们可以在项目的配置文件文件里设置(hdfs-site.xml),但这样灵活性会下降,所以就不介绍了,咱们之说在独立项目中如何设置。

在resources目录下创建一个hdfs-site.xml文件,如果要修改配置文件,就直接在hadoop的hdfs-site.xml文件中设置。
在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>
	<property>
		<name>dfs.replication</name>
         <value>1</value>
	</property>
</configuration>

在这里插入图片描述
这里我们吧副本数量设置为1,现在再次上传。这次注意要允许覆盖。
在这里插入图片描述
现在我这个项目里上传的文件的副本数统一更改了,但是还是不够灵活我希望每一次上传的副本数都有我控制,所以我们呀修改连接配置。
核心代码

    @Before
    public void init() throws URISyntaxException, IOException, InterruptedException {
        //连接地址
        URI uri=new URI("hdfs://hadoop102:8020");
        //配置文件
        Configuration configuration=new Configuration();
        //配置副本数
        configuration.set("dfs.replication", "2");
        //用户
        String user="atguigu";
        //获取客户端对象
        fs = FileSystem.get(uri,configuration,user);
    }

在这里插入图片描述
所以这里记录优先级
配置文件<项目配置<代码配置。

三、下载文件

核心代码

@Test
    //文件下载
    public void testGet() throws IOException {
        //参数 1.是否删除源文件 2.hadoop路径 3.本地路径 4.是否校验
        fs.copyToLocalFile(false,new Path("/test.txt"),new Path("C:\\Users\\admin\\Desktop"),false);
    }

我的下载路径选择的是桌面。
在这里插入图片描述
这里说一下这个校验,就hadoop的问价哈希一下,然后本地文件也哈希一下,如果一样,就说明没有产生数据丢失。

四、删除文件

核心代码

    @Test
    //文件删除
    public void tessRm() throws IOException {
        //参数 1.删除目录 2.是否递归
        fs.delete(new Path("/test.txt"),false);

        fs.delete(new Path("/wcinput"),true);

    }

在这里插入图片描述
注意空目录和文件可以直接删除,非空目录需要递归。

五、更名和移动

核心代码

    @Test
    //文件移动和更名
    public void testmv() throws IOException {
    	//参数 1.源路径 2.目标路径
        fs.rename(new Path("/xiyou/huaguoshan"),new Path("/xiyou/shuiliandong"));
    }

在这里插入图片描述
更名和移动是类似的只要修改路径即可。

六、是否为文件

信息代码

    @Test
    //判断是文件夹还是文件
    public void testFile() throws IOException {
        FileStatus[] listStatus =fs.listStatus(new Path("/"));
        for (FileStatus status : listStatus) {
            if (status.isFile()) {
                System.out.println("文件:"+status.getPath().getName());
            }else {
                System.out.println("目录:"+status.getPath().getName());
            }
        }
    }

在这里插入图片描述

七、查看文件详情

核心代码

@Test
    //获取文件信息
    public void fileDetail() throws IOException {
        RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path("/"), true);

        while (listFiles.hasNext()) {
            LocatedFileStatus fileStatus = listFiles.next();

            System.out.println("========" + fileStatus.getPath() + "=========");
            System.out.println(fileStatus.getPermission());
            System.out.println(fileStatus.getOwner());
            System.out.println(fileStatus.getGroup());
            System.out.println(fileStatus.getLen());
            System.out.println(fileStatus.getModificationTime());
            System.out.println(fileStatus.getReplication());
            System.out.println(fileStatus.getBlockSize());
            System.out.println(fileStatus.getPath().getName());

            // 获取块信息
            BlockLocation[] blockLocations = fileStatus.getBlockLocations();
            System.out.println(Arrays.toString(blockLocations));
        }
    }

在这里插入图片描述
由于集群是从新搭建了一次,里边没啥东西,随便上传个文件测试一下就行。


总结

用Java进行客户端的搭建到这里就告一段落了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
"Su Hadoop Bash: hadoop: 未找到命令" 这个错误提示通常表示你在尝试在bash shell中使用Hadoop命令行工具时,Hadoop环境没有被正确配置或者Hadoop命令的路径不在系统的PATH变量中。 Hadoop是一个分布式计算框架,用于存储和处理大数据。要解决这个问题,你可以按照以下步骤操作: 1. **确认安装**:首先,检查是否已安装Hadoop。如果没有,你需要从官方网站下载并安装适合你系统版本的Hadoop。 2. **配置环境变量**:安装完成后,你需要添加Hadoop的bin目录到系统的PATH环境变量中。在Linux或Mac系统中,可以在`~/.bashrc`或`~/.bash_profile`文件中添加一行类似于`export PATH=$PATH:/path/to/hadoop/bin`的命令,然后source该文件使更改生效。 3. **验证安装**:尝试运行`hadoop`命令,如果仍然提示未找到命令,可能是路径设置问题。可以尝试直接输入完整路径,比如`/path/to/hadoop/bin/hadoop`。 4. **Hadoop配置文件**:确认`hadoop.conf`文件中的核心配置是否正确,如`core-site.xml`和`hdfs-site.xml`,特别是`fs.defaultFS`和`hadoop.security.authentication`等关键配置。 5. **启动服务**:安装和配置完成后,确保Hadoop服务(如HDFS和YARN)已经启动。如果服务未运行,启动它们并等待它们完全启动。 6. **权限问题**:检查当前用户是否有执行Hadoop命令的权限。 如果以上步骤都尝试过还是无法解决问题,可能需要查看Hadoop的日志(通常是`hadoop.log`或`hadoop.err`),以获取更具体的错误信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值