首先要在Win10这边配置JDK和Hadoop的环境变量
其次要配置IDEA中Maven和JDK
上述配置都要注意版本号之间要对应上!
具体可见以下视频配置:
IDEA设置
Windows的Hadoop配置
小技巧:
- 关于异常的处理:
“给别人写方法时就抛出异常,用别人写的方法一定要处理”
给别人写方法——>实现功能性——>抛出异常
用别人的方法——>实现业务逻辑——>处理异常 - 在虚拟机的linux的终端中,输入:
sz file
,可以直接从虚拟机上复制文件到宿主机Win10上 - 在IDEA中输入
iter
快捷键,可以自动补全增强for循环的代码
HDFS的API操作: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
130package com.atguigu.hdfsclient;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.apache.hadoop.io.IOUtils;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URI;
public class HDFSClient {
private FileSystem fs;
@Before
public void before() throws IOException, InterruptedException {
//使用默认的Configuration,默认副本数是3
fs = FileSystem.get(URI.create("hdfs://hadoop101:9000"), new Configuration(), "hadoop");
System.out.println("Before");
}
@Test
//上传
public void put() throws IOException, InterruptedException {
//获取一个HDFS的抽象封装对象
//自定义Configuration
Configuration configuration = new Configuration();
//configuration.setInt("dfs.replication",1);
//使用Configuration的顺序:
/**
* 1.显式的代码设置
* 2.resource文件夹中的配置文件
* 3.默认配置文件
*/
FileSystem fileSystem = FileSystem.get(URI.create("hdfs://hadoop101:9000"),configuration,"hadoop");
//用这个对象操作文件系统
//上传
fileSystem.copyFromLocalFile(new Path("f:/1.txt"),new Path("/2.txt"));
//fs.copyFromLocalFile(new Path("f:\\test"),new Path("/"));
//关闭文件系统
//fileSystem.close();
}
@Test
//下载
public void get() throws IOException {
fs.copyToLocalFile(new Path("/output"),new Path("f:\\"));
}
@Test
//重命名
public void rename() throws IOException {
boolean rename = fs.rename(new Path("/test"), new Path("/test2"));
if(rename)
System.out.println("改名成功");
}
@Test
//删除
public void delete() throws IOException {
boolean delete = fs.delete(new Path("/test"), true);
if(delete)
System.out.println("删除成功");
else
System.out.println("删除失败");
}
@Test
//文件中添加内容
public void copyStream() throws IOException {
FSDataOutputStream append = fs.append(new Path("/test2/1.txt"),1024);
FileInputStream in = new FileInputStream("F:\\1.txt");
IOUtils.copyBytes(in,append,1024,true);
}
@Test
//类似ls命令,查看文件目录内容
public void ls() throws IOException {
FileStatus[] fileStatuses = fs.listStatus(new Path("/"));
for (FileStatus fileStatus : fileStatuses) {
if(fileStatus.isFile()){
System.out.println("以下信息是一个文件");
System.out.println(fileStatus.getPath());
System.out.println(fileStatus.getLen());
}else{
System.out.println("这是一个文件夹");
System.out.println(fileStatus.getPath());
}
}
}
@Test
//可以查看多层目录下的文件,注意是文件,只有文件才会有block的说法
public void listFiles() throws IOException {
RemoteIterator<LocatedFileStatus> files = fs.listFiles(new Path("/"), true);
while(files.hasNext()){
LocatedFileStatus file = files.next();
System.out.println("=================================");
System.out.println(file.getPath());
//获取块信息
BlockLocation[] blockLocations = file.getBlockLocations();
System.out.println("块信息");
for (BlockLocation blockLocation : blockLocations) {
String[] hosts = blockLocation.getHosts();
System.out.println("块在");
for (String host : hosts) {
System.out.print(host + " ");
}
}
System.out.println();
}
}
@After
public void after() throws IOException {
System.out.println("After!!");
fs.close();
}
}