hdfs java API

本文提供了一个HDFS操作的Java示例程序,演示了如何通过Java API进行目录创建、文件上传、重命名、删除等基本操作,并展示了如何查找文件块位置及获取节点信息。
package com.hadoop.hdfs;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.BlockLocation;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.hdfs.DistributedFileSystem;
import org.apache.hadoop.hdfs.protocol.DatanodeInfo;
import org.apache.hadoop.io.IOUtils;

public class HdfsPractise {
	public static void main(String[] args) throws IOException {
		//makeDir();
		//touchFile();
		//uploadFromLocal();
		//reName();
		//delFile();
		//searchBlock();
		//getNodeInfo();
	}
	
	private static void makeDir() throws IOException {
		Configuration conf = new Configuration();
		conf.set("fs.defaultFS", "hdfs://118.192.153.114:8020");
		FileSystem fs = FileSystem.get(conf);
		if(!fs.exists(new Path("/test4"))) {
			fs.mkdirs(new Path("/test4"));
		}
	}
	private static void touchFile() throws IOException {
		Configuration conf = new Configuration();
		conf.set("fs.defaultFS", "hdfs://118.192.153.114:8020");
		FileSystem fs = FileSystem.get(conf);
		//fs.setReplication(new Path("/test1"), (short) 1);
		FSDataOutputStream out = fs.create(new Path("/test2/sample_age_data.txt"));
		FileInputStream in = new FileInputStream("d:\\sample_age_data.txt");
		IOUtils.copyBytes(in, out, 1024, true);
	}
	private static void uploadFromLocal() throws IOException {
		Configuration conf = new Configuration();
		conf.set("fs.defaultFS", "hdfs://118.192.153.114:8020");
		FileSystem fs = FileSystem.get(conf);
		fs.copyFromLocalFile(new Path("d:\\sample_age_data.txt"), new Path("/test2"));
	}
	private static void reName() throws IOException {
		Configuration conf = new Configuration();
		conf.set("fs.defaultFS", "hdfs://118.192.153.114:8020");
		FileSystem fs = FileSystem.get(conf);
		fs.rename(new Path("/test2/sample_age_data.txt"), new Path("/test2/fff"));
	}
	private static void delFile() throws IOException {
		Configuration conf = new Configuration();
		conf.set("fs.defaultFS", "hdfs://118.192.153.114:8020");
		FileSystem fs = FileSystem.get(conf);
		fs.delete(new Path("/test2"), true);
	}
	private static void searchBlock() throws IOException {
		Configuration conf = new Configuration();
		conf.set("fs.defaultFS", "hdfs://118.192.153.114:8020");
		FileSystem fs = FileSystem.get(conf);
		FileStatus fst = fs.getFileStatus(new Path("/test1/aaa.txt"));
	    BlockLocation[] bls=fs.getFileBlockLocations(fst, 0, fst.getLen());
	    for (int i = 0,h=bls.length; i < h; i++) {
	        String[] hosts= bls[i].getHosts();
	        System.out.println("block_"+i+"_location:  "+hosts[0]);
	    }
	}
	private static void getNodeInfo() throws IOException {
		Configuration conf = new Configuration();
		conf.set("fs.defaultFS", "hdfs://118.192.153.114:8020");
		
		FileSystem fs = FileSystem.get(conf);
		DistributedFileSystem hdfs = (DistributedFileSystem) fs;
	    DatanodeInfo[] dns=hdfs.getDataNodeStats();
	    for (int i = 0,h=dns.length; i < h; i++) {
	        System.out.println("datanode_"+i+"_name:  "+dns[i].getHostName());
	    }
	}
	
}

  

转载于:https://www.cnblogs.com/water-sky/p/5752971.html

### HDFS Java API 使用指南与开发示例 Hadoop 分布式文件系统(HDFS)是 Hadoop 生态中的核心组件之一,提供了高吞吐量的数据访问能力,适用于大规模数据集的存储和处理。在实际开发中,使用 HDFSJava API 可以实现对 HDFS 文件系统的各种操作,如创建目录、上传文件、下载文件、读取和写入数据等。 #### 1. 配置 Hadoop 环境 在进行 HDFS Java API 开发之前,需要确保本地环境已正确配置 Hadoop 和 Java。常见的问题包括: - **Java 版本兼容性**:Hadoop 对 Java 版本有特定要求,通常推荐使用 Java 8 或 Java 11。如果使用了不兼容的版本,可能会导致运行时错误或类加载失败。 - **环境变量设置**:需要正确设置 `JAVA_HOME` 和 `HADOOP_HOME` 环境变量,并将 Hadoop 的可执行文件路径添加到 `PATH` 中[^1]。 #### 2. 初始化 FileSystem 实例 所有 HDFS 操作都通过 `FileSystem` 类完成。可以通过以下方式初始化一个 `FileSystem` 实例: ```java private static final String HDFS_PATH = "hdfs://192.168.0.106:8020"; private static final String HDFS_USER = "root"; private static FileSystem fileSystem; @Before public void prepare() { try { Configuration configuration = new Configuration(); configuration.set("dfs.replication", "1"); // 设置副本数为1 fileSystem = FileSystem.get(new URI(HDFS_PATH), configuration, HDFS_USER); } catch (IOException | InterruptedException | URISyntaxException e) { e.printStackTrace(); } } ``` 该方法使用 JUnit 的 `@Before` 注解,在每个测试用例执行前建立与 HDFS 的连接[^5]。 #### 3. 常见 HDFS 操作示例 ##### 创建目录 可以使用 `fileSystem.mkdirs()` 方法创建多级目录: ```java @Test public void createDirectory() throws IOException { Path path = new Path("hdfs://hadoop00:9000/user/root/HDFSAPI/testdir"); boolean isCreated = fileSystem.mkdirs(path); System.out.println("Directory created: " + isCreated); } ``` ##### 写入文件 使用 `FSDataOutputStream` 类可以向 HDFS 文件中写入数据: ```java @Test public void writeFile() throws IOException { Path path = new Path("hdfs://hadoop00:9000/user/root/HDFSAPI/test/hello.txt"); FSDataOutputStream output = fileSystem.create(path); output.write("hello world".getBytes()); output.flush(); output.close(); } ``` 此代码会在指定路径创建一个新文件并写入字符串内容[^4]。 ##### 读取文件 使用 `FSDataInputStream` 类可以从 HDFS 文件中读取数据: ```java @Test public void readFile() throws IOException { Path path = new Path("hdfs://hadoop00:9000/user/root/HDFSAPI/test/hello.txt"); FSDataInputStream input = fileSystem.open(path); byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = input.read(buffer)) > 0) { System.out.write(buffer, 0, bytesRead); } input.close(); } ``` 此代码会读取指定路径下的文件内容并输出到控制台。 ##### 重命名文件 使用 `fileSystem.rename()` 方法可以对 HDFS 中的文件或目录进行重命名: ```java @Test public void renameFile() throws IOException { Path oldPath = new Path("hdfs://hadoop00:9000/user/root/HDFSAPI/test/hello.txt"); Path newPath = new Path("hdfs://hadoop00:9000/user/root/HDFSAPI/test/hello_new.txt"); boolean isRenamed = fileSystem.rename(oldPath, newPath); System.out.println("File renamed: " + isRenamed); } ``` #### 4. 打包与部署 在开发完成后,可以将项目打包为 `.jar` 文件,并提交到 Hadoop 集群上运行。使用 Maven 或 Gradle 构建工具可以简化依赖管理和打包流程。确保在构建过程中包含 Hadoop 相关的依赖项,以便程序能够正常访问 HDFS API。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值