HDFS客户端操作
一、命令行工具操作
HDFS 命令行工具基于 hdfs dfs
命令,语法类似 Linux 文件操作。
1. 文件操作
bash
# 创建目录
hdfs dfs -mkdir /test# 递归创建多级目录
hdfs dfs -mkdir -p /test/data/logs# 上传本地文件到 HDFS
hdfs dfs -put local_file.txt /test/# 从 HDFS 下载文件
hdfs dfs -get /test/local_file.txt ./downloaded.txt# 查看文件内容
hdfs dfs -cat /test/local_file.txt# 追加内容到文件
echo "new line" | hdfs dfs -appendToFile - /test/local_file.txt
2. 目录操作
bash
# 查看目录内容
hdfs dfs -ls /test# 递归查看目录
hdfs dfs -ls -R /test# 删除文件/目录
hdfs dfs -rm /test/file.txt # 删除文件
hdfs dfs -rm -r /test/data # 递归删除目录# 移动/重命名
hdfs dfs -mv /test/file.txt /test/new_file.txt # 重命名
hdfs dfs -mv /test/data /new_location/ # 移动目录
3. 文件状态与权限
bash
# 查看文件状态
hdfs dfs -stat /test/file.txt# 查看文件块信息
hdfs fsck /test/file.txt -files -blocks# 修改权限
hdfs dfs -chmod 755 /test/dir# 修改所有者
hdfs dfs -chown hadoop:hadoop /test/file.txt
4. 数据均衡
bash
# 启动集群数据均衡(按磁盘使用率)
start-balancer.sh -threshold 10 # 阈值10%
二、Java API 操作
通过 HDFS 的 Java API 可以在代码中操作文件系统。
1. 添加依赖(Maven)
xml
<dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-client</artifactId><version>3.3.6</version>
</dependency>
2. Java 代码示例
java
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;public class HdfsExample {public static void main(String[] args) throws Exception {// 配置 HDFSConfiguration conf = new Configuration();conf.set("fs.defaultFS", "hdfs://master:9000");FileSystem fs = FileSystem.get(conf);// 创建目录Path dirPath = new Path("/java_api_test");if (!fs.exists(dirPath)) {fs.mkdirs(dirPath);System.out.println("目录创建成功");}// 上传文件Path localPath = new Path("/path/to/local/file.txt");Path hdfsPath = new Path("/java_api_test/file.txt");fs.copyFromLocalFile(localPath, hdfsPath);System.out.println("文件上传成功");// 查看目录内容FileStatus[] statuses = fs.listStatus(dirPath);for (FileStatus status : statuses) {System.out.println(status.getPath());}// 读取文件内容FSDataInputStream in = fs.open(hdfsPath);BufferedReader reader = new BufferedReader(new InputStreamReader(in));String line;while ((line = reader.readLine()) != null) {System.out.println(line);}reader.close();// 删除文件fs.delete(hdfsPath, false);System.out.println("文件已删除");// 关闭连接fs.close();}
}
三、WebHDFS REST API
通过 HTTP 请求操作 HDFS(需启用 dfs.webhdfs.enabled
)。
1. 创建目录
bash
curl -i -X PUT "http://master:9870/webhdfs/v1/test_dir?op=MKDIRS"
2. 上传文件
bash
curl -i -L -X PUT "http://master:9870/webhdfs/v1/test_dir/file.txt?op=CREATE&overwrite=true" \-T /path/to/local/file.txt
3. 查看文件
bash
curl -i "http://master:9870/webhdfs/v1/test_dir/file.txt?op=OPEN"
4. 删除文件
bash
curl -i -X DELETE "http://master:9870/webhdfs/v1/test_dir/file.txt?op=DELETE"
四、常见操作场景
1. 查看文件块位置
bash
hdfs fsck /path/to/file -files -blocks -locations
2. 更改文件副本数
bash
hdfs dfs -setrep 5 /path/to/file # 设置为5个副本
3. 统计目录大小
bash
hdfs dfs -du -h /path/to/dir # 以人类可读格式显示
4. 检查集群健康状态
bash
hdfs dfsadmin -report
五、注意事项
-
权限问题
- HDFS 遵循 Unix 风格的权限模型(用户、组、其他)。
- 操作时需确保用户有足够权限。
-
路径规范
- 绝对路径以
/
开头,相对路径相对于用户的 HDFS 主目录(/user/<username>
)。
- 绝对路径以
-
性能建议
- 避免频繁创建小文件(会消耗 NameNode 内存)。
- 大规模数据传输建议使用
distcp
命令。
-
安全模式
- 当集群处于安全模式时,只能读取不能写入。可通过
hdfs dfsadmin -safemode leave
退出。
- 当集群处于安全模式时,只能读取不能写入。可通过