系列文章目录
Hadoop了解篇
Hadoop之HDFS
Hadoop之MapReduce
Hadoop之Yarn
Hadoop之优化&新特性
文章目录
前言
当下数据量的爆发式增长,在一个操作系统中,我们很难存下所有数据,这时就需要将数据放在等多个操作系统的磁盘中。此时另一个难题就出来了,我们如何对多台电脑的磁盘进行管理呢?这个时候分布式文件管理系统就登场了。
一、HDFS是什么?
1.HDFS
是一个文件系统,用于储存文件,通过目录树来定位文件
并且是分布式的,文件分布在多台服务器的磁盘中。
2.应用场景
适合一次写入,多次读出,不支持文件的修改。(内部维持多个副本,随机写的话,分布式数据一致性会受到挑战。而如果一定要保证实时的数据一致性,那么性能上的牺牲就会太大了。所以说,随机写不属于HDFS的适用场景。)
3.HDFS特点
优点:
特点 | 为何? |
---|---|
高容错性 | 内部维持多个副本,单一副本丢失,可自动恢复 |
处理数据量大 | 最大处理TB、PB级别的数据;处理百万规模的文件数量 |
可在廉价机器上 | 内部维持多个副本,单一副本丢失,可自动恢复 |
缺点:
特点 | 为何? |
---|---|
低延迟储存做不到 | 多副本机制的弊端 ,毫秒级储存难以达到 |
多小文件高效存储做不到 | 会占用大量的NameNode的内存来储存文件元数据;小文件的寻址时间会超过读取时间 |
并发写入,随机修改做不到 | 一个文件只能一个写,不可以多线程同时写;仅支持数据的追加(Append) |
二、HDFS组成
1.构架
组件 | 作用 |
---|---|
NameNode | 管理元数据、配置副本策略、管理Block映射信息、处理客户端读写请求 |
DataNode | 存储实际的数据块、执行数据的读/写操作 |
Client | 文件切分成Block然后上传 、与NameNode交互,获取文件位置信息、与DataNode交互,读取/写入数据、提供命令管理/操作HDFS,eg:对NameNode的格式化 |
Secondory NameNode | 紧急情况下,可辅助恢复NameNode了,具体见后续 |
2.HDFS文件块(Block)大小的如何确定?
首先明白:HDFS上的文件在物理上是分块存储(Block),块的大小我们可以根据实际的生产环境通过配置参数(dfs blocksize)来设定。在老版本中默认大小为64M,新版本(2.X)中默认大小为128M。
why?
以从HDFS上下载一个文件为例:
约定:寻址时间为传输时间的1%时,为最佳状态 |
---|
1.假设寻址时间为10ms,即查找目标Block的时间为10ms |
2.因此在最佳状态下,传输时间为10/0.01=1s |
3.而目前磁盘的传输速率普遍为100M/S |
4.1S * 100M/S = 100M |
5.最接近100M就是128M |
3.HDFS的Shell操作
1)基本语法
bin/hadoop fs 具体命令
or
bin/hdfs dfs 具体命令
2)常用命令实操
(1)上传
-moveFromLocal:从本地剪切粘贴到HDFS上
hadoop fs -moveFromLocal ./helloworld.txt /input
-copyFromLocal:从本地文件系统中拷贝文件到HDFS路径去
hadoop fs -copyFromLocal ./helloworld.txt /input
-appendToFile:追加一个文件到已经存在的文件末尾
hadoop fs -appendToFile helloworld.txt /input/yilei.txt
-put:等同于copyFromLocal
hadoop fs -put ./helloworld.txt /input
(2)下载
-copyToLocal:从HDFS上拷贝到本地
hadoop fs -copyToLocal /input/helloworld.txt ./
-get:等同于copyToLocal
hadoop fs -get ./helloworld.txt /input
-getmerge:合并多个文件下载
hadoop fs -getmerge /user/yilei/bin/* ./helloworld.txt
3)HDFS直接操作
-ls:显示目录信息
hadoop fs -ls
-mkdir:在HDFS上创建目录
hadoop fs -mkdir /sanguo/liubei.txt
-cat:显示文件内容
hadoop fs -cat /sanguo/liubei.txt
-cp :从HDFS的一个路径拷贝到HDFS的另一个路径
hadoop fs -cp /sanguo/liubei.txt /input/
-du:统计文件夹的大小信息
hadoop fs -du -s -h /sanguo
2.7k /sanguo
-setrep:设置HDFS中的文件副本数
hadoop fs -setrep 10 /sanguo/liubei.txt
二、HDFS客户端操作
1.HDFS客户端环境准备
1)下载Hadoop
2)配置Hadoop的环境变量
3)配置Path环境变量,重启电脑
4)创建Maven工程,并导入相应的依赖
2.HDFS的API操作
获取文件系统对象的方式一:(常用方式)
public class HdfsClient{
@Test
public void testMkdirs(){
//连接地址
UIR uri = new URI("hdfs://hadoop01:9820");
//创建配置文件对象
Configuration conf = new Configuration();
//1.文件系统对象
/*
参数一:NameNode的连接地址
参数二:配置文件对象
参数三:操作hdfs的用户
*/
FileSystem fs = FileSystem.get(uri,conf,"yilei")
//2.对应操作
System.out.println(fs