栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

HDFS的Shell操作以及API

HDFS的Shell操作以及API

HDFS的Shell操作以及API
  • 环境
  • HDFS的shell操作
    • 基本语法
    • 常用命令
      • 上传
      • 下载
      • HDFS直接操作
  • HDFS的API操作
    • 准备工作
    • 客户端代码步骤
    • 搭建测试框架
    • 操作
      • 创建文件夹
      • 文件上传
      • 文件下载
      • 文件删除
      • 文件更名和移动
      • 获取文件详情信息
      • 判断文件夹还是文件

环境

操作系统:xubuntu

HDFS的shell操作 基本语法

hadooop fs 具体命令 或 hdfs dfs 具体命令

常用命令

创建文件夹

hdfs dfs -mkdir /t1
上传
# 从本地剪切到hdfs
hdfs dfs -moveFromLocal f1.txt /t1
# 从本地复制到hdfs,下面两个命令效果相同,生产环境习惯于用put
hdfs dfs -copyFromLocal f1.txt /t1
hdfs dfs -put f1.txt /t1
# 追加一个文件到已经存在的文件末尾,很少用
hdfs dfs -appendToFile f2.txt /t1/f1.txt
下载
# 从hdfs复制到本地,两条命令相同,生产环境习惯用get,下载到本地可以保存为其他文件名
hdfs dfs -copyToLocal /t1/f1.txt ./
hdfs dfs -get /t1/f1.txt ./f2.txt
HDFS直接操作
# 和linux命令一样
-ls,-cat,
-chgrp,-chmod,-chwon
-mkdir,-cp,-mv

# 显示一个文件的末尾1kb数据
hdfs dfs -tail /t1/f1.txt
#删除文件或文件夹
hdfs dfs -rm /t1/f1.txt
# 递归删除目录及目录里面的内容
hdfs dfs -rm -r /t1/f1.txt
# 统计文件夹的大小信息
hdfs dfs -du -s -h /t1
-s: 目录下的文件大小总和
-h: 文件大小 * 副本数
# 统计目录下每个文件的大小,干掉-s
hdfs dfs -du -h /t1
# 设置hdfs中文件的副本数量
hdfs dfs -setrep 4 /t1/f1.txt
HDFS的API操作 准备工作

1.创建一个maven工程,导入依赖


		
            org.apache.hadoop
            hadoop-client
            2.9.2
        
        
            junit
            junit
            4.12
        
        
            org.slf4j
            slf4j-log4j12
            1.7.30
        
    

2.在resource目录下创建log4j.properties

# 配置根
log4j.rootLogger=debug,console

### 日志输出到控制台
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [%p]-[%c] %m%n

3.创建一个类com.lzr.hdfs.HdfsClient

客户端代码步骤
  1. 获取一个客户端对象
  2. 执行相关的操作命令
  3. 关闭资源
搭建测试框架
package com.lzr.hdfs;

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

import java.net.URI;
import java.net.URISyntaxException;

public class HdfsClient {
    URI uri; 
    Configuration conf; 
    FileSystem fs;
    
    @Before
    public void init() throws Exception{
        // 连接的集群的namenode地址
        uri = new URI("hdfs://192.168.1.101:9000");
        // 创建一个配置文件
        conf = new Configuration();
        // 1. 获取客户端
        fs = FileSystem.get(uri, conf);
    }
    
    @After
    public void destroy() throws Exception{
        // 关闭资源
        fs.close();
    }
}
操作 创建文件夹
@Test
public void testMkdir() throws Exception {
    // 创建一个文件夹
	fs.mkdirs(new Path("/dir1"));
}
文件上传
@Test
public void testPut() throws IOException {
    fs.copyFromLocalFile(
        false,  // 是否删除源文件
        true,  // 能否覆盖目标文件
        new Path("src/main/resources/log4j.properties"),  // 源文件地址
        new Path("/dir1") // hdfs目标地址
    );
}
文件下载
@Test
public void testGet() throws IOException {
    fs.copyToLocalFile( 
        false, // 是否删除源文件
        new Path("hdfs://dir1/file1"), // 源文件hdfs
        new Path("/root/"), // 目标目录
        false // 是否开启本地校验
    );
}
文件删除
@Test
public void testDel() throws IOException {
    fs.delete(
        new Path("/dir/log4j.properties"), // 要删除的文件
        false	// 是否递归删除
    );
    // 删除空目录,没必要递归删除
    fs.delete(new Path("/dir"),false);
    // 删除非空目录,必须递归删除
    fs.delete(new Path("/dir"),true);
}
文件更名和移动
@Test
public void testMv() throws IOException {
    fs.rename(
        new Path("/dir/file1"),	// 源文件路径
        new Path("/dir1/file111")	// 目标文件路径
    );
    
    // 移动并更名
    fs.rename(new Path("/dir1/file1"),new Path("/dir2/file2"));
    // 目录更名
    fs.rename(new Path("/dir"),new Path("/dir3"));

}
获取文件详情信息
@Test
public void fileDetail() throws IOException {
    // args1: 文件路径, args2:是否递归遍历
    RemoteIterator files = fs.listFiles(new Path("/"), true);
    while (files.hasNext()){
        LocatedFileStatus file = files.next();
        System.out.println("======" + file.getPath() + "=====");
        System.out.println(file.getPermission());
        System.out.println(file.getOwner());
        System.out.println(file.getGroup());
        System.out.println(file.getLen());
        System.out.println(file.getModificationTime());
        System.out.println(file.getReplication());
        System.out.println(file.getBlockSize());
        System.out.println(file.getPath().getName());
        
        // 获取块信息
        BlockLocation[] blockLocations = file.getBlockLocations();
        System.out.println(Arrays.toString(blockLocations));
    }
}

以上信息对应hdfs的web页面里的文件系统的相关信息

判断文件夹还是文件
@Test
public void testFile() throws IOException {
    // 直接列出当前目录,不是递归遍历
    FileStatus[] fileStatuses = fs.listStatus(new Path("/"));
    for (FileStatus fileStatus : fileStatuses) {
        if (fileStatus.isFile()){
            System.out.println("file: " +  fileStatus.getPath().getName());
        }else {
            System.out.println("dirs: " +  fileStatus.getPath().getName());
        }
    }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/487468.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号