HDFS必备知识点

Hadoop中的组件:
HDFS、MapReduce、Yarn、Hive、Hbase、zookeeper、Sqoop、flume、yarn、pig、mahout
其它开源组件:impala、spark、storm、kafka、redis、flink等

Hdfs:分布式文件存储系统

主节点:namenode,secondarynamenode

Namenode:保存HDFS上元数据的信息:命名空间信息、存储块信息。当namenode运行的时候,这些文件信息是保存在内存中的。

Namenode是如何将文件系统保存在磁盘上的呢?
Fsimage 在启动集群的时候,fsimage会开始拍一个系统镜像。文件系统镜像文件
edits:它是操作日志文件,它是在集群启动之后,对文件系统改动序列

只有当namenode重启的时候,fsimage和editlogs才会合并。但是,在公司的集群很少重启,运行的时间很长,那么editlogs就会越来越大,因此,在这里引入了secondaryNameNode
查看fsimage文件:Hdfs oiv –p 文件类型 –I 镜像文件 –o 转换后文件输出路径
查看editsLogs文件:Hdfs oev –p 文件类型 –i 编辑日志 -o 转换后文件输出路径

SecondaryNameNode将editLogs和fsimage合并的时候,要先向namenode询问,触发checkpoint需要满足两个条件中的任意一个:1 时间 2editsLogs文件满了
默认情况下,
SecondaryName每隔3600秒,也就是1小时执行一次。而SecondaryNamenode每一分钟检查一次操作次数,当操作次数达到1百万的时候,secondaryNameNode会执行一次。

HDFS中的block、packet、chunk
1 block :在将文件上传到hdfs之间需要分块,这个块就是block,一般为128MB,当然可以更改,通过修改core-default.xml文件修改这个值,它是最大的一个单位。
2 packet:packet是第二大的单位,它是client端向DataNode或DataNode的pipline之间传输数据的基本单位,默认是64kb
3 chunk:chunk是最小的单位,它是client向datanode,或DataNode的pipline之间进行数据校验的基本单位,默认为512B,因为用作校验,因此每个chunk需要带有45byte的校验位,所以实际每个chunk的大小为516B,由此可见真是数据与校验值的比值约为128:1;

从节点:Datanode
Datanode是HDFS上真正存储数据的。
Block块:
如果有一个文件非常大,怎么存储?:DataNode在存储数据的时候是按照block为单位读写数据的。Block是hdfs读写数据的基本单位。假如文件为100G,从字节0位置开始,每128MB字节划分为一个block,以此类推,可以划分多个block,每个block块就是128MB大小。Block默认为128MB是可以配置的,在 core-default.xml 文件中配置。

HDFS的API操作:
在Hadoop中有个很重要的API,就是FileSystem,这是用户操作hdfs的直接入口,类似于jdbc的connection。

HDFS的读写流程:
客户端向namenode发送写的请求,namenode返回一个列表,包含块要存储的位置。
Client根据namenode返回的列表,向最近的一个datanode传送数据,数据以小包的形式传输,第一个接受到数据的datanode再想其他datanode传送数据,呈流水线方式。等所有datanode成功存储后,会返回一个packet包。
如果在写入的过程中datanode出现了故障怎么办?
如果出现了故障,那么当前的pipeline会关闭出现故障的datanode,将datanode移除,剩下的block块会继续以pipleline的形式传输,同时,namenode会重新分配一个新的datanode,根据负载均衡,复制所缺少的数据。

HDFS能否多线程编写?
不可以多线程编写,只可以多线程读,
HDFS文件能否直接删除或者修改?
Hdfs dfs –rm
NameNode的作用?
管理文件系统命名空间、规范客户端对文件的访问、它也执行文件系统操作,如重命名,关闭和打开的文件和目录

改变hdfs块的大小?
Hdfs-site.xml文件中设置

Hadoop节点动态上线下线操作:
1 节点上线操作:当要新上线数据节点的时候,需要把数据节点的名字追加在dfs.hosts文件中
2 关闭新增节点的防火墙
3 在namenode节点的hosts文件中加入新增数据节点的hostname
4 在每个新增数据节点的hosts文件中加入namenode的hostname
5 在namenode节点上增加新增节点的SSH免密码登陆的操作
6 在namenode节点上的dfs.hosts中追加上新增节点的hostname
7 在其他节点上执行刷新操作:hdfs dfs admin –refreshNodes
8 在NameNode节点上,更改slave文件,将要上线的数据节点hostname追加到slaves文件中。
9 启动Datanode节点。
10 查看Namenode的监控页面看是否有新增加的节点。

节点下线操作:
1 修改/conf/hdfs-site.xml文件
2 确定需要下线的机器,dfs.osts.exclude文件中配置好需要下架的机器,这个是阻止下架的机器去连接namenode
3 配置完成之后进行配置的刷新操作./bin/Hadoop dfsadmin –refreshNodes,这个操作的作用是在后台进行block块的移动。
4 当执行三的命令完成之后,需要下架的机器就可以关闭了,可以查看现在集群上连接的节点,正在执行Decommission,会显示:Decommission Status:Decommission in progress执行后,会显示:Decommission Status:Decommissioned
5 机器下线完毕,将它们从excludes文件中移除。

Namenode的内存包含哪些?具体如何分配?
Namenode整个内存结果大致可以分成四大部分:namespace、blockmap、networktopology
Namespace:维护整个文件系统的目录树结构以及目录树上的状态变化。
blockManager:维护整个文件系统中与数据块相关的信息及数据块的状态变化。
NetworkTopology:维护机架拓扑及datanode信息,机架感知的基础。
Namenode常驻内存主要被namespace和blockManager使用,二者使用占比分别接近50%,其它部分内存开销较小且相对固定,与namespace和blockmanager相比基本可以忽略。

HAnamenode是如何工作的?
ZKfailovercontroller主要职责
1 健康监测:周期性的向它监控的namenode发送监控探测命令,从而来确定某个namenode是否处于健康状态,如果机器宕机,心跳失败,那么zkfc就会标记它处于一个不健康的状态。
2 会话管理:如果namenode是健康的,zkfc就会在zookeeper中保持一个打开的会话,如果namenode同时还是active状态的,那么zkfc还会在zookeeper中占有一个类型为短暂类型的znode,当这个namenode挂掉时,这个znode将会被删除,然后备用的namenode,将会得到这把锁,升级为主namenode,同时标记状态为active。
3 当宕机的namenode新启动的时候,它会再次注册zookeeper,发现已经有znode锁了,便会自动变为standby,如此往复循环,保证高可靠,需要注意,目前仅仅支持最多配置2个namenode。
4 master选举:如上所述,通过在zookeeper中维持一个短暂类型的znode,来实现抢占式的锁机制,从而判断那个namenode为active状态。
HDFS Fesderation的原理结构:
HDFS Fedration意味着在集群中将会有多个namenode/namespace,这样的方式有什么好处呢?
多个namespace的方式可以直接减轻单一namenode 的压力。一个典型的例子就是上面提到的namenode内存过高的问题,我们完全可以将上面部分大的文件目录移到另一个namenode上做管理,更重要的一点在于,这些namenode是共享集群中所有的datanode的,他们还是在同一个集群内的。
HDFS Federation是解决Namenode单点问题的水平横向拓展方案。在HDFS Federation的情况下,只有元数据的管理与存放被分隔开了,但真实数据的存储还是共用的,这与viewFs还是不一样的。

HDFS Fesderation方案的优势:
第一点:命名空间的拓展。随着集群使用时间的加长,HDFS上存放的数据也将会越来越多,这个时候如果还是将所有的数据都往一个NameNode上存放,这个文件系统会显得非常庞大,这个时候我们可以进行横向拓展,把一些大的目录分离出去,使得每个namenode下的数据看起来更加的精简。
第二点:性能的提升。当namenode所持有的数据量达到了一个非常大规模的良机的时候,这个时候namenode的处理效率可能就会受到影响,它可能比较容易的会陷入一个繁忙的状态,而整个集群将会受限于一个单点namenode 的处理效率,从而影响集群整体的吞吐量。这个时候多namenode机制显然可以减轻很多这部分的压力。
第三点:资源的隔离。通过多个命名空间,我们可以将关键数据文件目录移到不同的namenode上,以此不让这些关键数据的读写操作受到其他普通文件读写操作的影响。也就是说这些namenode将会只处理特定的关键的任务所发来的请求,而屏蔽了其他普通任务的文件读写请求,以此做到了资源的隔离。

jobClient,jobTracker和TaskTracker
1 jobClient会在用户端通过JobClient类将已经配置参数打包成jar文件的应用存储到hdfs,并把路径提交到JobTracker,然后由JobTracker创建每一个Task,并将它们分发到各个TaskTracker服务中去执行。
2 JobTracker是一个master服务,软件启动之后,JobTracker接受Job,负责调度Job的每一个子任务,task运行于TaskTracker上,监控它们,如果发现有失败的task就重新运行它,一般情况应该把JobTracker部署在单独的机器上。
3 TaskTracker是运行在多个节点上的slave服务,TaskTracker主动与JobTracker通信,接受作业,并负责直接执行每一个任务,TaskTracker都需要运行在HDFS的Datanode上。

文件大小默认为64M,改为128M有什么影响?
增加文件块大小,需要增加磁盘的传输速率。

HDFS小文件优化的方法:
HDFS上每个文件都要在namenode上建立一个索引,这个索引的大小约为150byte。这样当小文件比较多的时候,就会产生很多的所有文件,一方面会大量占用namenode的内存空间,另一方面就是索引文件过大使得索引速度变慢。
解决方案:Hadoop archive:是一个高效的将小文件放入HDFS块中的文件存档工具,它能够将多个小文件打包成一个HAR文件,这样就减少namenode的内存使用。
Sequence file:Sequence file由一系列的二进制key/value组成,如果key为文件名,value为文件内容,则可以将大批小文件合并成一个大文件。Java代码实现
CombineFileInputFormat:CombineFileFormat是一种新的inputFormat,用于将多个文件合并成一个单独的split,另外,它会考虑数据的存储位置。
开区JVM重用:对于大量小文件Job,开启JVM重用会减少45%运行时间。

Datanode的作用:
数据节点上文件系统执行的读写操作,根据客户端的请求。根据名称节点的指令执行操作,如块的创建,删除和复制。

Namenode在启动的时候会做出哪些操作?
加载fsimage

HDFS是否支持随机写?为什么?
不支持随机写。对文件的随机写入操作在实际中几乎不存在,对文件的操作只有读。主要的原因是HDFS的目标应用场景就是一次写入,多次读取,因此一开始就没打算支持随机写。
最根本的原因在于,随机写的话,分布式数据一致性会受到挑战。而如果一定要保证实时的数据一致性,那么性能上的牺牲就太大了。
随机写文件会破坏掉原本文件的一些元数据的变动会导致校验和变动,而hadoop会依赖这些东西拆分文件以及校验文件合法性,一套流程走下来,效率不如重新上传。

Namenode的HA:
如果集群中的namenode宕机了,那么hdfs就不能工作了。因此我们需要一台备份好的namenode,两台namenode的状态,一台为active,一台为standby,(active正常对外响应工作,而standby则相当于一个备份。)
当namenode初始化的时候,将初始化好的目录fsimage,拷贝一份给另一台namenode,然后将eits文件放在一个可以被共享的位置(Qjournal)。Qjournal里面有许多台服务器,并且是奇数的,只要这个里面的服务器集群宕机的数量不超过一般,这个服务器集群就可以正常使用。
Qjournal:
Qjouranl集群是基于zookeeper的,zookeeperFC不断的与namenode进行心跳访问,当一台namenode宕机的时候,zookeeper收到消息,备份的namenode会切换为active,并且将Qjournal中的edits文件进行加载。并且zookeeper会告诉外界,现在提供相应的是哪个namenode。

Namenode和datanode之间有哪些操作?
Hadoopshell命令操作。
Hadoop作业的提交流程?
MapReduce

Hadoop分块与分片?
块是存储的最小单位,HDFS定义其大小为64MB(2.X以后为128MB),与单磁盘文件系统相似,存储在HDFS上的文件均存储为多个块。不同的是,如果某个文件没有达到128MB
该文件也不会占据整个块的空间,在分布式的HDFS集群上,HADOOP系统,保证一个快存储在一个datanode上。
分片:在hadoop的作业提交过程中,需要具体的输入进行分片,具体的分片细节由inputSplitFormat指定,分片的规则为Fileinputformat.class中的g etsplit()方法指定。
Long splitSize = computerSplitSize(goalSize,minSize,blockSize)
computerSplitSize:Math.max(minSize,Math.min(goalSize,blockSize))
其中goalSize为inputFile大小,我们在配置文件中定义的mapred.map.task值,minsize为mapred.min.split.size.当某个分块均等的若干分片时,会有最后一个分片大小小于定义的分片大小,则该分片独立成为一个分片。

如何减少hadoop map端到reduce端的数据传输量
减少传输量,可以让map处理完,让同台的reduce直接处理,理想情况下,没有数据传输。

HDFS的块的大小多少能不能改成10M
不能,加入数据库设置过少,那需要读取的数据块就比较多,由于数据库在硬盘上非连续存储,普通硬盘因为需要移动磁头,所有随机寻址较慢,读越多的数据块就增大了总的硬盘寻道时间,当硬盘的寻道时间比IO时间还要长的多时,那硬盘寻道时间就成了系统的一个瓶颈。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值