hadoop之hdfs的API测试
4.2.2 从hadoop URL读取数据
package com.lcf.hdfs;
import org.apache.hadoop.fs.FsUrlStreamHandlerFactory;
import org.apache.hadoop.io.IOUtils;
import java.io.IOException;
import java.io.InputStream;
import java.net.URISyntaxException;
import java.net.URL;
// 4.2.2 从hadoop URL读取数据
public class URLCat {
// 设置URL能够识别hdfs协议的应用程序FsUrlStreamHandlerFactory工厂实例对象
static {
URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());
}
public static void main(String[] args) throws IOException, URISyntaxException {
// 定义标准的javaio输入流变量
InputStream in = null;
// 定义HDFS的URL以main函数参数的形式赋值给url变量,假如args[0]的值为hdfs://master:9000/data/data
String url = args[0];
try {
// 创建URL对象,并获取URL对象所打开的HDFS文件系统中的文件的输入流对象
in = new URL(url).openStream();
// 通过Hadoop源码包提供的 IOUtils.copyBytes方法,将in中的数据源源不断地写入System.out对象中,最后在控制台打印输出
IOUtils.copyBytes(in,System.out,4096,false);
} finally {
IOUtils.closeStream(in);
}
}
}
测试URL-1.0.0.jar包

4.2.3 使用FileSystem读取文件
package com.lcf.hdfs;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
// 4.2.3 使用FileSystem读取文件
// 使用FileSystem读取sogou.500w.utf8文件数据
public class FileSystemCat {
public static void main(String[] args) throws IOException {
// 读取文件的URI地址 hdfs://master:9000/data/data
String uri = args[0];
// 获取HDFS文件系统的配置信息实例对象
Configuration configuration = new Configuration();
// 通过FileSystem自身的静态方法get()来获取HDFS文件系统实例对象
FileSystem fs = FileSystem.get(URI.create(uri), configuration);
// 定义标准的IO输入流对象
InputStream in = null;
try {
// 通过调用HDFS实例对象的open()方法打开HDFS文件输入流对象
in = fs.open(new Path(uri));
IOUtils.copyBytes(in,System.out,4096,false);
} finally {
// 关闭资源
IOUtils.closeStream(in);
}
}
}
测试Read-1.0.0.jar

4.2.4 使用FSDataOutputStream对象随机读取
package com.lcf.hdfs;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import java.io.IOException;
public class FileSystemCat1 {
public static void main(String[] args) throws IOException {
String uri = args[0];
Configuration configuration = new Configuration();
FileSystem fs = FileSystem.get(configuration);
// 定义支持随机读取数据的输入流
FSDataInputStream in = null;
try {
in = fs.open(new Path(uri));
// 定义随机取的字节偏移量(字节数),该值可以随意调整
byte[] buffer = new byte[256];
int bytesRead = 0;
while ((bytesRead = in.read(buffer)) > 0){
System.out.write(buffer,0,bytesRead);
}
} finally {
IOUtils.closeStream(in);
}
}
}
测试RandomRead-1.0.0.jar
实现文件的随意读取

4.2.5 使用FileSystem写入数据
package com.lcf.hdfs;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import java.io.*;
import java.net.URI;
// 4.2.5 使用FileSystem写入数据
public class FileCopy {
public static void main(String[] args) throws IOException {
// 本地Linux文件系统中文件路径 /home/ydh/a.txt
String localStr = args[0];
// 目标HDFS文件系统路径 hdfs://master:9000/a.txt
// 注意:HDFS中的a.txt不能事先存在
String dfs = args[1];
// 通过标准的java.io流读取本地Linux文件系统中的文件数据
InputStream in = new BufferedInputStream(new FileInputStream(localStr));
// 连接HDFS文件系统
URI uri = URI.create(dfs);
Configuration configuration = new Configuration();
// 指定将要存储从Linux文件系统中读取过来的文件,在HDFS上的存储路径
FileSystem fs = FileSystem.get(uri, configuration);
// 返回输出到HDFS文件系统的输出流FSDataOutputStream实例对象
FSDataOutputStream out = fs.create(new Path(dfs));
// 调用IOUtils工具类将Linux本地文件系统产生的输入流写入到HDFS的输出流中
IOUtils.copyBytes(in,out,4096,true);
}
}
测试WriteData-1.0.0.jar

4.2.5.1 append()方法写入数据
package com.lcf.hdfs;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URI;
// append()方法写入数据
public class CopyFileAppend {
public static void main(String[] args) throws IOException {
String localSrc = args[0];
String dist = args[1];
BufferedInputStream in = null;
try {
in = new BufferedInputStream(new FileInputStream(localSrc));
URI uri = URI.create(dist);
Configuration configuration = new Configuration();
// 设置配置信息
configuration.setBoolean("dfs.support.append",true);
configuration.set("dfs.client.block.write.replace-datanode-on-failure.policy","NEVER");
configuration.set("dfs.client.block.write.replace-datanode-on-failure.enable","true");
FileSystem fs = FileSystem.get(uri, configuration);
FSDataOutputStream out = fs.append(new Path(dist));
IOUtils.copyBytes(in,out,4096,false);
} finally {
IOUtils.closeStream(in);
}
}
}
浏览器中的效果

测试AppendData-1.0.0.jar

浏览器中的效果
追加数据之后

4.2.6 FSDataOutputStream对象批量写入
package com.lcf.hdfs;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.apache.hadoop.util.Progressable;
import java.io.IOException;
// 4.2.6 FSDataOutputStream对象批量写入
public class HdfsWriteTest {
public static void main(String[] args) throws IOException {
Configuration configuration = new Configuration();
// 获取Linux本地文件系统FileSystem实例
LocalFileSystem local = FileSystem.getLocal(configuration);
// 获取HDFS文件系统FileSystem实例
FileSystem hdfs = FileSystem.get(configuration);
// Linux本地某一文件夹路径,该文件夹下有多个文件,例如 /home/ydh/files
Path localDir = new Path(args[0]);
// 上传到HDFS的路径设置,例如 hdfs://master:9000/sum.txt,其中sum.txt不能事先存在,
// 它是未来要生成到HDFS文件系统的新文件
Path hdfsFile = new Path(args[1]);
try {
// 获取Linux本地文件下某一文件路径下面的所有文件的状态元信息
FileStatus[] inputFiles = local.listStatus(localDir);
// 调用FileSystem实例对象的create()返回一个输出流对象,准备写入HDFS
// create实参中有一个匿名对象,当create()方法执行完毕后进行回调
FSDataOutputStream out = hdfs.create(hdfsFile, new Progressable() {
@Override
public void progress() {
System.out.println("......");
}
});
// 遍历Linux本地文件下的所有文件
for (int i = 0; i < inputFiles.length; i++) {
// 打印Linux本地文件夹下的某一文件的名字
System.out.println(inputFiles[i].getPath().getName());
// 创建Linux本地文件夹下某一文件的输入流对象,读取文件内容
FSDataInputStream in = local.open(inputFiles[i].getPath());
// 自定义随机一次性读取文件的字节数
byte[] buffer = new byte[512];
int bytesRead = 0;
// 循环写入到HDFS文件系统中
while ((bytesRead = in.read(buffer)) > 0){
out.write(buffer,0,bytesRead);
}
in.close();
}
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
测试BatchWrite-1.0.0.jar

浏览器中的效果

4.2.7查询文件状态FileStatus
package com.lcf.hdfs;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.FileUtil;
import org.apache.hadoop.fs.Path;
import java.io.IOException;
// 4.2.7 查询文件状态FileStatus
public class FileStatusTest {
/**
* FileStatus类封装了文件系统中文件和目录的元数据,
* 包括文件的长度,块大小,备份,修改时间,所有者以及文件的权限等信息
* FileSystem.getFileStatus()方法可用于获取文件和目录的元数据FileStatus对象,
* 从而获取该文件的状态元信息
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
// 获取Configuration实例对象
Configuration configuration = new Configuration();
// 获取FileSystem实例对象
FileSystem fs = FileSystem.get(configuration);
// 判断文件是否存在
boolean isExists = fs.exists(new Path(args[0]));
if (isExists){
// 获取文件的状态元信息FileStatus对象
FileStatus status = fs.getFileStatus(new Path(args[0]));
// 将FileStatus对象封装成数组
FileStatus[] status2 = {status};
// 通过Hadoop提供的文件工具类FileUtil将数组内容转化为paths数组
Path[] paths = FileUtil.stat2Paths(status2);
// 遍历paths数组,获取文件路径和文件的名字等信息
for (int i = 0; i < paths.length; i++) {
System.out.println(paths[i]);
System.out.println(paths[i].getName());
}
}
}
}
测试SingleFileStatus-1.0.0.jar
查看HDFS文件系统中某个文件的状态信息内容

4.2.7.1查看某个目录下所有文件
package com.lcf.hdfs;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.FileUtil;
import org.apache.hadoop.fs.Path;
import java.io.IOException;
import java.net.URI;
// 查看HDFS文件系统中某个目录下所有文件的状态信息内容
public class ListStatus {
/**
* public abstract FileStatus[] listStatus(Path f) throws FileNotFoundException,IOException;
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
// HDFS文件系统某一路径,args数组可以包含一组文件的路径
String uri = args[0];
Configuration configuration = new Configuration();
// 获取FileSystem实例对象
FileSystem fs = FileSystem.get(URI.create(uri),configuration);
// 初始化Path数组
Path[] paths = new Path[args.length];
// 为Path数组中的元素进行赋值
for (int i = 0; i < paths.length; i++) {
paths[i] = new Path(args[i]);
}
// 调用FileSystem实例对象中的listStatus()获取一组文件的所有元数据对象
FileStatus[] status = fs.listStatus(paths);
Path[] listPaths = FileUtil.stat2Paths(status);
// 遍历输出每个文件的路径信息
for (Path path : listPaths) {
System.out.println(path);
}
}
}
测试ListFileStatus-1.0.0.jar
查看HDFS文件系统中某个目录下所有文件的状态信息内容

4.2.8 创建目录
package com.lcf.hdfs;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import java.io.IOException;
import java.net.URI;
// 4.2.8 创建目录
public class MkdirTest {
/**
* public boolean mkdirs(Path f) throws IOException {
* return mkdirs(f, FsPermission.getDirDefault());
* }
* mkdirs()方法可以一次性新建所有必要但还没有的父目录,
* 如果其目录都已经创建成功,则会返回true,
* 但通常不需要显示地创建一个目录,因为调用create()方法写入文件时,会自动创建父目录
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
Configuration configuration = new Configuration();
FileSystem fs = FileSystem.get(URI.create(args[0]),configuration);
// FileSystem实例调用创建目录的方法
fs.mkdirs(new Path(args[0])); // 例如:hdfs://master:9000/admin
}
}
测试Make-1.0.0.jar

4.2.9 删除文件与目录
package com.lcf.hdfs;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import java.io.IOException;
import java.net.URI;
// 4.2.9 删除文件与目录
public class DeleteTest {
/**
* 使用FileSystem实例的delete()方法,可以永久性删除文件目录
* public abstract boolean delete(Path f, boolean recursive) throws IOException;
*
* 注意: 如果Path指向的是一个文件或者空目录,此时 recursive 递归参数就会被忽略,
* 只有在递归参数 recursive 的值为 true 时,非空目录及其内容才会被删除,否则抛异常
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
Configuration configuration = new Configuration();
FileSystem fs = FileSystem.get(URI.create(args[0]),configuration);
fs.delete(new Path(args[0])); // 例如:hdfs://master:9000/admin
}
}
测试Delete-1.0.0.jar


浙公网安备 33010602011771号