大数据面试题

判断题:

1.如果 NameNode 意外终止,SecondaryNameNode 会接替它使集群继续工作。(错误)  

分析:

SecondaryNameNode是帮助恢复,而不是替代

SecondaryNameNode所做的不过是在文件系统中设置一个检查点来帮助NameNode更好的工作。它不是要取代掉NameNode也不是NameNode的备份

首先,它定时到NameNode去获取edit logs,并更新到fsimage上。[注:Secondary NameNode自己的fsimage]

一旦它有了新的fsimage文件,它将其拷贝回NameNode中。

NameNode在下次重启时会使用这个新的fsimage文件,从而减少重启的时间。

它的职责是合并NameNode的edit logs到fsimage文件中。

 

 

2. NameNode 负责管理 数据Metadataclient 端每次读写请求,它都会从磁盘中读取或会写入metadata信息并反馈client 端。(错误)

分析:

NameNode 不需要从磁盘读取 metadata,所有数据都在内存中,硬盘上的只是序列化的结果,只有每次 namenode 启动的时候才会读取。

1)文件写入

Client向NameNode发起文件写入的请求。

NameNode根据文件大小和文件块配置情况,返回给Client它所管理部分DataNode的信息。

Client将文件划分为多个Block,根据DataNode的地址信息,按顺序写入到每一个DataNode块中。

2)文件读取

Client向NameNode发起文件读取的请求。

 

 

3.hadoop dfsadmin –report 命令用于检测 HDFS 损坏块。(错误)
分析:
hadoop dfsadmin -report 
用这个命令可以快速定位出哪些节点down掉了,HDFS的容量以及使用了多少,以及每个节点的硬盘使用情况,但是并不能定位HDFS损坏块。

4.Hadoop 环境变量中的 HADOOP_HEAPSIZE 用于设置所有 Hadoop 守护线程的内存。它默认是 200 GB。(错误)
hadoop为各个守护进程(namenode,secondarynamenode,jobtracker,datanode,tasktracker)统一分配的内存在hadoop-env.sh中设置,参数为HADOOP_HEAPSIZE,默认为1000M。

 

 

 

5.DataNode 首次加入 集群(cluster) 的时候,如果 log 中报告不兼容文件版本,那需要 NameNode执行“Hadoop namenode -format”操作格式化磁盘。(错误)
分析:
这个报错是说明 DataNode 所装的Hadoop版本和其它节点不一致,应该检查DataNode的Hadoop版本

 

简答题:

1.请列出你所知道的hadoop调度器,并且简要说明其工作方法。

参考:https://www.cnblogs.com/skyl/p/4785681.html

hadoop调度器的作用是将系统中空闲的资源按一定策略分配给作业.
比较流行的三种调度器有:默认调度器FIFO,计算能力调度器Capacity Scheduler,公平调度器Fair Scheduler
1) 默认调度器FIFO
hadoop中默认的调度器,采用先进先出的原则
2) 计算能力调度器Capacity Scheduler
选择占用资源小,优先级高的先执行
3) 公平调度器Fair Scheduler
同一队列中的作业公平共享队列中所有资源

2.Hive有哪些方式保存元数据,各有哪些特点


通俗的讲,元数据就是存储在Hive中的数据的描述信息。

Hive中的元数据通常包括:表的名字,表的列和分区及其属性,表的属性(内部表和 外部表),表的数据所在目录。Hive元存储(Metastore)管理参数默认储存在自带的Derby数据库中。缺点就是不适合多用户操作,并且数据存储目录不固定。数据库和Hive所在的机器绑定,极度不方便管理。通常将元数据存储在我们自己创建的MySQL数据库(本地或远程)当中。

 

元数据存储两种方法:

1)derby数据库

默认内存数据库,一次只能打开一个会话,会话关闭metastore数据消失

2)MySQL数据库

外部metastore存储引擎,可以让多个会话使用



:
自带的Derby数据库
本地RDBMS数据库,即关系数据库管理系统(Relational Database Management System), 如MySQL
远程MySQL

 

26.flume介绍,采集日志时中间停了,怎么记录之前的日志?

 

当节点出现故障时,日志能够被传送到其他节点上而不会丢失

事件在通道中进行,该通道管理从故障中恢复。Flume支持一个由本地文件系统支持的持久文件通道。还有一个内存通道,它只是将事件存储在内存中的队列中,这更快,但是当代理进程死亡时仍然留在内存通道中的任何事件都无法恢复。

a)Flume提供了三种级别的可靠性保障,从强到弱依次分别为

i.end-to-end(收到数据agent首先将event写到磁盘上,当数据传送成功后,再删除;如果数据发送失败,可以重新发送)

ii.Store on failure(这也是scribe采用的策略,当数据接收方crash时,将数据写到本地,待恢复后,继续发送)

iii.Best effort(数据发送到接收方后,不会进行确认)

 

27.Sqoop在导入数据到mysql中,如何让数据不重复导入?如果存在数据问题sqoop如何处理?

答:增量导入。

指定--last-value

增量更新时指定增量或更新的键

 

 

 

在实际应用中还存在这样一个问题,比如导入数据的时候,Map Task 执行失败, 那么该 Map 任务会转移到另外一个节点执行重新运行,这时候之前导入的数据又要重新导入一份,造成数据重复导入。 因为 Map Task 没有回滚策略,一旦运行失败,已经导入数据库中的数据就无法恢复。

Sqoop export 提供了一种机制能保证原子性, 使用--staging-table 选项指定临时导入的表。

Sqoop export 导出数据的时候会分为两步:

第一步,将数据导入数据库中的临时表,如果导入期间 Map Task 失败,会删除临时表数据重新导入;

第二步,确认所有 Map Task 任务成功后,会将临时表名称为指定的表名称。

 

sqoop export \--connect jdbc:mysql://db.dajiangtai.net:3306/djtdb_hadoop \--username sqoop \--password sqoop \--table user \--staging-table staging_user

 

posted @ 2018-09-14 16:34  BoomOoO  阅读(2422)  评论(0编辑  收藏  举报