搭建 hadoop 3.1.2 独立模式,单节点和多节点伪分布式安装与使用
在resource文件夹下放入core-site.xml和hdfs-site.xml
添加依赖
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>3.1.2</version>
</dependency>
FileSystem是一个通用的文件系统api
Configuration对象封装了客户端和服务器的配置,通过设置配置文件读取类路径来实现。
public class HdfsTest {
private static Configuration conf;
private static FileSystem fs;
static{
try {
//读取core-site.xml和hdfs-site.xml
conf = new Configuration();
fs = FileSystem.newInstance(conf);
} catch (IOException e) {
e.printStackTrace();
}
//在jvm关闭时执行,关闭fs
Runtime.getRuntime().addShutdownHook(new Thread(){
@Override
public void run(){
try{
fs.close();
}catch (IOException e) {
e.printStackTrace();
}
}
});
}
/**
* 文件夹或文件是否存在
*/
@Test
public void isDirOrFileExist(){
Path path = new Path("/browerTest");
try{
System.out.println("isDirOrFileExist : " + fs.exists(path));
}catch (IOException e){
e.printStackTrace();
}
}
/**
* 提示权限不足,因为读取的事本机的用户名
* 解决1:使用 FileSystem.newInstance(new URI("hdfs://hadoop-master:9000"),conf,"hadoop"); 指定用户
* 解决2:系统环境变量添加HADOOP_USER_NAME 为 hadoop
*/
@Test
public void mkDirs(){
Path path = new Path("/test/test1/test2");
try{
System.out.println("mkDirs : " + fs.mkdirs(path));
}catch (IOException e){
e.printStackTrace();
}
}
/**
* 创建空文件,没有指定备份数量,默认三份
*/
@Test
public void mkFile(){
Path path = new Path("/test/test1/test2/test2.txt");
try(
FSDataOutputStream os = fs.create(path);
){
}catch (IOException e){
e.printStackTrace();
}
}
/**
* 上传本地文件
*/
@Test
public void uploadFileFromLocal(){
Path src = new Path("D:\\input335M.txt");
Path dst = new Path("/upload/test.txt");
try{
fs.copyFromLocalFile(src, dst);
}catch (IOException e){
e.printStackTrace();
}
}
/**
* 文件下载
* copyToLocalFile需要windows安装hadoop环境,简单点用IOUtils.copyBytes
* IOUtils.copyBytes true会关闭输入输出流
*/
@Test
public void downloadFileToLocal(){
try{
FSDataInputStreamin = fs.open(new Path("/upload/test.txt"));
FileOutputStream out = new FileOutputStream("D:\\download.txt");
IOUtils.copyBytes(in, out, 4096, true);
}catch (IOException e){
e.printStackTrace();
}
}
/**
* 文件夹或文件重命名,和同级的移动
*/
@Test
public void mvDirOrFile(){
Path src = new Path("/test/test1/test2/test2.txt");
Path dst = new Path("/test/test1/test2/test2Rename.txt");
try{
fs.rename(src, dst);
}catch (IOException e){
e.printStackTrace();
}
}
/**
* 复制文件或文件夹
* 文件夹会把文件夹下的文件都复制
*/
@Test
public void cpDirOrFile(){
Path src = new Path("/test/test1/test2");
Path dst = new Path("/cp");
try {
FileUtil.copy(src.getFileSystem(conf), src, dst.getFileSystem(conf), dst, false, conf);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 删除文件夹或文件
* true是相当于rm -r,删除文件夹下的文件
*/
@Test
public void rmDirOrFile(){
Path path = new Path("/test/test1/test2");
try{
fs.delete(path,true);
}catch (IOException e){
e.printStackTrace();
}
}
/**
* 列出当前dataNode
*/
@Test
public void listDataNode(){
try{
DistributedFileSystem hdfs = (DistributedFileSystem) fs;
for(DatanodeInfo datanodeInfo : hdfs.getDataNodeStats()){
System.out.println(datanodeInfo.getHostName() + " " + datanodeInfo.getName());
}
} catch (IOException e){
e.printStackTrace();
}
}
}
参考:
hadoop的客户端调用问题