IDE远程管理HDFS
1. 概述
通常情况下,我们在IDE(集成开发环境)中使用Java、Python等编程语言对Hadoop进行操作。本文将介绍如何利用IDE工具实现HDFS文件系统的管理和操作。
2. 添加依赖
为了确保兼容性,建议添加的Hadoop相关依赖包版本与您的Hadoop服务器版本保持一致。具体的依赖配置代码可以参考其他相关文档或文章。
3. 获取文件系统对象
首先,我们需要通过Hadoop客户端API获取文件系统对象,这是执行所有HDFS操作的基础。
package org.shell;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import java.io.IOException;
public class testGetFileSystem {
public void testGetFileSystem() throws IOException {
//1.创建配置对象,?于加载配置信息(四个默认的配置?件:core-default.xml,hdfs-default.xml
//,mapred-default.xml,yarn-default.xml)
Configuration conf = new Configuration();
//2.修改fs.defaultFS属性的值
conf.set("fs.defaultFS","hdfs://192.168.215.130:9820");
//3.使?FileSystem类的静态?法get(Configuration conf),返回fs.defaultFS定义的?件系统
FileSystem fs = FileSystem.get(conf);
System.out.println("?件系统对象的类型名:"+fs.getClass().getName());
}
public static void main(String[] args) throws IOException {
testGetFileSystem test = new testGetFileSystem();
test.testGetFileSystem();
}
}
4. 文件上传
使用Hadoop API可以轻松地将本地文件上传到HDFS中,以下示例展示了如何实现这一功能。
package org.shell;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import java.io.IOException;
public class testFileUpload {
public void testFileUpload() throws IOException {
// 在修改HDFS的?件的时候,如果出现权限不?的情况,可以修改操作HDFS的?户
System.setProperty("HADOOP_USER_NAME", "root");
Configuration conf = new Configuration();
conf.set("fs.defaultFS","hdfs://192.168.215.130:9820");
FileSystem fs = FileSystem.get(conf);
//将本地的?个?件E:/file1,上传到HDFS上 /file1
//1.使?Path描述两个?件
Path localPath = new Path("F:/file1.txt");
Path hdfsPath = new Path("/file1");
//2.调?上传?法
fs.copyFromLocalFile(localPath,hdfsPath);
//3.关闭
fs.close();
System.out.println("上传成功");
}
public static void main(String[] args) throws IOException {
testFileUpload test = new testFileUpload();
test.testFileUpload();
}
}
5. 文件下载
从HDFS下载文件到本地同样简单,下面的代码片段演示了这一过程。
package org.shell;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import java.io.IOException;
public class testFileDownload {
public void testFileDownload() throws IOException {
// 在修改HDFS的?件的时候,如果出现权限不?的情况,可以修改操作HDFS的?户
System.setProperty("HADOOP_USER_NAME", "root");
Configuration conf = new Configuration();
conf.set("fs.defaultFS","hdfs://192.168.215.130:9820");
FileSystem fs = FileSystem.get(conf);
//从HDFS上下载?个?件/file1,下载到本地 F:/file2
//1.使?Path描述两个?件
Path hdfsfile = new Path("/file1");
Path local = new Path("F:/file2.txt");
//2.调?下载?法进?下载
fs.copyToLocalFile(hdfsfile,local);
fs.close();
System.out.println("下载成功");
}
public static void main(String[] args) throws IOException {
testFileDownload test = new testFileDownload();
test.testFileDownload();
}
}
6. 创建目录
在HDFS中创建新目录是常见的操作之一,这里提供了相应的代码示例。
package org.shell;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import java.io.IOException;
public class testMkdir {
public void testMkdir() throws IOException {
// 在修改HDFS的?件的时候,如果出现权限不?的情况,可以修改操作HDFS的?户
System.setProperty("HADOOP_USER_NAME", "root");
Configuration conf = new Configuration();
conf.set("fs.defaultFS","hdfs://192.168.215.130:9820");
FileSystem fs = FileSystem.get(conf);
//1.测试创建?录,描述?个?录
Path hdfsfile = new Path("/dir1");
//2.调?创建?录的?法
fs.mkdirs(hdfsfile);
fs.close();
System.out.println("创建成功");
}
public static void main(String[] args) throws IOException {
testMkdir test = new testMkdir();
test.testMkdir();
}
}
7. 删除目录
当不再需要某个目录时,可以通过Hadoop API将其删除。以下是删除目录的具体方法。
package org.shell;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import java.io.IOException;
public class testDelete {
public void testDelete() throws IOException {
// 在修改HDFS的?件的时候,如果出现权限不?的情况,可以修改操作HDFS的?户
System.setProperty("HADOOP_USER_NAME", "root");
Configuration conf = new Configuration();
conf.set("fs.defaultFS","hdfs://192.168.215.130:9820");
FileSystem fs = FileSystem.get(conf);
//1.测试删除?录,描述?个?录
Path hdfsfile = new Path("/dir1");
//2.调?创建?录的?法
fs.delete(hdfsfile,true);
fs.close();
System.out.println("删除成功");
}
public static void main(String[] args) throws IOException {
testDelete test = new testDelete();
test.testDelete();
}
}
8. 文件重命名
在HDFS中对文件进行重命名也是可行的,下面的代码展示了如何执行文件重命名操作。
package org.shell;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import java.io.IOException;
public class testRename {
public void testRename() throws IOException {
// 在修改HDFS的?件的时候,如果出现权限不?的情况,可以修改操作HDFS的?户
System.setProperty("HADOOP_USER_NAME", "root");
Configuration conf = new Configuration();
conf.set("fs.defaultFS","hdfs://192.168.215.130:9820");
FileSystem fs = FileSystem.get(conf);
//1.测试重命名,将file1改为file01
Path oldName = new Path("/file1");
Path newName = new Path("/file01");
//2.调?重命名?法
fs.rename(oldName,newName);
fs.close();
System.out.println("命名成功");
}
public static void main(String[] args) throws IOException {
testRename test = new testRename();
test.testRename();
}
}
9. 使用IOUtil上传文件
除了直接使用Hadoop API,还可以借助IOUtil类来简化文件上传的过程。下面是一个使用IOUtil上传文件的例子。
package org.shell;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
public class testPutFile {
public void testPutFile() throws IOException, URISyntaxException {
FileSystem fs = null;
FileInputStream input = null;
FSDataOutputStream out = null;
try {
// 在修改HDFS的?件的时候,如果出现权限不?的情况,可以修改操作HDFS的?户
System.setProperty("HADOOP_USER_NAME", "root");
// 1.连接HDFS?件系统
Configuration conf = new Configuration();
// 2.创建输?流,读取输??件
File file = new File("F://a.txt");
input = new FileInputStream(file);
// 3.获得?件系统
fs = FileSystem.get(new URI("hdfs://192.168.215.130:9820"), conf);
// 4.创建输出流
out = fs.create(new Path("/gg.txt"));
// 5.IO流拷?
IOUtils.copyBytes(input, out, 4096, false); // 第三个参数是缓冲区??,第四个参数指定是否关闭流
System.out.println("上传完毕");
} catch (IOException | URISyntaxException e) {
e.printStackTrace();
} finally {
// 6.关闭资源
IOUtils.closeStream(input);
IOUtils.closeStream(out);
if (fs != null) {
try {
fs.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) throws IOException, URISyntaxException {
testPutFile test = new testPutFile();
test.testPutFile();
}
}
10. 使用IOUtil下载文件
同样地,使用IOUtil也可以方便地从HDFS下载文件。以下是使用IOUtil下载文件的示例代码。
package org.shell;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
public class testGetFile {
public void testGetFile() throws IOException, URISyntaxException {
// 在修改HDFS的?件的时候,如果出现权限不?的情况,可以修改操作HDFS的?户
System.setProperty("HADOOP_USER_NAME", "root");
// 1.连接HDFS?件系统
Configuration conf = new Configuration();
// 2.获得?件系统
FileSystem fs = FileSystem.get(new URI("hdfs://192.168.215.130:9820"), conf);
// 3.获取输?流,从HDFS上读取
FSDataInputStream input=fs.open(new Path("/file01"));
// 4.获取输出流
FileOutputStream out=new FileOutputStream(new File("F://gg.txt"));
// 5.流拷?
IOUtils.copyBytes(input, out, conf);
// 6.关闭流
IOUtils.closeStream(input);
IOUtils.closeStream(out);
System.out.println("下载完成");
}
public static void main(String[] args) throws IOException, URISyntaxException {
testGetFile test = new testGetFile();
test.testGetFile();
}
}
11. 查看文件状态
了解HDFS中文件的状态信息对于管理和维护文件非常重要。下面的代码示例说明了如何查看文件的状态。
package org.shell;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.RemoteIterator;
import org.apache.hadoop.fs.LocatedFileStatus;
import org.apache.hadoop.fs.BlockLocation;
import java.io.IOException;
import java.util.Arrays;
public class testFileStatus {
public void testFileStatus() throws IOException {
// 在修改HDFS的?件的时候,如果出现权限不?的情况,可以修改操作HDFS的?户
System.setProperty("HADOOP_USER_NAME", "root");
Configuration conf = new Configuration();
conf.set("fs.defaultFS","hdfs://192.168.215.130:9820");
FileSystem fs = FileSystem.get(conf);
//1.描述你要读取的?件 /file02
Path path = new Path("/file01");
//获取?件的状态信息
RemoteIterator<LocatedFileStatus> it = fs.listLocatedStatus(path);
while(it.hasNext()){
// 取出对象
LocatedFileStatus status = it.next();
System.out.println("name:"+status.getPath());
//获取位置
BlockLocation[] locate = status.getBlockLocations();
for(BlockLocation bl:locate){
System.out.println("当前块的所有副本位置:"+Arrays.toString(bl.getHosts()));
System.out.println("当前块??:"+bl.getLength());
System.out.println("当前块的副本的ip地址信息:"+ Arrays.toString(bl.getNames()));
}
System.out.println("系统的块??:"+status.getBlockSize());
System.out.println("?件总?度:"+status.getLen());
}
}
public static void main(String[] args) throws IOException {
testFileStatus test = new testFileStatus();
test.testFileStatus();
}
}

雷达卡


京公网安备 11010802022788号







