走进大数据 | HDFS技术介绍及其相关操作说明
Posted ItStar
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了走进大数据 | HDFS技术介绍及其相关操作说明相关的知识,希望对你有一定的参考价值。
一、HDFS体系结构
1、设计目标
l 自动快速检测 应对 硬件错误(每台服务器都可能会发生故障)
l 流式数据访问(更适用于批处理)
l 转移计算比转移数据更加划算(由存储数据的节点决定他所存储数据的运算)
l 简单数据一致性模型(不支持任意修改,只能在文件末尾最佳,多次读取)
l 异构平台可一致性
2、HDFS节点关系
HDFS集群有两类节点以管理者一工作者模式运行,即一个namenode(管理者)和多个datanode(工作者)。
NameNode主控器:存放着整个文件系统的文件和目录。考虑到主控服务器的高可用,还有SecondaryNameNode备机。
DataNode管理着若干数据块(Block默认128M)。记录那些数据块有数据,那么没有。并将这些信息定时告诉主控机NameNode。
3、核心概念
(1)NameNode
namenode(元数据节点)-管理系统命名空间。其将所有的文件和文件夹的元数据保存在一个文件系统树中。这些信息也会在硬盘上保存成以下文件:命名空间镜像及修改日志。其还保存了一个文件包括哪些数据块,分布在哪些数据节点上。然而这些信息并不存储在硬盘上,而是在系统启动的时候从数据节点收集而成的。
(2)DataNode
datanode(数据节点)-文件系统中真正存储数据的地方
客户端或者元数据信息可以向数据节点请求写入或者读出数据块。
其周期性的向元数据节点回报其存储的数据块元数据信息。
(3)块-Blocks
HDFS的块比磁盘的块大,一般64M,HDFS默认是128M。
目的1:最小化寻址开销。如果块设里得足够大,从磁盘传输数据的时间会明显大于定位这个块开始位置所需的时间。
目的2:将存储子系统控制单元设置为块,可简化存储管理。不仅如此,块还非常适合用于数据备份进而提供数据容错能力和提高可用性。将每个块复制到其他数据机上(HDFS默认是3备),可以确保在块、磁盘或机器发生故障后数据不会丢失。
(4)secondary namenode
元数据节点出现问题时候的备用节点,它和元数据节点负责不同的事情。
其主要功能就是周期性将元数据节点的命名空间镜像文件和修改日志合并,以防日志文件过大。合并过后的命名空间镜像文件也在从元数据节点保存了一份,以防元数据节点失败的时候,可以恢复。
4、HDFS体系结构
5、Hadoop生态中的HDFS
二、 HDFS应用原理
1、Checkpoint
HDFS会定期(dfs.namenode.checkpoint.period,默认3600秒)的对最近的文件信息进行同步。
2、写入过程
l Client向NameNode发起文件写入的请求。
l NameNode根据文件大小和文件块配置情况,迒回给Client它所管理部分DataNode的信息。
3、读出过程
lClient向NameNode发起文件读取的请求。
lNameNode迒回文件存储的DataNode的信息。
l Client读取文件信息。
4、DataNode容错
Replication。多复本。默认是三个。
hdfs-site.xml的dfs.replication属性。
5、HDFS缺陷
(1)不适合低延迟数据访问
如果要处理一些用户要求时间比较短的低延迟应用请求,则HDFS不适合。HDFS是为了处理大型数据集分析任务的,主要是为达到高的数据吞吏量而设计的,这就可能要求以高延迟作为代价。
改进策略
对于那些有低延时要求的应用程序,HBase是一个更好的选择。通过上层数据管理项目来尽可能地弥补这个不足。
(2) 无法高效存储大量小文件
因为Namenode把文件系统的元数据放置在内存中,所以文件系统所能容纳的文件数目是由Namenode的内存大小来决定。一般来说,每一个文件、文件夹和Block需要占据150字节左右的空间,所以,如果你有100万个文件,每一个占据一个Block,你就至少需要300MB内存。当前来说,数百万的文件还是可行的,当扩展到数十亿时,对于当前的硬件水平来说就没法实现了。
改进策略
利用SequenceFile、MapFile、Har等方式归档小文件,这个方法的原理就是把小文件归档起来管理,HBase就是基于此的。对于返种方法,如果想找回原来的小文件内容,那就必须得知道不归档文件的映射关系。
横向扩展,一个Hadoop集群能管理的小文件有限,那就把几个Hadoop集群拖在一个虚拟服务器后面,形成一个大的Hadoop集群。
多Master设计,这个作用显而易见了。正在研发中的GFSII也要改为分布式多Master设计,还支持Master的Failover,而且Block大小改为1M,有意要调优处理小文件啊。AlibabaDFS的设计,也是多Master设计,它把Metadata的映射存储和管理分开了。
6、HDFS联邦
所谓的HDFS Federation就是有多个namenode(或者说namespace)。
另一种HA(高可用性)的体现
HDFS联邦有block pool的概念,每一个namespace都有一个pool,datanodes会存储集群中所有的pool,blockpool之间的管理是独立的,一个namespace生成一个blockid时不需要跟其它namespace协调,一个namenode的失败也不会影响到datanode对其它namenodes的服务。
一个namespace和它的blockpool作为一个管理单元,删除后,对应于datanodes中的pool也会被删除。集群升级时,这个管理单元也独立升级。
这里引入clusterID来标示集群所有节点。当一个namenodeformat之后,这个id生成,集群中其它namenode的format也用这个id。
多namenode的好处:
namespace可扩展性。原来只有hdfs存储可以水平扩展,现在namenode也可以做到了,减轻单namenode的内存和服务压力。
性能方面。多个namenode可以提高读写时的吞吏量。
隔离性。隔离不同类型的程序,一定程度上控制资源的分配。
三、 HDFS Shell操作
可以通过HDFS Shell命令可以对文件系统进行操作。
1、命令形式
$HADOOP_HOME/bin/hadoop fs 和$HADOOP_HOME/bin/hadoopdfs
fs是个比较抽象的层面,在分布式环境中,fs就是dfs,
命令 功能
-help [cmd] 显示命令的帮助信息
-ls(r) <path> 显示当前目录下所有文件
-du(s) <path> 显示目录中所有文件大小
-count[-q] <path> 显示目录中文件数量
-mv <src> <dst> 移动多个文件到目标目录
-cp <src> <dst> 复制多个文件到目标目录
-rm(r) 删除文件(夹)
-put <localsrc> <dst> 本地文件复制到hdfs
-copyFromLocal 同put
-moveFromLocal 从本地文件移动到hdfs
-get [-ignoreCrc] <src> <localdst> 复制文件到本地,可以忽略crc校验
-getmerge <src> <localdst> 将源目录中的所有文件排序合并到一个文件中
-cat <src> 在终端显示文件内容
-text <src> 在终端显示文件内容
-copyToLocal [-ignoreCrc] <src> <localdst> 复制到本地
-moveToLocal <src> <localdst> 移动到本地
-mkdir <path> 创建文件夹
-touchz <path> 创建一个空文件
2、操作命令
列出文件:hadoop fs –ls
上传文件到HDFS:hadoop fs –put~/file test
下载文件到本地:hadoop fs -get outputfilegetout
文件删除hadoop fs -rm -r outputfile
3、管理命令
安全模式:不允许修改文件
迕入:hdfs dfsadmin -safemode enter
退出:hdfs dfsadmin -safemode leave
查看HDFS文件和块信息
hdfs fsck / -files -blocks
HDFS的数据在各个DataNode中的分布肯能很不均匀,尤其是在DataNode节点出现
故障或新增DataNode节点时,数据分布强制负载均衡
四、 HDFS Java操作
Hadoop中关于文件操作类基本上全部是在"org.apache.hadoop.fs"包中,这些API能够支持的操作包含:打开文件,读写文件,删除文件等。
1、 Hadoop开发java资源构建
2、 HDFS系统开发
Hadoop类库中最终面向用户提供的接口类是FileSystem,该类是个抽象类,只能通过来类的get方法得到具体类。get方法存在几个重载版本,常用的是这个:staticFileSystem get(Configuration conf);该类封装了几乎所有的文件操作,例如mkdir,delete等。基本上可以得出操作文件的程序库框架:
//创建Configuration对象
Configurationcfg = new Configuration();
//根据hdfs的core-site.xml中指定的ip和端口
URIhdfsUrl = new URI("hdfs://192.168.8.129:9000");
//通过get静态方法得到核心操作对象-FileSystem
FileSystemfs = FileSystem.get(hdfsUrl, cfg ,"root");
//文件创建(上传)
FSDataOutputStreamout = fs.create(new Path("/words.txt"));
FileInputStreamin = new FileInputStream(new File("c:/words.txt"));
IOUtils.copyBytes(in, out, 2048, true);
//判断hdfs文件是否存在
boolean fileIsExits = fs.exists(new Path("/words.txt"));
//修改hdfs中文件的名称
fs.rename(new Path("/words.txt"), new Path("/words"));
//下载hdfs中文件
FSDataInputStreamopenStream = fs.open(new Path("/words"));
IOUtils.copyBytes(openStream,
new FileOutputStream("C:\local"),1024,false);
IOUtils.closeStream(openStream);
//删除hdfs中的文件
PathdelFile = new Path("/words.txt");
boolean flag = fs.delete(delFile);
3、 HDFS的断点续传-append
Hadoop考虑文件存取稳定性,一般情况下append功能是关闭的。如果需要支持断点续传功能,建议将器打开。
<property>
<name>dfs.support.append</name>
<value>true</value>
</property>
以上是关于走进大数据 | HDFS技术介绍及其相关操作说明的主要内容,如果未能解决你的问题,请参考以下文章
走进大数据 | ZooKeeper 原理及其在 Hadoop 和 HBase 中的应用