Just Do IT !

HDFS文件接口

字数统计: 1.6k阅读时长: 7 min
2019/08/31 Share

命令基本格式:

hadoop fs -cmd < args >


  1. ls

hadoop fs -ls /

列出hdfs文件系统根目录下的目录和文件

hadoop fs -ls -R /

列出hdfs文件系统所有的目录和文件


  1. put

hadoop fs -put < local file > < hdfs file >

hdfs file的父目录一定要存在,否则命令不会执行

hadoop fs -put < local file or dir >...< hdfs dir >

hdfs dir 一定要存在,否则命令不会执行

hadoop fs -put - < hdsf file>

从键盘读取输入到hdfs file中,按Ctrl+D结束输入,hdfs file不能存在,否则命令不会执行

  1. moveFromLocal

hadoop fs -moveFromLocal < local src > ... < hdfs dst >

与put相类似,命令执行后源文件 local src 被删除,也可以从从键盘读取输入到hdfs file中

  1. copyFromLocal

hadoop fs -copyFromLocal < local src > ... < hdfs dst >

与put相类似,也可以从从键盘读取输入到hdfs file中


  1. get

hadoop fs -get < hdfs file > < local file or dir>

local file不能和 hdfs file名字不能相同,否则会提示文件已存在,没有重名的文件会复制到本地

hadoop fs -get < hdfs file or dir > ... < local dir >

拷贝多个文件或目录到本地时,本地要为文件夹路径

注意:如果用户不是root, local 路径要为用户文件夹下的路径,否则会出现权限问题,

  1. copyToLocal

hadoop fs -copyToLocal < local src > ... < hdfs dst >

与get相类似


  1. rm

hadoop fs -rm < hdfs file > ...

hadoop fs -rm -r < hdfs dir>...

每次可以删除多个文件或目录


  1. mkdir

hadoop fs -mkdir < hdfs path>

只能一级一级的建目录,父目录不存在的话使用这个命令会报错

hadoop fs -mkdir -p < hdfs path>

所创建的目录如果父目录不存在就创建该父目录


  1. getmerge

hadoop fs -getmerge < hdfs dir > < local file >

将hdfs指定目录下所有文件排序后合并到local指定的文件中,文件不存在时会自动创建,文件存在时会覆盖里面的内容

hadoop fs -getmerge -nl < hdfs dir > < local file >

加上nl后,合并到local file中的hdfs文件之间会空出一行


  1. cp

hadoop fs -cp < hdfs file > < hdfs file >

目标文件不能存在,否则命令不能执行,相当于给文件重命名并保存,源文件还存在

hadoop fs -cp < hdfs file or dir >... < hdfs dir >

目标文件夹要存在,否则命令不能执行


  1. mv

hadoop fs -mv < hdfs file > < hdfs file >

目标文件不能存在,否则命令不能执行,相当于给文件重命名并保存,源文件不存在

hadoop fs -mv < hdfs file or dir >... < hdfs dir >

源路径有多个时,目标路径必须为目录,且必须存在。

注意:跨文件系统的移动(local到hdfs或者反过来)都是不允许的


  1. count

hadoop fs -count < hdfs path >

统计hdfs对应路径下的目录个数,文件个数,文件总计大小

显示为目录个数,文件个数,文件总计大小,输入路径

HDFS JavaAPI

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
package Hdfs;

import com.sun.xml.internal.ws.api.ha.StickyFeature;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.apache.hadoop.hdfs.util.IOUtilsClient;
import org.apache.hadoop.io.IOUtils;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;

public class HdfsTest {

private static Configuration conf = new Configuration();

static {
//部署在远程服务器上的集群
conf.set("fs.defaultFS", "172.18.74.236:9000");

}


//创建新文件
public static void createFile(String dst, byte[] contents) throws IOException
{
FileSystem fs = FileSystem.get(conf);
Path dstPath = new Path(dst);//目标路径
//打开一个输出流
FSDataOutputStream outputStream = fs.create(dstPath);
outputStream.write(contents);
outputStream.close();
fs.close();
System.out.println("文件创建成功");
}

//将本地文件导入到Hdfs中
public static void uploadFile(String src,String dst) throws IOException{
//Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(conf);
Path srcPath = new Path(src); //本地上传文件路径
Path dstPath = new Path(dst); //hdfs目标路径
//调用文件系统的文件复制函数,前面参数是指是否删除原文件,true为删除,默认为false
fs.copyFromLocalFile(false, srcPath, dstPath);

//打印文件路径
System.out.println("Upload to "+conf.get("fs.default.name"));
System.out.println("------------list files------------"+"\n");
FileStatus [] fileStatus = fs.listStatus(dstPath);
for (FileStatus file : fileStatus)
{
System.out.println(file.getPath());
}
fs.close();
}

public static void upload(String src,String dst) throws IOException{
FileSystem fs = FileSystem.get(conf);

Path dstPath = new Path(dst); //hdfs目标路径
FSDataOutputStream os = fs.create(dstPath);
FileInputStream is = new FileInputStream(src);

org.apache.commons.io.IOUtils.copy(is,os);
}

//文件重命名
public static void rename(String oldName, String newName) throws IOException{
FileSystem fs = FileSystem.get(conf);

Path oldPath = new Path(oldName);
Path newPath = new Path(newName);
boolean isok = fs.rename(oldPath, newPath);
if(isok){
System.out.println("rename ok!");

}
else {
System.out.println("rename failure");
}

fs.close();
}

//删除文件
public static void delete(String filePath) throws IOException{
FileSystem fs = FileSystem.get(conf);

Path path = new Path(filePath);
boolean isok = fs.deleteOnExit(path);
if(isok){
System.out.println("delect ok");
}
else {

System.out.println("delect failure");
}

fs.close();
}

//创建目录
public static void mkdir(String path) throws IOException{

FileSystem fs = FileSystem.get(conf);

Path srcPath = new Path(path);
boolean isok = fs.mkdirs(srcPath);
if (isok){
System.out.println("create " + path + " dir ok !");

}
else{
System.out.println("create "+ path +" dir failure!");
}
fs.close();
}

//读取文件中的内容
public static void readFile(String filePath) throws IOException{
FileSystem fs = FileSystem.get(conf);

Path fielPath = new Path(filePath);
InputStream in =null;
try{
in =fs.open(fielPath);
IOUtils.copyBytes(in, System.out, 4096, false);
}
finally {
IOUtils.closeStream(in);
}
}

/**
* 遍历制定目录下的所有文件
*/
public static void getDiretoryFromHdfs(String direPath){


try {
FileSystem fs = FileSystem.get(conf);
FileStatus[] filelist = fs.listStatus(new Path(direPath));
for (int i = 0; i < filelist.length; i++){
System.out.println("______" + direPath + "目录下的所有文件_________");
FileStatus fileStatus = filelist[i];
System.out.println("Name: "+fileStatus.getPath().getName());
System.out.println("Size: "+fileStatus.getLen());
System.out.println("Path: "+ fileStatus.getPath());

}
fs.close();

} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

public static void main(String[] args) throws IOException{

String today = new SimpleDateFormat("yyyy-MM-dd").format(new Date());

String localFilePath = "C:\\Users\\Charon\\Desktop\\To do.txt";
String hdfsFilePath = "/Test" +today.substring(0,7) + "/upload_date=" + today + "/";


//1. 遍历根目录下的所有文件
getDiretoryFromHdfs("/");

//2. 新建目录
// mkdir(hdfsFilePath);

//3. 上传文件
// uploadFile(localFilePath,hdfsFilePath);
// getDiretoryFromHdfs(hdfsFilePath);

//4. 读取文件
// readFile("hdfs://172.18.74.236:9000/Test2019-05/upload_date=2019-05-26/To do.txt");

//5. 重命名
// rename("hdfs://172.18.74.236:9000/Test2019-05/upload_date=2019-05-26/To do.txt","hdfs://172.18.74.236:9000/Test2019-05/upload_date=2019-05-26/Test.txt");

//6. 创建文件,并向文件写入内容
// byte[] contents = "\n2019年5月26日20:22:37 添加写入内容\n".getBytes();
// createFile("hdfs://172.18.74.236:9000/Test2019-05/upload_date=2019-05-26/Test1.txt",contents);
// readFile("hdfs://172.18.74.236:9000/Test2019-05/upload_date=2019-05-26/Test1.txt");

//7. 删除文件
delect(hdfsFilePath);
}
CATALOG
  1. 1. 命令基本格式:
  2. 2. HDFS JavaAPI