本文主要介紹了 HDFS 的體系架構以及其執行流程,並給出了讀寫操做的編程實例,但願對 HDFS 有個初步的認識。html
HDFS (Hadoop Distributed File System) 是一個運行在商業 PC 上的分佈式文件系統,其設計思想源自於 Google 2003 年發佈的論文 The Google File System 。HDFS的主要目的是爲了解決大規模數據存儲和管理的問題。java
上圖代表 HDFS 是一個標準的 master/slave 架構,主要由三個部分構成:shell
這裏對圖中出現的一些概念進行說明:apache
Replication(副本)編程
爲了保證數據的高可用,HDFS 會對寫入的數據進行冗餘存儲,默認狀況下會保存 3 份。安全
Blocks架構
Block 是最基本的存儲和操做單位(默認狀況下爲 128M),這裏的 Block 不是指物理 Block ,而是指文件系統的 Block,其大小通常是物理 Block 的整數倍。分佈式
讀文件的過程能夠歸納爲:函數
寫文件的過程能夠歸納爲:oop
列出文件
hdfs dfs -ls <path>
複製代碼
建立目錄
hdfs dfs -mkdir <path>
複製代碼
上傳文件
hdfs dfs -put <localsrc> <dst>
複製代碼
輸出文件內容
hdfs dfs -cat <src>
複製代碼
文件複製到本地
hdfs dfs -get <src> <localdst>
複製代碼
刪除文件和目錄
hdfs dfs -rm <src>
hdfs dfs -rmdir <dir>
複製代碼
查看統計信息
hdfs dfsadmin -report
複製代碼
進入和退出安全模式(該模式不容許文件系統有任何修改)
hdfs dfsadmin -safemode enter
hdfs dfsadmin -safemode leave
複製代碼
IDEA 新建 Maven 項目
勾選相關選項後,點擊 next 填入項目相關信息便可
pom.xml 中添加依賴
<dependencies>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>2.9.2</version> //根據 Hadoop 版本進行選擇
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.9.2</version>
</dependency>
</dependencies>
複製代碼
讀寫文件
建立 Sample 類編寫相應的讀寫函數
Sample 類
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import java.io.*;
/** * @author ikroal */
public class Sample {
//默認的 HDFS 地址
private static final String DEFAULT_FS = "hdfs://localhost:9000";
private static final String PATH = DEFAULT_FS + "/tmp/demo.txt";
private static final String DEFAULT_FILE = "demo.txt";
public static void main(String[] args) {
Configuration conf = new Configuration();
FileSystem fs = null;
conf.set("fs.defaultFS", DEFAULT_FS); //配置 HDFS 地址
try {
fs = FileSystem.get(conf);
write(fs, DEFAULT_FILE, PATH);
read(fs, PATH);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (fs != null) {
fs.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
複製代碼
write 函數
/** * 進行文件寫入 * @param inputPath 待寫入文件路徑 * @param outPath HDFS 的寫入路徑 */
public static void write(FileSystem fileSystem, String inputPath, String outPath) {
FSDataOutputStream outputStream = null;
FileInputStream inputStream = null;
try {
outputStream = fileSystem.create(new Path(outPath)); //得到 HDFS 的寫入流
inputStream = new FileInputStream(inputPath); //讀取本地文件
int data;
while ((data = inputStream.read()) != -1) { //寫入操做
outputStream.write(data);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (outputStream != null) {
outputStream.close();
}
if (inputStream != null) {
inputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
複製代碼
read 函數
/** * 進行文件讀取 * @param path HDFS 上待讀取文件路徑 */
public static void read(FileSystem fileSystem, String path) {
FSDataInputStream inputStream = null;
BufferedReader reader = null;
try {
inputStream = fileSystem.open(new Path(path)); //獲取 HDFS 讀取流
reader = new BufferedReader(new InputStreamReader(inputStream));
String content;
while ((content = reader.readLine()) != null) { //讀取並輸出到控制檯
System.out.println(content);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (inputStream != null) {
inputStream.close();
}
if (reader != null) {
reader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
複製代碼
在工程文件夾的根目錄下建立計劃上傳的文件(這裏是 demo.txt),填入 Hello World!
啓動 Hadoop 而後運行程序查看結果
經過 http://localhost:50070/explorer.html#/ 能夠查看寫入結果
控制檯則會輸出上傳文件的內容