hadoop-HDFS学习

一、HDFS的shell操作:

1.语法:hadoop fs 具体命令或者hdfs dfs 具体命令

2.上传:

(1)剪切hadoop fs -moveFromLocal 本地文件路径 HDFS文件路径
(2)复制hadoop fs -copyFromLocal 本地文件路径 HDFS文件路径或者hadoop fs -put 本地文件路径 HDFS文件路径
(3)追加到文件末尾hadoop fs -appendToFile 本地文件路径 HDFS文件路径

3.下载:拷贝到本地hadoop fs -copyToLocal HDFS文件路径 本地文件路径或者hadoop fs -get HDFS文件路径 本地文件路径

4.创建文件夹:hadoop fs -mkdir HDFS文件名

5.拷贝文件:hadoop fs -cp HDFS原文件路径 HDFS目的文件路径

6.剪切文件:hadoop fs -mv HDFS原文件路径 HDFS目的文件路径

7.显示文件末尾1kb数据:hadoop fs -tail HDFS文件路径

8.删除文件:hadoop fs -rm HDFS文件路径

9.递归删除文件:hadoop fs -rm -r HDFS原文件路径 HDFS目的文件路径

10.显示文件夹数据大小:hadoop fs -du -s -h HDFS文件路径

11.显示文件夹下各个文件的数据大小:hadoop fs -du -h HDFS文件路径

12.设置HDFS中文件的副本数量:hadoop fs -setrep 数量 HDFS文件路径

二、读写数据

1.oiv查看fsimage文件,hdfs oiv -p 文件类型 -i 编辑日志 -o 转换后文件输出路径

2.oev查看Edits文件,hdfs oev -p 文件类型 -i 编辑日志 -o 转换后文件输出路径

三、面试题

1.HDFS文件块大小:在企业中一般128m(中小公司),256m(大公司)

2.HDFS的shell操作(开发重点)

3.HDFS的读写流程(面试重点)

四、代码样例:

package com.lzp.hdfs;

/*
 * 客户端代码常用套路
 * 1.获取一个客户端对象
 * 2.执行相关的操作命令
 * 3.关闭资源
 * HDFS zookeeper
 */

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.lang.reflect.Array;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Arrays;

public class HdfsClient {

    private FileSystem fs;

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

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

    @Test
    public void testmkdir() throws URISyntaxException, IOException, InterruptedException {
        //2.创建一个文件夹
        fs.mkdirs(new Path("/xiyou/huaguoshan1" ));
    }
//    上传
    @Test
    public void testPut() throws IOException {
//        参数解读:参数一:表示删除原数据;参数二:是否允许覆盖;参数三:原数据路径;参数四:目的地路径
        fs.copyFromLocalFile(false,false,new Path("D:\\sunwukong.txt"),new Path("/xiyou/huaguoshan"));
    }
//    下载
    @Test
    public void testGet() throws IOException {
//        参数解读:参数一:表示删除原数据;参数二:原文件路径HDFS;参数三:目标地址路径Win;参数四;
        fs.copyToLocalFile(false,new Path("/xiyou/huaguoshan"),new Path("D:\\sunwukong.txt"),false);
    }
//    删除
    @Test
    public void testRm() throws IOException {
//        参数解读:参数一:要删除的路径;参数二:是否递归删除
//        删除文件
        fs.delete(new Path("/xiyou/huaguoshan/sunwukong.txt"),false);
//        删除空目录
        fs.delete(new Path("/xiyou/huaguoshan"),false);
//        删除非目录
        fs.delete(new Path("/sanguo"),true);
    }
//    文件的更名和移动
    @Test
    public void testmv() throws IOException {
//        参数解读:参数一:原文件路径;参数二:目标文件路径
//        对文件名称的修改
        fs.rename(new Path("/input/README.txt"),new Path("/input/ss.txt"));
//        文件的移动和更名
        fs.rename(new Path("/input/ss.txt"),new Path("/ss.cjk.txt"));
    }
//    获取文件信息
    @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.getBlockLocations());
            System.out.println(fileStatus.getBlockSize());
            System.out.println(fileStatus.getPath().getName());

//            获取块信息
            BlockLocation[] blockLocations = fileStatus.getBlockLocations();
            System.out.println(Arrays.toString(blockLocations));
        }
    }
//    判断是文件夹还是文件
    @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());
            }
        }
    }

}

五、集群运行

1.打包到集群上然后往集群上上传输入文件

2.使用hadoop jar 打包的jar包 编译的文件全称 集群上的输入文件 集群上的输出文件,如hadoop jar wc.jar com.lzp.mapreduce.wordcount.WordCountDriver /input /output

posted on 2022-08-23 16:52  L先森请坐下  阅读(65)  评论(0编辑  收藏  举报

导航