大数据面试题(一)

1、.hdfs写文件的步骤node

答案:算法

(1)client向NameNode申请上传…/xxx.txt文件数据库

(2)NN向client响应能够上传文件数组

(3)Client向NameNode申请DataNode缓存

(4)NN向Client返回DN1,DN2,DN3网络

(5)Client向DN1,DN2,DN3申请创建文件传输通道数据结构

(6)DN3,DN2,DN1依次响应链接架构

(7)Client向DN1上传一个block,DN1向DN2,DN3冗余文件app

2、hdfs读取文件步骤负载均衡

答案:

(1)client向NN请求下载…/xxx.txt文件

(2)NN向client返回文件的元数据

(3)Client向DN1请求访问读数据blk_1

(4)DN1向Client传输数据

(5)Client向DN2请求访问读数据blk_2

(6)DN2向Client传输数据

3、hadoop的shuffle过程

1.Map端的shuffle
Map端会处理输入数据并产生中间结果,这个中间结果会写到本地磁盘,而不是HDFS。每一个Map的输出会先写到内存缓冲区中,当写入的数据达到设定的阈值时,系统将会启动一个线程将缓冲区的数据写到磁盘,这个过程叫作spill。
  在spill写入以前,会先进行二次排序,首先根据数据所属的partition进行排序,而后每一个partition中的数据再按key来排序。partition的目是将记录划分到不一样的Reducer上去,以指望可以达到负载均衡,之后的Reducer就会根据partition来读取本身对应的数据。接着运行combiner(若是设置了的话),combiner的本质也是一个Reducer,其目的是对将要写入到磁盘上的文件先进行一次处理,这样,写入到磁盘的数据量就会减小。最后将数据写到本地磁盘产生spill文件(spill文件保存在{mapred.local.dir}指定的目录中,Map任务结束后就会被删除)。

  最后,每一个Map任务可能产生多个spill文件,在每一个Map任务完成前,会经过多路归并算法将这些spill文件归并成一个文件。至此,Map的shuffle过程就结束了。

2.Reduce端的shuffle

Reduce端的shuffle主要包括三个阶段,copy、sort(merge)和reduce。
  首先要将Map端产生的输出文件拷贝到Reduce端,但每一个Reducer如何知道本身应该处理哪些数据呢?由于Map端进行partition的时候,实际上就至关于指定了每一个Reducer要处理的数据(partition就对应了Reducer),因此Reducer在拷贝数据的时候只需拷贝与本身对应的partition中的数据便可。每一个Reducer会处理一个或者多个partition,但须要先将本身对应的partition中的数据从每一个Map的输出结果中拷贝过来。
  接下来就是sort阶段,也成为merge阶段,由于这个阶段的主要工做是执行了归并排序。从Map端拷贝到Reduce端的数据都是有序的,因此很适合归并排序。最终在Reduce端生成一个较大的文件做为Reduce的输入。

  最后就是Reduce过程了,在这个过程当中产生了最终的输出结果,并将其写到HDFS上。

 

4、fsimage和edit的区别?

当NN,SN要进行数据同步时叫作checkpoint时就用到了fsimage与edit,fsimage是保存最新的元数据的信息,当fsimage数据到必定的大小事会去生成一个新的文件来保存元数据的信息,这个新的文件就是edit,edit会回滚最新的数据。

 

5、简单说一下hadoop的map-reduce模型

首先map task会从本地文件系统读取数据,转换成key-value形式的键值对集合,使用的是hadoop内置的数据类型,如Text,Longwritable等。

将键值对集合输入mapper进行业务处理过程,将其转化成须要的key-value再输出。

以后会进行一个partition分区操做,默认使用的是hashpartitioner,能够经过重写hashpartitioner的getPartition方法来自定义分区规则。

以后会对key进行sort排序,grouping分组操做将相同key的value合并分组输出,在这里可使用自定义的数据类型,重写WritableComparator的Comparator方法来自定义排序规则,重写RawComparator的compara方法来自定义分组规则。

以后进行一个combiner归约操做,就是一个本地的reduce预处理,以减少shuffle,reducer的工做量。

Reduce task会用过网络将各个数据收集进行reduce处理,最后将数据保存或者显示,结束整个job。

6、运行hadoop集群须要哪些守护进程?

DataNode,NameNode,TaskTracker和JobTracker都是运行Hadoop集群须要的守护进程。

 

7、hadoop的TextInputFormat做用是什么,如何自定义实现?

InputFormat会在map操做以前对数据进行两方面的预处理。

1.是getSplits,返回的是InputSplit数组,对数据进行Split分片,每片交给map操做一次。

2.是getRecordReader,返回的是RecordReader对象,对每一个Split分片进行转换为key-value键值对格式传递给map经常使用的InputFormat是TextInputFormat,使用的是LineRecordReader对每一个分片进行键值对的转换,以行偏移量做为键,行内容做为值。

自定义类继承InputFormat接口,重写createRecordReaderisSplitable方法在createRecordReader中能够自定义分隔符。

 

8、hadoop和spark都是并行计算,那么他们有什么相同和区别?

二者都使用mr模型来进行并行计算,hadoop的一个做业称为job,job里面分为map task和reduce task,每一个task都是在本身的进程中运行的,当task结束时,进程也会结束。

Spark用户提交的任务称为application,一个application对应一个SparkContext,app中存在多个job,没触发一个action操做就会产生一个job。

这些job能够并行或者串行执行,每一个job有多个stage,stage是shuffle过程当中DAGSchaduler经过RDD之间的依赖关系划分job而来的,每一个stage里面有多个task,组成taskset有TaskSchaduler分发到各个executor中执行,executor的生命周期是和application同样的,即便没有job运行也是存在的,因此task能够快速启动读取内存进行计算的。

Hadoop的job只有map和reduce操做,表达能力比较欠缺并且在mr过程当中会重复的读写hdfs,形成大量的io操做,多个job须要本身管理关系。

Spark的迭代计算都是在内存中进行的,API中提供了大量的RDD操做join,groupby等,并且经过DAG图能够实现良好的容错。

 

9、为何要用flume导入hdfs,hdfs的架构是怎样的?

Flume能够实时的导入数据到hdfs中,当hdfs上的文件达到一个指定大小的时候会造成一个文件,或者超时所指定时间的话也造成一个文件。

文件都是存储在datanode上的,namenode存储着datanode的元数据信息,而namenode的元数据信息是存在内存中的,因此当文件切片很小或者不少的时候会卡死。

 

10、MR程序运行的时候会有什么比较常见的问题?

好比说做业中大部分都完成了,可是总有几个reduce一直在运行。

这是由于这几个reduce中的处理的数据要远远大于其余的reduce,多是对键值对任务划分的不均匀形成的数据倾斜。

解决的方法能够在分区的时候从新定义分区规则对于value数据不少的key能够进行拆分、均匀打散等处理,或者是在map端的combiner中进行数据预处理的操做。

 

11、简单说一下hadoop和spark的shuffle过程

Hadoop:map端保存分片数据,经过网络收集到reduce端。

Spark:spark的shuffle实在DAGSchedular划分Stage的时候产生的,TaskSchedular要分发Stage到各个worker的executor。减小shuffle能够提升性能。

12、hive中存放的是什么?

表。

存的是和hdfs的映射关系,hive是逻辑上的数据仓库,实际操做的都是hdfs上的文件,HQL就是用SQL语法来写的MR程序。

 

十3、Hive与关系型数据库的关系?

没有关系,hive是数据仓库,不能和数据库同样进行实时的CRUD操做。

是一次写入屡次读取的操做,能够当作是ETL的工具。

 

十4、Flume的工做及时是什么?

核心概念是agent,里面包括source,channel和sink三个组件。

Source运行在日志收集节点进行日志采集,以后临时存储在channel中,sink负责将channel中的数据发送到目的地。

只有发送成功channel中的数据才会被删除。

首先书写flume配置文件,定义agent、source、channel和sink而后将其组装,执行flume-ng命令。

 

十5、Hbase行键列族的概念,物理模型,表的设计原则?

行键:是hbase表自带的,每一个行键对应一条数据。

列族:是建立表时指定的,为列的集合,每一个列族做为一个文件单独存储,存储的数据都是字节数组,其中数据能够有不少,经过时间戳来区分。

物理模型:整个hbase表会拆分红多个region,每一个region记录着行键的起始点保存在不一样的节点上,查询时就是对各个节点的并行查询,当region很大时使用.META表存储各个region的起始点,-ROOT又能够存储.META的起始点。

Rowkey的设计原则:各个列族数据平衡,长度原则、相邻原则,建立表的时候设置表放入regionserver缓存中,避免自动增加和时间,使用字节数组代替string,最大长度64kb,最好16字节之内,按天分表,两个字节散列,四个字节存储时分毫秒。

列族的设计原则:尽量少(按照列族进行存储,按照region进行读取,没必要要的io操做),常常和不常用的两类数据放入不一样列族中,列族名字尽量短。

 

十6、请列出正常的hadoop集群中hadoop都分别须要启动 哪些进程,他们的做用分别都是什么,请尽可能列的详细一些。

namenode:负责管理hdfs中文件块的元数据,响应客户端请求,管理datanode上文件block的均衡,维持副本数量

Secondname:主要负责作checkpoint操做;也能够作冷备,对必定范围内数据作快照性备份。

Datanode:存储数据块,负责客户端对数据块的io请求

Jobtracker :管理任务,并将任务分配给 tasktracker。

Tasktracker: 执行JobTracker分配的任务。

ResourcemanagerNodemanagerJournalnodeZookeeperZkfc

 

十7、请说明hive中Sort By、Order By、Cluster By,Distribute By各表明什么意思?

order by:会对输入作全局排序,所以只有一个reducer(多个reducer没法保证全局有序)。只有一个reducer,会致使当输入规模较大时,须要较长的计算时间。

sort by:不是全局排序,其在数据进入reducer前完成排序。

distribute by:按照指定的字段对数据进行划分输出到不一样的reduce中。

cluster by:除了具备 distribute by 的功能外还兼具 sort by 的功能。

 

十8、HBase简单读写流程?

读:

找到要读数据的region所在的RegionServer,而后按照如下顺序进行读取:先去BlockCache读取,若BlockCache没有,则到Memstore读取,若Memstore中没有,则到HFile中去读。

写:

找到要写数据的region所在的RegionServer,而后先将数据写到WAL(Write-Ahead Logging,预写日志系统)中,而后再将数据写到Memstore等待刷新,回复客户端写入完成。

 

十9、HBase的特色是什么?

(1)hbase是一个分布式的基于列式存储的数据库,基于hadoop的HDFS存储,zookeeper进行管理。

(2)hbase适合存储半结构化或非结构化数据,对于数据结构字段不够肯定或者杂乱无章很难按一个概念去抽取的数据。

(3)hbase为null的记录不会被存储。

(4)基于的表包括rowkey,时间戳和列族。新写入数据时,时间戳更新,同时能够查询到之前的版本。

(5)hbase是主从结构。Hmaster做为主节点,hregionserver做为从节点。

 

二10、请描述如何解决Hbase中region过小和region太大带来的结果。

Region过大会发生屡次compaction,将数据读一遍并写一遍到hdfs上,占用io,region太小会形成屡次split,region会下线,影响访问服务,调整hbase.heregion.max.filesize为256m。