hadoop详解

HDFS:
1.HDFS文件系统:
HDFS是大数据开源框架hadoop的组件之一,全称(Hadoop Distributed File System),它是一个分布式文件系统,由多台服务器联合起来实现文件存储功能,通过目录树来定位文件,集群中的服务器都有有各自的角色.

2.HDFS优缺点:
优点:
1.数据通过副本存储,提高容错性
2.能够处理PB级及以上数据,可处理百万级文件数量
3.节约成本,可分布在“廉价”机器上
缺点:
1.不适合低延时数据访问
2.不适合对大量文件的存储和访问
3.单线程操作文件不能多用户执行写操作,并且不支持文件随机修改
3.HDFS组成架构:

NameNode(nn):就是Master,它是一个主管,管理者.
(1):管理HDFS的名称空间;
(2):配置副本策略;
(3):管理数据块(block)映射信息;
(4):处理客户端读写请求.

DataNode:就是Slave.NameNode下达命令,DataNode执行实际的操作.
(1):存储实际的数据块;
(2):执行数据块的读/写操作.

Client:就是客户端.
(1):文件切分.文件上传HDFS的时候,Client将文件切分成一个一个的Block,然后进行上传;
(2):与NameNode交互,获取文件的位置信息;
(3):与DataNode交互,读取或者写入数据;
(4):Client提供一些命令来管理HDFS,比如对NameNode格式化;
(5):Client可以通过一些命令来访问HDFS,比如对HDFS增删查改操作;

Seconary NameNode:并非NameNode的热备,当NameNode挂掉的时候,它并不能马上替换NameNode并提供服务.
(1):辅助NameNode,分担其工作量,比如定期合并Fsimage和Edits,并推送给NameNode;
(2):在紧急情况下,可以辅助恢复NameNode.
4.HDFS默认数据块得大小是多少?为什么?(面试重点):
HDFS目前默认块大小在Hadoop2.x版本中是128M,老版本中是64M;
因为目前磁盘的传输率约为100M/s,而HDFS读取文件时最佳的寻址时间为10ms,寻址时间为传输时间的百分之1时最佳,
所以定义块大小为128M,1秒左右可以快速读取完毕;本质上HDFS的块大小取决于磁盘的传输速率.
5.为什么HDFS不支持存储小文件
1)存储大量小文件会占用NameNode大量的内存和磁盘来存储文件目录和块信息。是不可取的,因为NameNode的内存是有限的;
2)读取小文件时寻址时间会超过读取时间,不合理,违反了HDFS的设计目标.
6.为什么块的大小不能设置太小,也不能设置太大
(1)HDFS的块设置太小,回增加寻址时间,程序一直在找块的开始位置;
(2)如果块设置的太大,从磁盘传输数据的时间会明显大于定位这个块开始位置所需的时间.=导致程序在处理这块数据时,会非常慢.
(3)总结:HDFS块的大小设置主要取决于磁盘按传输速率.
7.hadoop fs | hdfs dfs 命令分类
本地文件 -> HDFS
-put 将本地数据上传至hdfs
-copyFromLocal 将本地文件数据拷贝到hdfs
-moveFromLocal 将本地文件数据移动到hdfs,成功后本地数据会删除
-appendToFile 追加一个文件到已经存在的文件末尾

HDFS与HDFS之间
-ls 查看hdfs文件目录
-mkdir 在HDFS上创建目录
-rm 删除文件或者文件夹
-rmr | -rm -r 递归删除
-cp 从一个目录拷贝文件至另一目录
-mv 在HDFS目录中移动文件
-chown 修改文件所属用户权限
-chmod 修改文件所属读写权限
-du -h 文件夹暂用的空间大小
-df -h 查看系统分区情况
-cat 查看文件

HFDS -> 本地
-get 从hdfs下载文件至本地
-getmerge 合并hdfs目录下的文件至本地
-copyToLocal 从hdfs拷贝文件至本地

其他
-setrep 设置文件副本数(注意:具体的副本数得看DataNode的数量)
-help 帮助命令
8.说说hdfs的文件上传的流程(面试重点)
1.首先客户端通过Distributed FileSystem模块向NameNode请求上传文件,NameNode检查目标文件是否已存在,父目录是否存在。
2.NameNode返回是否可以上传。
3.如果文件大于128M则分块存储,客户端请求第一个 Block上传到哪几个DataNode服务器上。
4.NameNode根据副本储存策略返回3个DataNode节点,假如为dn1、dn2、dn3。
5.客户端通过FSDataOutputStream模块请求dn1上传数据,dn1收到请求调用dn2,dn2调用dn3,建立通信管道完成,dn1、dn2、dn3逐级应答客户端。
6.客户端以Packet为单位往dn1上传第一个Block数据,dn1收到Packet就会传给dn2,dn2传给dn3;dn1,dn2,dn3每接收packet会放入一个待写队列等待写入数据,落盘。
7.当一个Block传输完成之后,客户端再次请求NameNode上传第二个Block的服务器,重复执行3-6步。

9.我们在上传文件的时候如何namenode选取的datanode存储副本?有什么优势?
HDFS的放置策略是将一个副本放置在本地机架中的一个节点上,
将另一个副本放置在本地机架中的另一个节点上,
最后一个副本放置在不同机架中的另一个节点上
(一个副本在Client所处的节点上。如果客户端在集群外,随机选一个,第二个副本和第一个副本位于相同机架,随机节点,第三个副本位于不同机架,随机节点)
优点:该策略减少了机架间的写流量,通常可以提高写性能。机架故障的机会远小于节点故障的机会。此策略不会影响数据的可靠性和可用性保证

10.说说hdfs文件的下载流程
1.客户端通过Distributed FileSystem向NameNode请求下载文件,NameNode通过查询元数据,找到文件块所在的DataNode地址。
2.挑选一台DataNode(就近原则,然后随机)服务器,请求读取数据。
3.DataNode开始传输数据给客户端(从磁盘里面读取数据输入流,以Packet为单位来做校验)。
4.客户端以Packet为单位接收,先在本地缓存,然后写入目标文件。

11.描述一下Namenode和secondarynamenode的工作机制

  1. NameNode启动和工作内容
    1.1:第一次启动NameNode格式化后,创建Fsimage和Edits文件.如果不是第一次启动,会加载编辑日志和镜像文件到内存。
    1.2:客户端对元数据进行增删改的请求。
    1.3:NameNode记录操作日志,更新滚动日志。
    1.4:NameNode在内存中对元数据进行增删改。
  2. Secondary NameNode工作内容
    2.1:2NN询问NN是否需要CheckPoint(合并镜像和编辑日志),并带回NameNode是否执行结果。
    2.2;2NN请求执行CheckPoint
    2.3: NN滚动正在写的Edits编辑日志。
    2.4: 将滚动前的编辑日志和镜像文件拷贝到2NN。
    2.5: 2NN加载编辑日志和镜像文件到内存,并执行合并,生成新的镜像文件fsimage.chkpoint。
    2.6: 2NN拷贝fsimage.chkpoint到NN。
    2.7: NN将fsimage.chkpoint重新命名成fsimage,替换之间旧的fsimage

12.Fsimage和Edits文件分别指的是什么?存的是什么?
Fsimage:HDFS文件系统元数据的镜像文件,其中包含HDFS文件系统的所有目录和文件inode及相关属性的序列化信息
Edits:用户操作的编辑日志文件,存放HDFS文件系统的所有更新操作的动作,文件所有写操作会被记录到Edits文件中.

13.默认情况下进行Ckeckpoint(合并镜像及编辑日志)的触发条件是什么?
默认情况下,2NN每隔一小时执行一次Checkpoint
默认情况下,一分钟检查一次Edits文件的操作次数,当操作次数达到1百万时,2NN执行一次Checkpoint。

14.工作中假如你的NameNode发生故障,导致NameNode中的元数据丢失,如何恢复数据?
方法一:将2NN所在服务器元数据存储目录namesecondary中数据拷贝到NameNode存储元数据的name目录下,重新开启服务即可.

  1. kill -9 NameNode进程

  2. 删除NameNode存储的数据(/opt/module/hadoop-2.7.2/data/tmp/dfs/name)

  3. 拷贝SecondaryNameNode中数据到原NameNode存储数据目录

  4. 重新启动NameNode
    方法二:使用-importCheckpoint选项启动NameNode守护进程,将2NN所在服务器元数据存储目录namesecondary拷贝到NameNode所在服务器的同级目录下,导入检查点数据,重新开启服务即可。
    1.修改hdfs-site.xml中的

    dfs.namenode.checkpoint.period 120 dfs.namenode.name.dir /opt/module/hadoop-2.7.2/data/tmp/dfs/name

1
2
3
4
5
6
7
8
9
2.kill -9 NameNode进程
3.删除NameNode存储的数据(/opt/module/hadoop-2.7.2/data/tmp/dfs/name)
4.如果SecondaryNameNode不和NameNode在一个主机节点上,需要将SecondaryNameNode存储数据的目录拷贝到NameNode存储数据的平级目录,并删除in_use.lock文件
5.导入检查点数据(等待一会ctrl+c结束掉):hdfs namenode -importCheckpoint
6.重启NameNode(sbin/hadoop-daemon.sh start namenode)

15.什么情况下集群会进入安全模式?安全模式下集群有有什么限制?如何查看、进入、退出、等待安全模式
1.NameNode启动时,会将镜像文件(Fsimage)和编辑日志(Edits)加载到内存。一旦在内存中成功建立文件系统元数据的映像,则创建一个新的Fsimage文件和一个空的编辑日志。此时,NameNode开始监听DataNode请求。这个过程期间,NameNode处于安全模式。当数据块的副本数不满足(dfs.replication.min=1)最小副本数时,不会主动退出安全模式;
2.安全模式下:NameNode的文件系统对于客户端来说是只读的。
3.(1)bin/hdfs dfsadmin -safemode get (功能描述:查看安全模式状态)
(2)bin/hdfs dfsadmin -safemode enter (功能描述:进入安全模式状态)
(3)bin/hdfs dfsadmin -safemode leave (功能描述:离开安全模式状态)
(4)bin/hdfs dfsadmin -safemode wait (功能描述:等待安全模式状态)
注意:集群正常启动完成后,自动退出安全模式,如果无法正常退出可使用hdfs dfsadmin -safemode leave退出安全模式;对于全新创建的HDFS集群,NameNode启动后不会进入安全模式,因为没有Block信息。

16.DataNode工作机制
1)一个数据块在DataNode上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳.
2)DataNode启动后向NameNode注册,通过后,周期性(1小时)的向NameNode上报所有的块信息.
3)心跳是每3秒一次,心跳返回结果带有NameNode给该DataNode的命令如复制块数据到另一台机器,或删除某个数据块.如果超过10分钟没有收到某个DataNode的心跳,则认为该节点不可用.
4)集群运行中可以安全加入和退出一些机器.
17. 公司现有100台服务器组成的集群,由于疫情期间业务骤减,现需要减少10台服务器,如何退役这些节点?有哪几种方式退役节点?
本业务场景适合使用黑名单退役节点:
步骤:
1.可以在hadoop-2.7.2/etc/hadoop目录下创建黑名单dfs.hosts.exclude文件
2.在dfs.hosts.exclude文件中添加要退役的服务器名称
3.在hdfs-site.xml文件中添加黑名单那的配置项

dfs.hosts.exclude 黑名单文件绝对路径 1 2 3 4 4.刷新NameNode、刷新ResourceManager hdfs dfsadmin -refreshNodes yarn rmadmin -refreshNodes

退役的方式:
黑名单:在黑名单上面的主机都会被强制退出。
白名单:添加到白名单的主机节点,都允许访问NameNode,不在白名单的主机节点,都会被强制退出。
注意:黑名单和白名单最好不要同时出现,如果同时出现不允许白名单和黑名单中同时出现同一个主机名称。

18.启动集群时,我们要对namenode进行格式化操作?为什么只能格式化一次
格式化命令:hdfs namenode -format ,因为格式化NameNode,就会产生新的集群id,导致NameNode和DataNode的集群id不一致,集群找不到已往数据(现象datanode无法正常启动);
所以,重新格式化NameNode时,一定要先删除data数据和log日志,然后再格式化NameNode,后再启动集群
19.启动集群的相关命令有哪些(完整写出来)?
1.1 启动集群之前一定要格式化(/opt/module/hadoop-2.7.2)
bin/hdfs namenode -format ( has been successfully formatted)

1.2 启动HDFS服务
1.2.1 启动namenode(sbin/hadoop-daemon.sh start|stop namenode)
1.2.2 启动datanode(sbin/hadoop-daemon.sh start|stop datanode)
1.2.3检查namenode的web页面是否可以访问:http://192.168.232.201:50070

1.3 启动YARN服务
1.3.1 启动resourcemanager(sbin/yarn-daemon.sh start|stop resourcemanager)
1.3.2 启动nodemanager(sbin/yarn-daemon.sh start|stop nodemanager)
1.3.3检查yarn的web页面:http://192.168.232.201:8088
1.4 开启历史服务(sbin/mr-jobhistory-daemon.sh start|stop historyserver)

2.实现了集群的群停和群起
2.1 群起群停HDFS服务进程(再namenode所在的服务器上)
2.11 配置etc/hadoop/slaves (相对于hadoop-2.7.2)
2.12 群起的命令:start-dfs.sh
2.13 群停的命令:stop-dfs.sh

2.2 群起群停YARN服务进程(再resourcemanager所在的服务器上)
2.21 配置etc/hadoop/slaves (相对于hadoop-2.7.2)
2.22 群起的命令:start-yarn.sh
2.23 群停的命令:stop-yarn.sh

2.3 stop-all.sh | start-all.sh

20.配置集群过程中如果发现各台服务器的datanode启动后,过一段时间自动消失了查看原因发现datanode的集群clusterID=CID-9a578a40-2089-492b-9599-54dadbcd9849
而namenode的clusterID=CID-0b798a40-2089-492b-9599-54dadbcd9849,这时如果需要让集群正常工作,如何处理?
原因:这是因为多次格式化namenode后造成,datanode和namenode的集群id不一致,导致的,
方案一:如何集群没有任何数据,可以删除个服务器的data logs目录重新格式化,重新启动集群
方案二:如果集群中已经存在大量数据,则找到无法启动datanode的服务器进入到data/tmp/dfs/data 目录下
找到VERSION文件删除后,重新开启datanode服务

  1. 请列出正常工作的Hadoop 集群中Hadoop 都分别需要启动哪些进程,它们的作用分别是什么? 请尽量列的详细一些?
    NameMode:
    负责接受客户端读写数据请求
    负责数据块副本的存储策略
    负责管理快数据的映射关系
    储存元数据信息

DataMode:
存储实际的数据块
真实处理数据块的读/写操作

Secondary NameNode:
辅助后台程序,与NameNode进行通信,定期合并FSimage和Edits编辑日志,合并为最新的镜像文件。
保存HDFS元数据的快照。

ResourceManager:
统一资源调度和管理器
处理客户端请求
监控NodeManager
启动或监控ApplicationMaster
资源的分配与调度

NodeManager:
提供计算资源
管理单个节点上的资源
处理来自ResourceManager的命令
处理来自ApplicationMaster的命令

  1. 刷新namenode的命令是什么? 刷新resourcemanager的命令是什么?
    刷新NameNode、刷新ResourceManager
    hdfs dfsadmin -refreshNodes
    yarn rmadmin -refreshNodes

  2. namenode是怎么确定datanode能够正常工作的?他们之间是怎么保持联系的?
    1.datanode会先向namdnode注册,namdnode返回注册成功;后每一小时datanode向namenode上传块信息,
    每3秒datanode向namenode发送一次心跳包,并携带namenode给datanode的命令,默认情况下如果超过10分30秒
    namenode没有收到datanode的心跳,则任务datanode掉线。
    2.dn和nn是通过心跳包来保持联系的

  3. 谈谈 hadoop1 和 hadoop2 的区别?
    hadoop1.x:由Common(公共模块辅助工具)、HDFS(分布式数据存储)、MapReduce(分布式计算+资源调度)组成
    hadoop2.x:由Common(公共模块辅助工具)、HDFS(分布式数据存储)、MapReduce(分布式计算)、YARN(统一资源调度)组成

  4. 简述Hadoop 的几个默认端口及其含义?
    dfs.namenode.http-address:50070
    SecondaryNameNode辅助名称节点端口号:50090
    fs.defaultFS:9000
    yarn.resourcemanager.webapp.address:8088
    historyserver:19888

26.jps命令的作用?
jps这个命令是是jdk提供的一个查看当前java进程的小工具,在hadoop中可以用来查看集群相关
服务进程是否正常开启例如:namenode、datanode、secondarynamenode、resourcemanager、nodemanager等

  1. datanode可以设置多目录存储数据吗?怎么实现?
    DataNode也可以配置成多个目录,并且每个目录存储的数据不一样。
    编辑hdfs-site.xml文件,添加如下配置项,这里块数据会分布存储在data1和data2目录中
dfs.datanode.data.dir file:///${hadoop.tmp.dir}/dfs/data1,file:///${hadoop.tmp.dir}/dfs/data2 1 2 3 4 28. 是否可以在Windows上运行Hadoop? 你最好不要这么做,Red Hat Linux或者是Ubuntu才是Hadoop的最佳操作系统。在Hadoop安装中,Windows通常不会被使用,因为会出现各种各样的问题。因此,Windows绝对不是Hadoop的推荐系统
  1. hadoop有哪些发行版?
    hadoop三大发行版本:Apache、Cloudera、Hortonworks.
    Apache版本最原始(最基础)的版本.
    Cloudera在大型互联网企业中用的较多.
    Hortonworks文档较好.

30.在搭建集群的过程中我们需要开启哪些进程服务才能确保集群能够正常的读取数据、以及在Yarn上完成计算任务?
HDFS:namenode datanode secondarynamenode
Yarn:resourcemanager nodemanager