Hadoop阶段学习记录

1.学习Hadoop框架以及MR编程已经接近1个月,在此对一些经典案例做一下记载。

首先是一张MR流程图

在这里插入图片描述
图片借鉴于:https://blog.csdn.net/zhongqi2513/article/details/78321664

1.部分对于HDFS文件系统的javaAPI操作案例

1.上传本地文件

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.testng.annotations.Test;

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

/**
 * 将本地文件上传到HDFS文件系统上
 */
public class CopyFile {
    @Test
    public void copyFromLocalFile() throws URISyntaxException, IOException, InterruptedException {
        //获取HDFS文件系统
        FileSystem fileSystem = FileSystem.get(new URI("hdfs://hadoop01:8020"), new Configuration(), "root");
        //调用文件系统的copyFromLocalFile将指定的HostKeyDB.txt文件上传到WordCount目录下
        fileSystem.copyFromLocalFile(new Path("file:///D:\\HostKeyDB.txt"), new Path("/"));
        //关闭文件系统
        fileSystem.close();
    }
}

2.递归遍历HDFS文件系统中的所有文件,并在控制台打印文件路径(了解)

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.testng.annotations.Test;

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
/**
 * 递归遍历指定路径下的所有文件
 *
 */
public class GetListFile {
    @Test
    public void listFile() throws URISyntaxException, IOException {
        //获取文件系统
        FileSystem fileSystem = FileSystem.get(new URI("hdfs://hadoop01:8020"), new Configuration());
        //指定要遍历的路径,并将遍历出的文件存入FileStatus数组中
        FileStatus[] fileStatuses = fileSystem.listStatus(new Path("/"));
        //遍历数组
        for (FileStatus fileStatus : fileStatuses) {
            //判断当前文件是文件夹还是文件
            if (fileStatus.isDirectory()) {
                //如果是文件就获取路径,调用下面的listAllFiles方法再次遍历
                Path path = fileStatus.getPath();
                listAllFiles(fileSystem, path);
            } else {
                System.out.println("文件路径为:" + fileStatus.getPath().toString());
            }
        }
    }

    public void listAllFiles(FileSystem fileSystem, Path path) throws IOException {
        FileStatus[] fileStatuses = fileSystem.listStatus(path);
        for (FileStatus fileStatus : fileStatuses) {
            if (fileStatus.isDirectory()) {
                listAllFiles(fileSystem, fileStatus.getPath());
            } else {
                Path path1 = fileStatus.getPath();
                System.out.println("文件路径为:" + path1);
            }
        }
    }
    
    /**
     * 2.使用FileSystem的listFiles方法遍历
     * @throws URISyntaxException
     * @throws IOException
     */
    @Test
    public void myFileList() throws URISyntaxException, IOException {
        //获取文件系统
        FileSystem fileSystem = FileSystem.get(new URI("hdfs://hadoop01:8020"), new Configuration());
        //调用listFiles方法遍历文件系统
        RemoteIterator<LocatedFileStatus> locatedFile = fileSystem.listFiles(new Path("/"), true);
        while (locatedFile.hasNext()) {
           LocatedFileStatus next = locatedFile.next();
           System.out.println(next.getPath().toString());
        }
        fileSystem.close();
    }
}

3.将本地的小文件合并成一个文件上传到HDFS上

import org.apache.commons.io.IOUtils;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.testng.annotations.Test;

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

public class MergeFile {
    @Test
    public void margeFile() throws URISyntaxException, IOException, InterruptedException {
        //获取分布式文件系统
        FileSystem fileSystem = FileSystem.get(new URI("hdfs://hadoop01:8020"), new Configuration(), "root");
        FSDataOutputStream outputStream = fileSystem.create(new Path("/bigfile.xml"));
        //获取本地文件系统
        LocalFileSystem locatedFile = FileSystem.getLocal(new Configuration());
        //通过本地文件系统获取文件列表,为一个集合
        FileStatus[] listStatus = locatedFile.listStatus(new Path("file:///D:\\大数据\\小文件合并"));
        //遍历并调用IO流将文件合并
        for (FileStatus fileStatus : listStatus) {
            FSDataInputStream inputStream = locatedFile.open(fileStatus.getPath());
            IOUtils.copy(inputStream, outputStream);
            IOUtils.closeQuietly(inputStream);
        }
        IOUtils.closeQuietly(outputStream);
        locatedFile.close();
        fileSystem.close();
    }
}

主要掌握获取文件系统的方式

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值