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();
}
}
主要掌握获取文件系统的方式