一. HDFS概述
HDFS组成架构
NameNode(nn) 是整个集群的管理. 管理HDFS的名称空间, 配置副本策略, 数据块(Block)映射信息以及处理客户端读写请求.
DataNode 是下属的工作组, 当NameNode下达命令时, 由DataNode来实际执行命令: 存储实际的数据块, 以及执行数据块的读/写操作
Client 也即客户端, 是用户的操作端. 主要承担以下任务:
> 文件切分. 用户将文件上传至HDFS时, Client将文件切分成Block进行上传
> 与NameNode交互获取文件的位置信息
> 与DataNode交互进行读/写操作
> 通过命令管理HDFS, 例如NameNode格式化
> 通过命令访问HDFS
SecodaryNameNode 并非NameNode的备份, 而是协助NameNode完成工作
> 辅助NameNode, 定期合并Fsimage和Edits并推送给NameNode
> 紧急情况下辅助恢复NameNode
HDFS文件块大小
HDFS中的文件在物理上是分块储存, 块(Bolck)的默认大小在Hadoop2.x/3.x版本中是128M, 1.x版本中是64M. 块的大小可以通过配置参数(dfs.blocksize)来规定.
为何需要寻找到一个合适的块大小呢? 因为如果块设置得太小, 则块数量会增长, 这样会增加寻址时间. 相反的, 如果块设置得太大, 则会使得数据从磁盘传输至服务器的时间变大. 实际上, HDFS块的大小主要取决于磁盘传输速率, 也即I/O端口限制了块的大小.
二. HDFS的Shell操作(重点)
> 查看全部命令
[atguigu@hadoop102 hadoop-3.1.3]$ bin/hadoop fs
命令及参数解读:Hadoop - hdfs dfs常用命令的使用 - 整合侠 - 博客园Hadoop - hdfs dfs常用命令的使用 用法 1,-mkdir 创建目录Usage:hdfs dfs -mkdir [-p] < paths>选项:-p很像Unix mkdirhttps://www.cnblogs.com/lizm166/p/13355183.html> 查看命令参数(本例为 -rm 命令)
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -help rm
1) 上传
> -moveFromLocal 从本地剪切粘贴到HDFS
参数一: 本地原文件路径
参数二: 需要储存的HDFS文件路径
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -moveFromLocal ./shuguo.txt /sanguo
> -copyFromLocal 或 -put 从本地拷贝文件到HDFS
参数一: 本地原文件路径
参数二: 需要储存的HDFS文件路径
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -copyFromLocal weiguo.txt /sanguo
> -appendToFile 追加一个文件到已存在的文件末尾
参数一: 本地源文件路径
参数二: HDFS上需要追加的目标文件路径
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -appendToFile liubei.txt /sanguo/shuguo.txt
2) 下载
> -copyToLocal 或 -get 从HDFS拷贝到本地
参数一: HDFS原文件路径
参数二: 需要储存在本地的文件路径
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -copyToLocal /sanguo/shuguo.txt ./
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -get /sanguo/shuguo.txt ./shuguo2.txt
3) HDFS直接操作
> -ls 显示目录信息
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -ls /sanguo
> -cat 显示文件内容
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -cat /sanguo/shuguo.txt
> -chgrp -chmod -chown 同Linux文件系统中的用法一致, 修改文件所属权限
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -chmod 666 /sanguo/shuguo.txt
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -chown atguigu:atguigu /sanguo/shuguo.txt
> -mkdir 创建路径
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -mkdir /jinguo
> -cp 从HDFS的一个路径拷贝到HDFS的另一个路径
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -cp /sanguo/shuguo.txt /jinguo
> -mv 在HDFS中移动文件
> -tail 显示一个文件末尾1kb的数据
> -rm 删除文件或文件夹
> -rm -r 递归删除目录及目录里的内容
> -du 统计文件夹的大小信息
参数:
-s选项将显示文件长度的汇总摘要,而不是单个文件。
-h选项将以“人类可读”的方式格式化文件大小(例如64.0m而不是67108864)
> -setrep 设置HDFS中副本数量
三. HDFS的API操作
客户端环境准备
1) 将HDFS的Windows依赖文件拷贝到非中文路径
2) 配置HADOOP_HOME环境变量
3) 配置Path环境变量
4) 创建Maven工程, 导入相应的依赖坐标及日志
依赖坐标:
<dependencies>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>3.1.3</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.30</version>
</dependency>
</dependencies>
日志: 在项目的src/main/resource目录下, 创建名为"log4j.properties"的文件
log4j.rootLogger=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=target/spring.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n
5) 创建包名 com.atguigu.hdfs
Windows客户端下的HDFS操作客户端https://github.com/Mimimitsu/HDFSclientMavenProject