Hadoop和HDFS基础练习

Hadoop和HDFS基础测试:

测试题目1 Hadoop操作

  1. 使用hadoop用户登录Linux系统,启动HadoopHadoop的安装目录为“/usr/local/hadoop”),为hadoop用户在HDFS中创建用户目录“/user/hadoop”
  2. 接着在HDFS的目录“/user/hadoop”下,创建test文件夹,并查看文件列表
  3. Linux系统本地的/.bashrc”文件上传到HDFStest文件夹中,并查看test
  4. HDFS文件夹test复制到Linux系统本地文件系统的“/usr/local/hadoop”目录下

测试题目2HDFS操作

(一)编程实现以下功能,并利用Hadoop提供的Shell命令完成相同任务:

HDFS中上传任意文本文件,如果指定的文件在HDFS中已经存在,则由用户来指定是追加到原有文件末尾还是覆盖原有的文件;

HDFS中下载指定文件,如果本地文件与要下载的文件名称相同,则自动对下载的文件重命名;

HDFS中指定文件的内容输出到终端中;

显示HDFS中指定的文件的读写权限、大小、创建时间、路径等信息;

给定HDFS中某一个目录,输出该目录下的所有文件的读写权限、大小、创建时间、路径等信息,如果该文件是目录,则递归输出该目录下所有文件相关信息;

提供一个HDFS内的文件的路径,对该文件进行创建和删除操作。如果文件所在目录不存在,则自动创建目录;

 

提供一个HDFS的目录的路径,对该目录进行创建和删除操作。创建目录时,如果目录文件所在目录不存在,则自动创建相应目录;删除目录时,由用户指定当该目录不为空时是否还删除该目录;

HDFS中指定的文件追加内容,由用户指定内容追加到原有文件的开头或结尾;

删除HDFS中指定的文件;

HDFS中,将文件从源路径移动到目的路径。

 

(二)编程实现一个类“MyFSDataInputStream”,该类继承“org.apache.hadoop.fs.FSDataInputStream”,要求如下:实现按行读取HDFS中指定文件的方法“readLine()”,如果读到文件末尾,则返回空,否则返回文件一行的文本。

(三)查看Java帮助手册或其它资料,用“java.net.URL”“org.apache.hadoop.fs.FsURLStreamHandlerFactory”编程完成输出HDFS中指定文件的文本到终端中。

一.

 

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

/**
 * 客户端代码常用套路
 * 1.获取一个客户端对象
 * 2.执行相关操作命令
 * 3.关闭资源
 * */
public class HdfsClient {
    private FileSystem fs;

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

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

    @Test
    public void textmkdir() throws URISyntaxException, IOException, InterruptedException {
        //2.创建一个文件夹
        fs.mkdirs(new Path("/xiyou/huaguoshan2"));
    }
    //上传

    /**
     * 参数优先级(由低向高)
     * hdfs-default.xml=>hdfs-site.xml=>在项目资源目录下的配置文件优先级=>代码里面的配置
     */
    @Test
    public void testput() throws IOException {
        //参数解读:参数一:表示删除原数据;参数二:是否允许覆盖;参数三:原数据路径;参数四:目的地路径
        fs.copyFromLocalFile(true, true, new Path("G:\\text02.txt"), new Path("/user/hadoop/test"));
    }

    //文件下载
    @Test
    public void testGet() throws IOException {
        //参数解读:参数一:原文件是否删除 参数二:原文件路径HDFS 参数三:目的路径win 参数四:
        fs.copyToLocalFile(false, new Path("/xiyou/huaguoshan"), new Path("d:\\"), false);
    }
    //删除
    @Test
    public void testRm() throws IOException {
        //参数解读:参数一:要删除的路径 参数二:是否递归删除
        //删除文件
        //fs.delete(new Path("/jdk-8u212-linux-x64.tar.gz"),false);
        //删除空目录
        //fs.delete(new Path("/xiyou"),false);
        //删除非空目录
        fs.delete(new Path("/jinguo"), true);
    }

    //文件的更名和移动
    @Test
    public void testmv() throws IOException {
        //参数解读:参数1:原文件路径;参数2:目标文件路径
        //对文件名称的修改
        //fs.rename(new Path("/wcinput/word.txt"),new Path("/wcinput/ss.txt"));
        //文件的移动和更名
        //fs.rename(new Path("/wcinput/ss.txt"),new Path("/cls.txt"));
        //目录更名
        fs.rename(new Path("/wcinput"), new Path("/output"));
    }

    //获取文件详细信息
    @Test
    public void fileDetail() throws IOException {
        RemoteIterator<LocatedFileStatus> iterator = fs.listFiles(new Path("/"), true);
        while (iterator.hasNext()) {
            LocatedFileStatus fileStatus=iterator.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));
        }
    }
    @Test
    public void testListStatus() throws IOException{
        //  判断是文件还是文件夹
        FileStatus[] listStatus = fs.listStatus(new Path("/"));
        for (FileStatus fileStatus : listStatus) {
            // 如果是文件
            if (fileStatus.isFile()) {
                System.out.println("文件:" + fileStatus.getPath().getName());
            } else {
                System.out.println("目录:" + fileStatus.getPath().getName());
            }
        }
    }
}

 

二及三:

package com.zhao.hdfs;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.commons.io.IOUtils;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.FsUrlStreamHandlerFactory;
import org.apache.hadoop.fs.Path;

public class MyFSDataInputStream extends FSDataInputStream {
    static{
        URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());
    }
    MyFSDataInputStream(InputStream in)
    {
        super(in);
    }
    public static int ReadLine(String path) throws IOException, URISyntaxException, InterruptedException {
        //连接集群的nn地址
        URI url = new URI("hdfs://Hadoop102:8020");
        //创建一个配置文件
        Configuration configuration = new Configuration();
        //用户
        String user = "zhao";
        //1.获取到了客户端对象
        FileSystem fs = FileSystem.get(url, configuration, user);
        Path file = new Path(path);
        FSDataInputStream getIt = fs.open(file);
        BufferedReader d = new BufferedReader(new InputStreamReader(getIt));

        String content;// = d.readLine(); //读取文件一行
        System.out.println("使用readline按行读取文本:");
        while((content=d.readLine())!=null){
            System.out.println(content);
        }
        //  System.out.println(content);
        d.close(); //关闭文件
        fs.close(); //关闭hdfs
        return 0;
    }

    public static void PrintFile() throws MalformedURLException, IOException{
        String FilePath="hdfs://Hadoop102:8020/user/hadoop/test/test02.txt";
        InputStream in=null;
        in=new URL(FilePath).openStream();
        System.out.println("读取文本输出到终端:");
        IOUtils.copy(in,System.out);
    }


    public static void main(String[] arg) throws IOException, URISyntaxException, InterruptedException {
        MyFSDataInputStream.ReadLine("/user/hadoop/test/test02.txt");
        MyFSDataInputStream.PrintFile();
    }
}

 

posted @ 2021-09-30 20:55  哦心有  阅读(263)  评论(0编辑  收藏  举报