首页 > 系统相关 >hdfs操作——hdfs的shell命令和hdfs的JavaAPI操作

hdfs操作——hdfs的shell命令和hdfs的JavaAPI操作

时间:2023-02-17 00:12:55浏览次数:31  
标签:hdfs shell 文件 路径 hadoop fs JavaAPI log4j

hdfs解决hadoop海量数据的存储。

shell 命令(所有hadoop fs 可由 hdfs dfs代替)

(1) 在hdfs上创建目录

hadoop fs -mkdir 目录名

(2) 本地文件的上传

hadoop fs -copyFromLocal 本地文件路径  目标目录路径     (复制)

hadoop fs -moveFromLocal 本地文件路径  目标目录路径  (剪切)

hadoop fs -put 本地文件路径  目标目录路径    (复制常用)

hadoop fs -appendToFile 本地文件路径  目标文件路径 (将本地文件内容追加到目标文件末尾)

(3)文件下载

hadoop fs -copyToLocal   hdfs文件路径  本地目录路径

hadoop fs -get  hdfs文件路径  本地目录路径

(4) HDFS直接操作

hadoop fs -ls  目标目录信息  (显示目录信息)

hadoop fs -cat 目标文件 (显示文件内容)

hadoop fs  -chgrp、-chmod、-chown 文件    (修改文件所属权限)

hadoop fs  -mkdir 文件路径 (创建路径)

hadoop fs -cp 原文件/目录路径  目标文件/目录路径  (从HDFS的一个路径拷贝到HDFS的另一个路径)

hadoop fs -mv  原文件/目录路径  目标文件/目录路径  (在HDFS目录中移动文件

hadoop fs -rm 目标文件 (删除文件或文件夹)

hadoop fs -rm -r 目标文件 (递归删除目录及目录里面内容) 

hadoop fs -du 目标文件 (统计文件夹的大小信息)

hadoop fs -setrep 数量 目标文件 (设置HDFS中文件的副本数量,注意副本数量有实际节点数量的最大限度)

 

Hdfs的Java API操作

首先通过windows使用javaAPI对hdfs文件进行操做,需要在windows上安装hadoop并配置环境变量

 

 

 

创建maven工程

在pom.xml添加依赖

<dependencies>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>3.1.3</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.30</version>
</dependency>
</dependencies>

对hdfs的文件操作流程一般都是3步:(1)获取客户端对象(2)执行命令操作(3)关闭资源

在resources创建配置文件

创建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>2</value>
</property>
</configuration>

注意参数的使用 

/**
* 参数优先级
* hdfs-default.xml => hdfs-site.xml => 在项目资源目录下配置文件 => 代码里面的配置,如configuration.set("dfs.replication","1");
*/

创建log4j.properties

log4j.rootLogger=INFO, stdout  
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=target/spring.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n

工程截图

 

 代码展示

package com.rsh.hdfs;


import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Arrays;

/**
 * 1. 获取客户端对象
 * 2. 执行命令
 * 3. 关闭资源
 * hdfs和zookeeper
 */

public class HdfsClient {

    /**
     * 参数优先级
     * hdfs-default.xml => hdfs-site.xml => 在项目资源目录下配置文件 => 代码里面的配置,如configuration.set("dfs.replication","1");
     */
    private FileSystem fs;

    @Before
    public void init() throws URISyntaxException, IOException, InterruptedException {
        URI uri = new URI("hdfs://hadoop102:8020");
        Configuration configuration = new Configuration();
        configuration.set("dfs.replication","1");
        fs = FileSystem.get(uri,configuration,"rsh");
    }

    //创建文件
    @Test
    public void testMkdirs() throws URISyntaxException, IOException, InterruptedException {
        //2.创建目录
        fs.mkdirs(new Path("/wangjianmin/SoftEngineer"));
    }

    //上传
    @Test
    public void testPut() throws IOException {
        //参数一:是否删除本地原数据,参数二:是否允许覆盖,参数三:原数据路径,参数四:目的路径
        fs.copyFromLocalFile(true,true,new Path("D:\\mavenproject\\hadooptest\\src\\main\\demo\\bigdata2.txt"),new Path("hdfs://hadoop102/wangjianmin/bigdata"));
    }

    //下载
    @Test
    public void testGet() throws IOException {
        //参数一:是否删除hdfs上的原数据,参数二:原数据路径,参数三:本地目标文件路径,参数四:是否开启本地数据校验
        fs.copyToLocalFile(false,new Path("hdfs://hadoop102/wangjianmin"),new Path("D:\\mavenproject\\hadooptest\\src\\main\\demo"),true);
    }

    //删除
    @Test
    public void testRm() throws IOException {
        /**
         * 可以删除文件
         * 可以删除目录,党删除非空目录时,要递归删除
         */
        //fs.delete(new Path("/jdk-8u212-linux-x64.tar.gz")); //删除文件
        //fs.delete(new Path("/wcinput"),false);  //删除空目录
        fs.delete(new Path("/computer"),true);
    }

    //更名和移动
    @Test
    public void testmv() throws IOException {
        fs.rename(new Path(""),new Path(""));
    }

    //读取文件信息
    @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.getOwner());
            System.out.println(fileStatus.getGroup());
            System.out.println(fileStatus.getLen());
            System.out.println(fileStatus.getPermission());
            System.out.println(fileStatus.getModificationTime());
            System.out.println(fileStatus.getReplication());
            System.out.println(fileStatus.getPath().getName());
            BlockLocation[] blockLocations = fileStatus.getBlockLocations();
            System.out.println(Arrays.toString(blockLocations));
        }
    }
    @After
    public void close() throws IOException {
        fs.close();
    }
}

 

标签:hdfs,shell,文件,路径,hadoop,fs,JavaAPI,log4j
From: https://www.cnblogs.com/20203923rensaihang/p/17128724.html

相关文章

  • Linux 中设置vim编辑器编写shell脚本自动缩进
     001、打开vim的配置文件:vim~/.vimrc然后在其末尾增加如下内容,然后保存退出:ifhas("autocmd")filetypeindentonautocmdFileType*setlocalts=4sts......
  • shell 判断文件夹或文件是否存在
    文件夹不存在则创建if[!-d"/data/"];thenmkdir/dataelseecho"文件夹已经存在"fi文件存在则删除if[!-f"/data/filename"];thenecho"文件不存在"els......
  • 一篇教会你写90%的shell脚本
    原文链接 :https://zhuanlan.zhihu.com/p/264346586  shell是外壳的意思,就是操作系统的外壳。我们可以通过shell命令来操作和控制操作系统,比如Linux中的Shell命令就......
  • (Pytorch第二天)CommandNotFoundError: Your shell has not been properly configured t
    我在cmd里执行condaactive,是没有问题的,但是在powershell里会报标题的错按照各种提示以及查的资料,都说执行condainit或者condainitcmd.exe等诸如此类的就能解决但是......
  • 如何使用Xshell巧妙的连接服务器
    最近一直在想到底写那些技术性文章,正好我之前买的一台服务器还没怎么使用,所以准备打算出一期在Xshell上使用服务器的教程的。首先,为什么要使用Xshell连接云服务器呢?1、......
  • PowerShell 基本使用
    PowerShellBasicPowerShellBasic简要基本使用PowerShellcmdlet获取帮助PowerShell别名和参数编写一个PowerShell脚本基本概念变量运算符参数分支......
  • PowerShell 的基本使用
    PowerShellBasicPowerShellBasic简要基本使用PowerShellcmdlet获取帮助PowerShell别名和参数编写一个PowerShell脚本基本概念变量运算符参数分支......
  • MySQL8.0 高可用集群化 · mysql-shell · mysql-router · docker · 单主多从
    高可用集群的基本特点负载均衡/读写分离/故障转移本文以此为目标,利用mysql-shell、mysql-router,基于docker的环境架构(篇幅太长,内容多了点儿)。一、名词及要点......
  • 批量getshell神器
    批量getshell神器,速度快,稳定性高,内存占用小扫到的百分之95都是一手的,可以更好的进行安全检测!更会不定时更新exp漏洞完全打破了目前网上所有的后缀扫描方式。演示地址:http......
  • 常用的getshell软件
    常用的getshell软件,使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以演示地址:https://note.youdao.com/s/Xi9S4I16一、什么是webshel......