hdfs数据块的复制策略?

  • 数据可靠性:在某个节点发生故障时,不会丢失数据备份;
  • 数据写入效率:在备份数据同步过程中,尽量减少网络传输中的带宽开销;
  • datanode的负责均衡性:第一个为离client最近的dn,第二个为不同机架的dn,第三个为第二个相同的机架

hdfs调整块的大小会带来哪些影响?

  • hdfs块太小,会增加程序启动的map数量,增加执行时间,对程序不好,一方面存放大量小文件会占用NameNode中大量内存来存储元数据,而NameNode的内存是有限的,不可取;另一方面文件块过小,寻址时间增大,导致程序一直在找block的开始位置
  • hdfs块大减少了寻址开销(就是寻找文件的速度快)一方面,从磁盘传输数据的时间会明显大于寻址时间,导致程序在处理这块数据时,变得非常慢;另一方面,mapreduce中的map任务通常一次只处理一个块中的数据,如果块过大运行速度也会很慢。
    总结
    文件块越大,寻址时间越短,但磁盘传输时间越长;
    文件块越小,寻址时间越长,但磁盘传输时间越短。

HDFS namenode启动过程

  • namenode在磁盘上的两类文件组成:
    fsimage文件:保存文件系统至上次checkpoint为止目录和文件元数据。
    edits文件:保存文件系统从上次checkpoint起对hdfs的所有操作记录日志信息。
    一、首此启动hdfs过程:
    1,启动namenode:
    2,读取fsimage生成内存中元数据镜像。
    3,启动datanode:
    4,向namenode注册;
    5,向namenode发送blockreport。
    启动成功后,client可以对HDFS进行操作将被记录在edits文件中。
    二、之后启动HDFS文件系统过程:
    启动namenode:
    1,读取fsimage元数据镜像文件,加载到内存中。
    2,读取editlog日志文件,加载到内存中,使当前内存中元数据信息与上次关闭系统时保持一致。然后在磁盘上生成一份同内存中元数据镜像相同的fsimage文件,同时生成一个新的null的editlog文件用于记录以后的hdfs文件系统的更改。
    3,启动datanode:
    4,向namenode注册;
    5,向namenode发送blockreport。
    启动成功后,client可以对HDFS进行操作将被记录在edits文件中。

namenode HA

详情见官网(journalnode,zk)

secondary namenode作用?

它的职责是合并NameNode的edit logs到fsimage文件中,从而减少hdfs重启的时间。什么时候合并取决于配置,

hdfs常用文件格式有哪些?各有什么优缺点?

HDFS缺少namenode_HDFS缺少namenode

HDFS文件类型-如何使用?

ALTER TABLE table_name SET FILEFORMAT PARQUET;
CREATE TABLE table_name (x INT, y STRING) STORED AS PARQUET;
SET hive.default.fileformat=Orc

小文件问题

-定义:大量大小小于块大小的文件
实际场景:网页,Hive动态分区插入数据等
背景:每个文件的元数据对象约占150byte,所以如果有1千万个小文件, 每个文件占用一个block,则NameNode大约需要2G空间。如果存储1亿 个文件,则NameNode需要20G空间;数据以块为单位进行处理。
影响:占用资源,降低处理效率
解决方案

  • 从源头减少小文件
  • 使用archive打包
  • 使用其他存储方式,如Hbase,ES等

Namenode管理

大数据量下的namenode问题
1 .启动时间变长
2. 性能开始下降
3. NameNode JVM FGC风险较高
解决方案
1.根据数据增长情况,预估namenode内存需求,提前做好预案
2. 使用HDFS Federation,扩展NameNode分散单点负载
3 .引入外部系统支持NameNode内存数据
4.合并小文件
5.调整合适的BlockSize

如何扩展hdfs的容量?

1.增加datanode或增加磁盘空间

nameNode和DataNode的作用?

nameNode:

fsimage: 文件映射[“文件名以及文件所在目录,以及blockId”, “blockId与所在的dataNode节点的对应关系(会在启动的时候加载到内存)”]

edits文件:操作记录

HDFS缺少namenode_HDFS缺少namenode_02

dataNode:

向nameNode汇报blockId和所在dataNode的信息

HDFS读写请求流程?
读请求
  1. 客户端发送请求到nameNode获取Block信息,因为nameNode里面存了block所在dataNode的信息,正在数据的数据是存在dataNode上面的
  2. nameNode返回所有的block位置信息给客户端
  3. 客户端拿到所有的Block信息通过并行读取,因为Block有3个副本只用读取一个副本就行。
  4. dataNode返回信息
写请求

1.客户端向NameNode发出写文件请求。
2.检查是否已存在文件、检查权限。若通过检查,直接先将操 作写入EditLog,并返回输出流对象。
3.client端按128MB的块切分文件。
4.client将NameNode返回的分配的可写的DataNode列表Data数据一同发送给最近的第一个DataNode节点,此后client端和NameNode分配的多个DataNode构成pipeline管道,client端向输出流对象中写数据。client每向第一个DataNode写入一个packet,这个packet便会直接在pipeline里传给第二个、第三个…DataNode。
5.写完数据,关闭输输出流。
6.发送完成信号给NameNode。