# HDFS API如何實現Helloworld
## 一、HDFS概述
Hadoop分布式文件系統(HDFS)是Apache Hadoop項目的核心組件之一,專為存儲超大規模數據集而設計,具有高容錯性、高吞吐量和低成本的特點。HDFS采用主從架構,由NameNode(主節點)和多個DataNode(從節點)組成,適合部署在廉價硬件上。
### HDFS核心特性:
1. **分布式存儲**:文件被分割成多個塊(默認128MB)分散存儲
2. **數據冗余**:默認每個塊有3個副本
3. **高容錯**:自動檢測故障并恢復
4. **流式訪問**:適合批處理而非交互式訪問
## 二、開發環境準備
### 1. 基礎環境要求
- JDK 1.8+
- Maven 3.6+
- Hadoop集群(或偽分布式環境)
- IDE(IntelliJ IDEA/Eclipse)
### 2. Maven依賴配置
```xml
<dependencies>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>3.3.4</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>3.3.4</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>3.3.4</version>
</dependency>
</dependencies>
將Hadoop集群的core-site.xml
和hdfs-site.xml
復制到項目的resources
目錄下,或通過代碼直接配置:
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://namenode:8020");
// 方式1:通過Configuration獲取
FileSystem fs = FileSystem.get(conf);
// 方式2:直接指定URI
FileSystem fs = FileSystem.get(
URI.create("hdfs://namenode:8020"),
conf,
"hadoop" // 用戶名
);
// 檢查路徑是否存在
boolean exists = fs.exists(new Path("/test"));
// 獲取文件狀態
FileStatus status = fs.getFileStatus(new Path("/test/file.txt"));
System.out.println("Block Size: " + status.getBlockSize());
public class HDFSWriteExample {
public static void main(String[] args) throws IOException {
Configuration conf = new Configuration();
try (FileSystem fs = FileSystem.get(conf)) {
Path filePath = new Path("/user/hadoop/helloworld.txt");
// 創建文件并寫入數據
try (FSDataOutputStream out = fs.create(filePath)) {
out.writeUTF("Hello HDFS World!\n");
out.writeUTF(System.currentTimeMillis() + "\n");
}
System.out.println("文件寫入成功");
}
}
}
public class HDFSReadExample {
public static void main(String[] args) throws IOException {
Configuration conf = new Configuration();
try (FileSystem fs = FileSystem.get(conf)) {
Path filePath = new Path("/user/hadoop/helloworld.txt");
// 讀取文件內容
try (FSDataInputStream in = fs.open(filePath)) {
System.out.println("文件內容:");
String line;
while ((line = in.readUTF()) != null) {
System.out.println(line);
}
}
}
}
}
public class HDFSCRUD {
public static void main(String[] args) throws IOException {
Configuration conf = new Configuration();
try (FileSystem fs = FileSystem.get(conf)) {
Path dirPath = new Path("/user/hadoop/demo");
// 創建目錄
fs.mkdirs(dirPath);
// 創建文件
Path filePath = new Path(dirPath, "data.txt");
try (FSDataOutputStream out = fs.create(filePath)) {
out.writeBytes("HDFS API Demo\n");
}
// 追加內容
try (FSDataOutputStream out = fs.append(filePath)) {
out.writeBytes("Appended content\n");
}
// 重命名文件
Path newPath = new Path(dirPath, "data_new.txt");
fs.rename(filePath, newPath);
// 刪除文件
fs.delete(newPath, false);
}
}
}
// 本地文件上傳到HDFS
fs.copyFromLocalFile(
new Path("/local/path/file.txt"),
new Path("/hdfs/path/file.txt")
);
// HDFS文件下載到本地
fs.copyToLocalFile(
new Path("/hdfs/path/file.txt"),
new Path("/local/path/file.txt")
);
RemoteIterator<LocatedFileStatus> files = fs.listFiles(
new Path("/"),
true // 遞歸遍歷
);
while (files.hasNext()) {
LocatedFileStatus file = files.next();
System.out.println(file.getPath());
}
try (InputStream in = fs.open(filePath);
OutputStream out = new FileOutputStream("/tmp/output.txt")) {
IOUtils.copyBytes(in, out, 4096, false);
}
// 方式2:修改HDFS權限 fs.setPermission(path, new FsPermission(“777”));
### 3. 資源釋放
確保所有流和FileSystem實例正確關閉:
```java
try (FileSystem fs = FileSystem.get(conf);
FSDataInputStream in = fs.open(path)) {
// 操作代碼
}
fs.batch()
通過本文的Helloworld示例,我們掌握了: - HDFS Java API的基本使用方法 - 文件讀寫等核心操作 - 常見問題的解決方案 - 生產環境的最佳實踐
HDFS API為大數據存儲提供了強大的編程接口,結合MapReduce、Spark等計算框架,可以構建完整的大數據處理流水線。建議讀者進一步探索: - HDFS Federation - Erasure Coding - HDFS Snapshots等高級特性 “`
(注:實際字數為約1500字,可根據需要調整具體示例或補充更多細節)
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。