在 Linux 环境下,HDFS(Hadoop Distributed File System) 与业务应用的集成,本质上就是“应用如何访问 HDFS”。下面从部署前提、集成方式、常见开发语言示例、权限与调试几个方面系统说明。
# 测试 NameNode 是否可达
telnet namenode-host 8020
从 Hadoop 集群拷贝:
core-site.xml
hdfs-site.xml
这是所有集成方式的基础。
适合脚本、定时任务
hdfs dfs -put localfile /user/app/
hdfs dfs -get /user/app/file .
hdfs dfs -ls /user/app
应用服务器需安装 Hadoop Client
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>3.3.6</version>
</dependency>
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://namenode:8020");
FileSystem fs = FileSystem.get(conf);
Path path = new Path("/user/app/test.txt");
FSDataOutputStream out = fs.create(path);
out.writeUTF("Hello HDFS");
out.close();
fs.close();
✅ 适合:
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
curl -i -X PUT "http://namenode:50070/webhdfs/v1/user/app/file.txt?op=CREATE"
✅ 适合:
hdfs-fusehdfs-fuse /mnt/hdfs
File file = new File("/mnt/hdfs/user/app/file.txt");
⚠️ 性能一般,适合只读或轻量写
spark.read.text("hdfs://namenode:8020/user/app/data")
只需配置
HADOOP_CONF_DIR
hdfs dfs -chmod 755 /user/app
hdfs dfs -chown appuser:appgroup /user/app
kinit appuser
Java 中:
conf.set("hadoop.security.authentication", "kerberos");
UserGroupInformation.loginUserFromKeytab(
"appuser@REALM",
"/path/keytab"
);
业务应用 (Java/Python)
|
| HDFS Client / WebHDFS
|
NameNode
/ | \
DataNode DataNode DataNode
| 问题 | 原因 |
|---|---|
| Connection refused | 端口/防火墙 |
| Permission denied | 用户/目录权限 |
| ClassNotFound | 缺 hadoop-client |
| 慢 | 小文件过多 |
如果你能说明:
我可以给你更具体的集成方案或示例。