本文主要介绍了 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#/ 能够查看写入结果
控制台则会输出上传文件的内容