Hadoop/Spark面试问题(上)

@[Hadoop/Spark面试问题]
hdfs作为存储的优点:
高容错性:数据自动保留多个副本,防止数据丢失。某一个副本丢失后他可以自动恢复。
适合批处理:通过移动计算,而不是移动数据。
适合大量数据的存储:存储GB、TB、PB都可以。
可以部署在廉价机器上。
HDFS如何存储(写入)数据:
文件上传 HDFS 的时候,Client 将文件切分成 一个一个的Block,然后进行存储。
与 NameNode 交互,获取文件的位置信息。NameNode是hadoop集群的主节点,主要来管理dataNode
与 DataNode 交互,读取或者写入数据。
HDFS 如何写入文件:
客户端通过调用 DistributedFileSystem 的create方法,创建一个新的文件。
DistributedFileSystem 通过 RPC(远程过程调用)调用 NameNode,去创建一个没有blocks关联的新文件。创建前,NameNode 会做各种校验,
比如文件是否存在,客户端有无权限去创建等。如果校验通过,NameNode 就会记录下新文件,否则就会抛出IO异常。
客户端开始写数据到DFSOutputStream,DFSOutputStream会把数据切成一个个小packet,然后排成队列 data queue。
DFSOutputStream 还有一个队列叫 ack queue,也是由 packet 组成,等待DataNode的收到响应,当pipeline中的所有DataNode都表示已经收到的时候,
这时akc queue才会把对应的packet包移除掉。
客户端完成写数据后,调用close方法关闭写入流。
DataStreamer 把剩余的包都刷到 pipeline 里,然后等待 ack 信息,收到最后一个 ack 后,通知 DataNode 把文件标示为已完成。
HDFS 如何读取文件:
首先调用FileSystem对象的open方法,其实获取的是一个DistributedFileSystem的实例。
DistributedFileSystem通过RPC(远程过程调用)获得文件的第一批block的locations,同一block按照重复数会返回多个locations,这些locations按照hadoop拓扑结构排序,距离客户端近的排在前面。
前两步会返回一个FSDataInputStream对象,该对象会被封装成 DFSInputStream对象,DFSInputStream可以方便的管理datanode和namenode数据流。
客户端调用read方法,DFSInputStream就会找出离客户端最近的datanode并连接datanode。
数据从datanode源源不断的流向客户端。
如果第一个block块的数据读完了,就会关闭指向第一个block块的datanode连接,接着读取下一个block块。这些操作对客户端来说是透明的,从客户端的角度来看只是读一个持续不断的流。
如果第一批block都读完了,DFSInputStream就会去namenode拿下一批blocks的location,然后继续读,如果所有的block块都读完,这时就会关闭掉所有的流。
简答说一下hadoop的map-reduce编程模型:
首先通过map task读取数据,然后转化成key-value形式的数据
转换数据类型,使用hadoop内置的数据类型。比如text,longWriteable
在mapper上进行一些业务处理,转化成key-value形式到reduce阶段
在reduce前进行partition分区操作。
最后reduce task通过网络将各个数据集进行reduce处理。
hadoop的TextInputFormat作用是什么,如何自定义实现?
1是getSplits,返回的是InputSplit数组,对数据进行split分片,每片交给map操作一次
2是getRecordReader,返回的是RecordReader对象,对每个split分片进行转换为key-value键值对格式传递给map
自定义类继承InputFormat接口,重写createRecordReader和isSplitable方法,在createRecordReader中可以自定义分隔符。
hadoop和spark的都是并行计算,那么他们有什么相同和区别?
两者都是用的MR模型来进行并行计算。hadoop一个任务成为一个job,分别在map task和reduce task中,两者都在自己的进程中运行,当task结束,job也就结束。
spark提交的任务称为application,一个application对应一个sparkContext。app中存在多个job,每触发一个action操作就会产生一个job。
这些job可以是并行也可以串行。但是hadoop中只有map和reduce。不像spark中提供了大量RDD的操作,groupBy,join等。
hadoop任务跑的数据是在hdfs上读取数据,就是磁盘上上读取数据,比较消耗IO,性能也不高。Spark数据存在内存中,比较好内存,性能较快。
简单说一下hadoop和spark的shuffle过程:
hadoop:map端保存分片数据,通过网络收集到reduce端
spark:spark的shuffle是在DAGSchedular划分Stage的时候产生的,TaskSchedule要分发Stage到各个worker的executor。
较少shuffle可以提高性能。
Hive中存放是什么?
表。
存的是和hdfs的映射关系,hive是逻辑上的数据仓库,实际操作的都是hdfs上的文件,HQL就是用sql语法来写的mr程序。

Hive与关系型数据库的关系?
没有任何关系。hive是主要用来做数据仓库的,但不能当成数据库。是一次写入多次读取的操作,可以看成ETL工具。
Hive是一个基于Hadoop的数据仓库平台。通过hive,我们可以方便地进行ETL的工作。hive定义了一个类似于SQL的查询语言:
HQL,能 够将用户编写的QL转化为相应的Mapreduce程序基于Hadoop执行。

Hive的数据放在哪儿?
数据在HDFS的warehouse目录下,一个表对应一个子目录。

数据库和hive数据仓储的区别?
数据库是面向事物设计的,数仓面向主体设计的。一般数据库存储在线交易数据,数仓存历史数据。作数据分析用。
数据库设计是尽量避免冗余,一般采用符合范式的规则来设计,数据仓库在设计是有意引入冗余,采用反范式的方式来设计。

Flume工作机制是什么?
核心概念是agent,里面包括source、chanel和sink三个组件。
source运行在日志收集节点进行日志采集,之后临时存储在chanel中,sink负责将chanel中的数据发送到目的地。
只有成功发送之后chanel中的数据才会被删除。
首先书写flume配置文件,定义agent、source、chanel和sink然后将其组装,执行flume-ng命令。

Sqoop工作原理是什么?
hadoop生态圈上的数据传输工具。可以将关系型数据库的数据导入非结构化的hdfs、hive或者hbase中,也可以将hdfs中的数据导出到关系型数据库或者文本文件中。
使用的是mr程序来执行任务,使用jdbc和关系型数据库进行交互。
import原理:通过指定的分隔符进行数据切分,将分片传入各个map中,在map任务中在每行数据进行写入处理没有reduce。
export原理:根据要操作的表名生成一个java类,并读取其元数据信息和分隔符对非结构化的数据进行匹配,多个map作业同时执行写入关系型数据库

这篇主要总结一些Hadoop生态圈的基本问题,下一篇是关于Spark生态圈的基本问题。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值