构建HDFS访问客户端对象

HDFS在生产生活中应用主要是客户端的开发,其核心步骤是从HDFS提供的API构建一个HDFS的访问客户端对象,通过该对象对HDFS上的文件进行增删改查

1.配置JAVA环境

首先电脑里cmd输入java -version  查看版本,如果没有出现下面图片这样的现象,那么说明你没有JAVA环境,可以去网上找资料配置JAVA环境(环境好久之前配置的了,没记录,就自己找一下吧)

2.下载安装包

   下载eclipse 并安装            eclipse安装包      password:mua5   (workplace自己记住就行)

   下载maven包                     maven   password:5ylo

3.配置eclipse 

Window  ----->    Preferences    ------>  Java     ------>   Installed JREs   ---->   Add(将我们能的JDK找到放进去) 

 

同时把Java   --->   Comlier中的JDK    的版本改成自己的 (我的是1.8的)

 

 

 

 

修改maven,这个里面ADD的就是上面下载的那个,选在apache-maven-3.3.9就行

 

修改Maven中的 User Settings 修改Settings 路径是apache-maven-3.3.9/conf/settings.xml   (记得修改settings.xml中的一个路径,因为你存的地方肯定和我不一样!)

 

 

 

 

 4.新建工程

1.建立一个Maven Project   下面就是创建简单工程,取名啥的

 

2.引入依赖  在pom.xml下我们加入依赖关系 

 

 输入:

<dependencies>
      <dependency>
          <groupId>org.apache.hadoop</groupId>
          <artifactId>hadoop-common</artifactId>
          <version>2.7.4</version>
      </dependency>
      <dependency>
          <groupId>org.apache.hadoop</groupId>
          <artifactId>hadoop-hdfs</artifactId>
          <version>2.7.4</version>
      </dependency>
      <dependency>
          <groupId>org.apache.hadoop</groupId>
          <artifactId>hadoop-client</artifactId>
          <version>2.7.4</version>
      </dependency>
      <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>RELEASE</version>
      </dependency>
  </dependencies>

 3.保存之后更新配置 

之后会产生一个包

 

 在src/main/java下建立包,包下建立一个类

 

 引入参数(出现红线,就按下ctrl+shift+o键进行填包,记得选在带hadoop的)
输入  :public class HDFS_CRUD {
    
    FileSystem fs = null;
    
    @Before // 此注解可以保证init方法在程序中最先执行
    public void init() throws Exception{
        // 构造一个配置参数对象,设置一个参数:要访问的hdfs的uri
        Configuration conf = new Configuration();
        // 这里指定使用的是hdfs
        conf.set("fs.defaultFS", "hdfs://hadoop01:9000");// 此处使用主机名需要配置windows的host文件
        // 通过如下的方式进行客户端身份的设置
        System.setProperty("HADOOP_USER_NAME", "root");
        // 通过FileSystem的静态方法获取文件系统客户端对象
        fs = FileSystem.get(conf);
    }

 

 从客户端中上传文件(这里注意斜杠方向)

输入;

@Test
    public void testAddFileToHdfs() throws IOException {
        
        // 要上传的文件所在的路径
        Path src = new Path("D:\\test.txt");
        // 要上传到hdfs的目标路径
        Path dst = new Path("/testFile"); // 一定注意此处的testFile就是上传到hdfs的文件的名字而不是文件夹
        // 上传
        fs.copyFromLocalFile(src, dst);
        //关闭资源
        fs.close();
    }

 

 

 

从服务器下载文件(是不是感觉指令有那么一丝属性)

输入:// 从hdfs 中复制文件到本地文件系统
    @Test
    public void testDownloadFileToLocal() throws IOException {
        // 下载文件
        Path src = new Path("/long");
        Path dst = new Path("D:/");
        fs.copyToLocalFile(false,src, dst,true);
        
        // 关闭资源
        fs.close();
    }

 

 

 

 查看;删除;重命名文件

输入:
    @Test
    public void testMkdirAndDeleteAndRename() throws Exception {
        // 创建目录
        fs.mkdirs(new Path("/a/b/c"));
        fs.mkdirs(new Path("/long/shi/san"));
        
        // 重命名文件或文件夹
        // fs.rename(new Path("/a"), new Path("/hahahahahaha"));
        
        // 删除文件夹,如果是非空文件夹,参数2必须给值为true
        // fs.delete(new Path("/hahahahahaha"),true);
    }

 

 

 查看文件目录

输入:

@Test
    public void testListFiles() throws FileNotFoundException, IllegalArgumentException, IOException {
        // 获取迭代器对象
        RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path("/"), true);
        
        while(listFiles.hasNext()) {
            LocatedFileStatus fileStatus = listFiles.next();
            // 打印当前文件名称
            System.out.println(fileStatus.getPath().getName());
            // 打印当前文件块大小
            System.out.println(fileStatus.getBlockSize());
            // 打印当前文件权限
            System.out.println(fileStatus.getPermission());
            // 打印当前文件内容长度
            System.out.println(fileStatus.getLen());
            // 获取该文件块信息(包括长度,数据块,datanode的信息)
            BlockLocation[] blockLocations = fileStatus.getBlockLocations();
            
            for (BlockLocation blockLocation : blockLocations) {
                System.out.println("block-length:"+blockLocation.getLength()+" -- "+"block-offset:"+blockLocation.getOffset());
                String[] hosts = blockLocation.getHosts();
                
                for (String host : hosts) {
                    System.out.println(host);
                }
            }
            System.out.println("--------------分割线---------");
        }
    }

 

执行一下看看

首先看一下我们hadoop目录下都有什么

 实验现象

 我们在d盘建立一个longshisan.txt传上去

右击函数,选择Run As  进行测试

 

 第一个传输成功

 

 第二个下载成功

 

 第三个创建目录

 

第四个重命名

 

 第五个删除

 

 最后一个

 

   

 

今日HDFS访问结束!

 

posted @ 2021-06-16 15:27  泷十三  阅读(98)  评论(0编辑  收藏  举报