首先吐槽一句,CDH真的太难搭建了,里面各种小细节,一步错了,就会导致各种问题,不管怎么说,反正踩了各种坑,把CDH搭建起来了。下面来介绍一下如何测试HDFS的功能吧。。
我这里使用maven去测试,首先安装依赖
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.7.2</version>
</dependency>
<!--HDFS-->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>2.7.2</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>2.7.2</version>
</dependency>
然后测试文件,
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.net.URI;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.util.Progressable;
import org.junit.Before;
import org.junit.Test;
/**
*@ClassName Test
*@Description TODO
*@Author luziyuan
*@Date 2021-07-26 22:08
*@Version 1.0
**/
public class TestHdfs {
FileSystem fs = null;
@Before
// 初始化HDFS
public void init() throws Exception
{
// 配置文件 默认加载src下的配置文件
Configuration conf = new Configuration();
// conf.set("fs.defaultFS", "hdfs://master:9000");
// 生成一个文件系统客户端操作对象
// fs = FileSystem.get(conf);
// 第一个参数是URI指明了是hdfs文件系统 第二个参数是配置文件 第三个参数是指定用户名 需要与hadoop用户名保持一致
fs = FileSystem.get(new URI("hdfs://ip:8020"), conf, "hdfs");
}
@Test
// 创建新的文件夹
public void mkdir() throws Exception
{
Path path = new Path("/hello");
fs.mkdirs(path);
// 关闭
fs.close();
}
@Test
// 上传文件
//这个如果重名话会覆盖
public void upload() throws Exception
{
// 第一个参数是本地windows下的文件路径 第二个参数是hdfs的文件路径
fs.copyFromLocalFile(new Path("/Users/luziyuan/Desktop/跨域测试.html"), new Path("/hello"));
// 关闭
fs.close();
}
/**
* 拷贝大文件到HDFS文件系统:带进度
*/
@Test
public void copyFromLocalBigFile() throws Exception {
//本地
InputStream in = new BufferedInputStream(new FileInputStream(new File("/Users/luziyuan/Desktop/oracle-j2sdk1.8-1.8.0+update181-1.x86_64.rpm")));
//hdfs
FSDataOutputStream out = fs.create(new Path("/hello/jdk.rpm"),
new Progressable() {
public void progress() {
System.out.print(".");
}
});
IOUtils.copyBytes(in, out ,4096);
}
//创建文件夹
@Test
public void create()throws Exception {
// FSDataOutputStream out = fileSystem.create(new Path("/hdfsapi/test/a.txt"));
FSDataOutputStream out = fs.create(new Path("/hello/aaa.txt"));
out.writeUTF("hello pk: replication 1");
out.flush();
out.close();
}
//重命名文件
@Test
public void rename() throws Exception {
Path oldPath = new Path("/hello/jdk.rpm");
Path newPath = new Path("/hello/jdk111.rpm");
boolean result = fs.rename(oldPath, newPath);
System.out.println(result);
}
/**
* 查看文件块信息因为他是分布式的文件系统。上传一个文件以后
* 10.1.100.103:9866 : 0 : 2073 : [Ljava.lang.String;@5ddcc487
* 10.1.100.102:9866 : 0 : 2073 : [Ljava.lang.String;@5ddcc487
* 10.1.100.101:9866 : 0 : 2073 : [Ljava.lang.String;@5ddcc487
*/
@Test
public void getFileBlockLocations() throws Exception {
FileStatus fileStatus = fs.getFileStatus(new Path("/hello/跨域测试.html"));
BlockLocation[] blocks = fs.getFileBlockLocations(fileStatus,0,fileStatus.getLen());
for(BlockLocation block : blocks) {
for(String name: block.getNames()) {
System.out.println(name +" : " + block.getOffset() + " : " + block.getLength() + " : " + block.getHosts());
}
}
}
/**
* 拷贝HDFS文件到本地:下载
*/
@Test
public void copyToLocalFile() throws Exception {
//hdfs
Path src = new Path("/hello/购课数据.xls");
//本地
Path dst = new Path("/Users/luziyuan/Desktop/答案");
fs.copyToLocalFile(src, dst);
}
/**
* 递归查看目标文件夹下的所有文件
*/
@Test
public void listFilesRecursive() throws Exception {
RemoteIterator<LocatedFileStatus> files = fs.listFiles(new Path("/hello"), true);
while (files.hasNext()) {
LocatedFileStatus file = files.next();
String isDir = file.isDirectory() ? "文件夹" : "文件";
String permission = file.getPermission().toString();
short replication = file.getReplication();
long length = file.getLen();
String path = file.getPath().toString();
System.out.println(isDir + "\t" + permission
+ "\t" + replication + "\t" + length
+ "\t" + path
);
}
}
//删除文件,删除文件夹
@Test
public void delete() throws Exception {
boolean result = fs.delete(new Path("/hello"), true);
System.out.println(result);
}
}
然后相信你已经测试完了,发现hdfs就是一个分布式的文件系统, 还有个小坑,测试时不要使用root用户,否则会告诉你权限不够没有写的权限,当然也有解决方案,可以上网搜索一下。
CDH搭建好的hadoop java连接hdfs默认端口是8020,不要搞错了
如果解决你的问题, 帮我点个赞吧。
|