hdfs客户端操作也就是在idea等环境也可以使用hdfs的一些命令,挑出一些常见的命令列出来:
文件操作
create 写文件
open 读取文件
delete 删除文件
目录操作
mkdirs 创建目录
delete 删除文件或目录
listStatus 列出目录的内容
getFileStatus 显示文件系统的目录和文件的元数据信息
getFileBlockLocations 显示文件存储位置
需要导入的依赖如下:
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>2.7.6</version>
<!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-common -->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>2.7.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-client -->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.7.6</version>
</dependency>
1.连接客户端
导入的包非常容易出错,除了使用URI外都是hadoop里面的包
我这里的写的是删除根目录文件下的output文件夹,后面跟上的true表示迭代删除
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import java.net.URI;
public class hadoopAPI {
public static void main(String[] args) throws Exception{
//使用9000端口号,50070是客户端的端口号
URI uri = new URI("hdfs://master:9000");
//获取hadoop的hdfs配置文件,只要new出来就算获取成功,利用conf对象就可以修改配置
Configuration conf = new Configuration();
//举个例子,使用conf对象设置副本数量为1
conf.set("dfs.replication","1");
//获取文件系统对象fs,利用fs来对hdfs中的文件进行操作
FileSystem fs = FileSystem.get(uri,conf);
fs.delete(new Path("/output"),true);
}
浏览器输入master:50070 进入文件系统,发现output文件确实被删除了
//根目录下创建一个test文件夹
fs.mkdirs(new Path("/test"));
//返回根目录的内容
FileStatus[] fileStatuses = fs.listStatus(new Path("/"));
for (FileStatus fileStatus : fileStatuses) {
System.out.println(fileStatus);
}
返回了很多文件的相关属性,所以我们还可以通过上面的遍历获得一些属性,给出2个例子
//迭代获取文件大小
for (FileStatus fileStatus : fileStatuses) {
System.out.println(fileStatus.getlength());
}
//获取文件分区大小
for (FileStatus fileStatus : fileStatuses) {
System.out.println(fileStatus.getBlockSize());
}
获取单个文件的属性,这里演示给就给3个了,还有其他的可以自己试试
FileStatus fileStatus = fs.getFileStatus(new Path("/student.txt"));
fileStatus.getLen();//获取文件大小
fileStatus.getBlockSize();//获取分区大小
fileStatus.getGroup();//获取分组信息
读取hdfs文件的内容
FSDataInputStream open = fs.open(new Path("/student.txt"));
BufferedReader br = new BufferedReader(new InputStreamReader(open));
String line=null;
while((line=br.readLine())!=null){
System.out.println(line);
}
br.close();
open.close();
截取部分结果:
创建文件并传入内容,这里给的一定要是文件路径,
FSDataOutputStream fsDataOutputStream = fs.create(new Path("/test/a.txt"));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fsDataOutputStream));
bw.write("hello");
bw.write("\t");
bw.write("world");
bw.close();
fsDataOutputStream.close();
下载查看hdfs中的内容
上传文件,没有什么好说的注意路径不要给反掉了
Path hdfs = new Path("/");//hdfs的路径
Path local = new Path("E:\\ideaFile\\code\\a.txt");//本地文件的路径
fs.copyFromLocalFile(local,hdfs);
下载文件
这里方法最后加上的true和false是权限验证
Path path = new Path("/studnet.txt");
Path local = new Path("E:\\ideaFile\\code\\test");
fs.copyToLocalFile(false,path,local,true);