java链接hdfs的工具类
时间: 2023-08-15 08:08:50 浏览: 90
你可以使用以下代码来链接HDFS:
```java
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://<HDFS_HOST>:<HDFS_PORT>");
FileSystem fs = FileSystem.get(conf);
```
其中 `<HDFS_HOST>` 和 `<HDFS_PORT>` 分别是你的HDFS主机名和端口号。你可以使用`fs`对象来执行HDFS文件系统操作,例如:
```java
Path path = new Path("/path/to/file");
FSDataInputStream inputStream = fs.open(path);
// 读取文件内容
byte[] buffer = new byte[1024];
int bytesRead = inputStream.read(buffer);
while (bytesRead > 0) {
// 处理读取的数据
...
bytesRead = inputStream.read(buffer);
}
inputStream.close();
```
相关问题
hadoop封装hdfs工具类
Hadoop是一个开源的框架,它允许使用简单的编程模型跨计算机集群分布式处理大数据。Hadoop的核心是HDFS(Hadoop Distributed File System),这是一个高度容错的系统,适合在廉价硬件上存储大数据。封装HDFS工具类通常是为了简化与HDFS的交互,使其更加方便和高效。一个典型的封装类可能会包含如下功能:
1. 连接和配置HDFS:设置Hadoop的配置参数,初始化FileSystem实例。
2. 文件操作:包括但不限于创建目录、列出文件、删除文件或目录、重命名文件、读写文件等。
3. 文件状态检查:获取文件或目录的元数据,比如大小、权限、复制因子等。
4. 错误处理:封装异常处理逻辑,处理常见的I/O异常,使上层调用更加清晰。
5. 资源管理:确保打开的资源被正确关闭,比如文件流、连接等。
在Java中,可以使用Hadoop提供的API来实现这样一个工具类。以下是一个简单的封装工具类的示例代码:
```java
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.util.Progressable;
import java.io.Closeable;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URI;
public class HdfsUtil implements Closeable {
private FileSystem fs;
private Configuration conf;
public HdfsUtil(String hdfsUri, String user) throws IOException {
conf = new Configuration();
conf.set("fs.defaultFS", hdfsUri);
fs = FileSystem.get(URI.create(hdfsUri), conf, user);
}
public void uploadFile(File src, String dst) throws IOException {
Path dstPath = new Path(dst);
Path srcPath = new Path(src.getPath());
fs.copyFromLocalFile(srcPath, dstPath);
}
public void downloadFile(String src, File dst) throws IOException {
Path dstPath = new Path(dst.getPath());
Path srcPath = new Path(src);
fs.copyToLocalFile(srcPath, dstPath);
}
// 更多的封装方法可以在这里实现,比如列出目录下的文件,删除文件等
@Override
public void close() throws IOException {
IOUtils.closeStream(fs);
}
}
```
使用此类时,你可以这样操作:
```java
public class HdfsExample {
public static void main(String[] args) {
try (HdfsUtil hdfsUtil = new HdfsUtil("hdfs://namenode:8020", "user")) {
hdfsUtil.uploadFile(new File("localfile.txt"), "/user/hadoop/uploadedfile.txt");
hdfsUtil.downloadFile("/user/hadoop/uploadedfile.txt", new File("localfile_download.txt"));
} catch (IOException e) {
e.printStackTrace();
}
}
}
```
Java连接hdfs下载目录下文件成压缩包的工具类
你可以使用以下代码将HDFS目录下的文件打包成压缩包并下载:
```java
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.io.compress.CompressionCodec;
import org.apache.hadoop.io.compress.CompressionOutputStream;
import org.apache.hadoop.io.compress.GzipCodec;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URI;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public class HdfsZipDownloadUtil {
public static void downloadAsZip(String hdfsPath, String localPath) throws Exception {
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(URI.create(hdfsPath), conf);
Path srcPath = new Path(hdfsPath);
ZipOutputStream zos = new ZipOutputStream(fs.create(new Path(localPath)));
// 使用压缩算法
CompressionCodec codec = new GzipCodec();
CompressionOutputStream cos = codec.createOutputStream(zos);
// 遍历目录下所有文件并压缩
for (Path path : FileUtil.stat2Paths(fs.listStatus(srcPath))) {
if (fs.isFile(path)) {
String fileName = path.getName();
ZipEntry zipEntry = new ZipEntry(fileName);
zos.putNextEntry(zipEntry);
InputStream inputStream = fs.open(path);
IOUtils.copyBytes(inputStream, cos, conf);
inputStream.close();
zos.closeEntry();
}
}
cos.finish();
cos.close();
zos.close();
}
}
```
其中,`hdfsPath`是要下载的HDFS目录路径,`localPath`是要保存到本地的文件路径。该方法会将目录下所有文件打包成 `.zip` 格式的压缩包并保存到本地。你可以按照需要修改压缩算法和保存的文件格式。