大数据相关常见面试题与答案整理
爱萨萨
1、hadoop:
1)hadoop是大数据分析的完整生态系统,从数据采集,存储,分析,转运,再到页面展示,构成了整个流程
2)采集可以用flume,
3)存储用hbase,hdfs,mangodb就相当于hbase,
4)分析用Mapreduce自己写算法,
5)还有hive做数据仓库,
6)pig做数据流处理,
7)转储方面有sqoop,可以将hdfs中的数据转换存储到mysql,oracle等传统数据库,
这就构成了一整套大数据分析的整个流程
2、Hadoop 集群可以运行的 3 个模式分别是什么, 都有哪些注意点?
单机模式、伪分布式模式、全分布式模式;
3、Hadoop 的核心配置文件?
1)以前是hadoop-default.xml、hadoop-site.xml
2)现在是core-site.xml、hdfs-site.xml、mapred-site.xml;都在conf目录下;
4、hdfs-site.xml 的 3 个主要属性?
1)dfs.name.dir 决定的是元数据存储的路径以及 DFS 的存储方式(磁盘或是远端)
2)dfs.data.dir 决定的是数据存储的路径
3)fs.checkpoint.dir 用于第二 Namenode
5、简述HDFS的原理?
1)客户端向 nameNode 发送要上传文件的请求
2)nameNode 返回给用户是否能上传数据的状态
3)加入用户端需要上传一个 1024M 的文件,客户端会通过 Rpc 请求 NameNode,并返回需要上传给那些 DataNode(分配机器的距离以及空间的大小等),namonode会选择就近原则分配机器。
4)客户端请求建立 block 传输管道 chnnel 上传数据
5)在上传时 datanode 会与其他的机器建立连接并把数据块传送到其他的机器上
6)dataNode 向 namenode 汇报自己的储存情况以及自己的信息
7)当第一个快上传完后再去执行其他的复制的传送
6、简述MR(MapReduce)的原理?
1)当执行mr程序时,会执行一个Job
2)客户端的jobClick会请求namenode的jobTracker要执行任务
3)jobClick会去HDFS端复制作业的资源文件
4)客户端的jobClick会向namenode提交作业,让namenode做准备
5)Namenode的jobTracker会去初始化创建的对象
6)Namenode会获取hdfs的划分的分区
7)Namenode去检查TaskTracker的心跳信息,查看存活的机器
8)当执行的datenode执行任务时Datenode会去HDFS获取作业的资源的文件
9)TaskTracker会去执行代码,并登陆JVM的执行渠道
10)JVM或执行MapTask或者ReduceTask
11)执行终结
7、谈谈数据倾斜,如何发生的,并给出优化方案
数据的倾斜主要是两个的数据相差的数量不在一个级别上,在执行任务时就造成了数据的倾斜,可以通过分区的方法减少reduce数据倾斜性能的方法,例如:抽样和范围的分区、自定义分区、数据大小倾斜的自定义策略;
8、简单概括安装hadoop的步骤
1)创建 hadoop 帐户。
2)setup.改 IP。
3)安装 java,并修改/etc/profile 文件,配置 java 的环境变量。
4)修改 Host 文件域名。
5)安装 SSH,配置无密钥通信。
6)解压 hadoop。
7)配置 conf 文件下 hadoop-env.sh、core-site.sh、mapre-site.sh、hdfs-site.sh。
8)配置 hadoop 的环境变量。
9)Hadoop namenode -format
10)start-all.sh
9、怎样快速的杀死一个job
1)执行hadoop job -list 拿到job-id
2)Hadoop job kill hadoop-id
10、简单概述hadoop的combinet与partition的区别
1)combine和partition都是函数,中间的步骤应该只有shuffle!
2)combine分为map端和reduce端,作用是把同一个key的键值对合并在一起,可以自定义的;
3)partition是分割map每个节点的结果,按照key分别映射给不同的reduce,也是可以自定义的。这里其实可以理解归类。
11、hadoop的shuffer的概念
1)Shuffer是一个过程,实在map端到reduce在调reduce数据之前都叫shuffer,主要是分区与排序,也就是内部的缓存分分区以及分发(是reduce来拉数据的)和传输;
12、3 个 datanode 中有一个 个datanode 出现错误会怎样?
这个 datanode 的数据会在其他的 datanode 上重新做备份。
13、简单概述一下hadoop1与hadoop2的区别
1)Hadoop2与hadoop1最大的区别在于HDFS的架构与mapreduce的很大的区别,而且速度上有很大的提升;
2)hadoop2最主要的两个变化是:namenode可以集群的部署了,hadoop2中的mapreduce中的jobTracker中的资源调度器与生命周期管理拆分成两个独立的组件,并命名为YARN
14、hadoop的二次排序
1)Hadoop默认的是HashPartitioner排序,当map端一个文件非常大另外一个文件非常小时就会产生资源的分配不均匀,既可以使用setPartitionerClass来设置分区,即形成了二次分区。
15、mapreduce的combiner的作用是什么,什么时候不应该使用?
1)Mapreduce中的Combiner就是为了避免map任务和reduce任务之间的数据传输而设置的,Hadoop允许用户针对map task的输出指定一个合并函数。即为了减少传输到Reduce中的数据量。它主要是为了削减Mapper的输出从而减少网络带宽和Reducer之上的负载。
2)在数据量较少时不宜使用。
16、你对zookeeper的理解?
1)随着大数据的快速发展,多机器的协调工作,避免主要机器单点故障的问题,于是就引入管理机器的一个软件,他就是zookeeper来协助机器正常的运行。
2)Zookeeper有两个角色分别是leader与follower ,其中leader是主节点,其他的是副节点,在安装配置上一定要注意配置奇数个的机器上,便于zookeeper快速切换选举其他的机器。
3)在其他的软件执行任务时在zookeeper注册时会在zookeeper下生成相对应的目录,以便zookeeper去管理机器。
17、hive是怎样保存元数据的?
1)保存元数据的方式有:内存数据库rerdy,本地mysql数据库,远程mysql数据库;
2)但是本地的mysql数据用的比较多,因为本地读写速度都比较快
18、Hive中外部表与内部表的区别
1)Hive 创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径,不对数据的位置做任何改变。
2)在删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据。这样外部表相对来说更加安全些,数据组织也更加灵活,方便共享源数据。
19、对于 hive,你写过哪些 UDF 函数,作用是什么?
1)UDF: user defined function 的缩写,
1)编写hive udf的两种方式extends UDF 重写evaluate第二种extends GenericUDF重写initialize、getDisplayString、evaluate方法
20、Hive 的 sort by 和 order by 的区别
1)order by 会对输入做全局排序,因此只有一个reducer(多个reducer无法保证全局有序)只有一个reducer,会导致当输入规模较大时,需要较长的计算时间。
2)sort by不是全局排序,其在数据进入reducer前完成排序.因此,如果用sort by进行排序,并且设置mapred.reduce.tasks>1, 则sort by只保证每个reducer的输出有序,不保证全局有序。
21、Hbase 的 rowkey 怎么创建比较好?列族怎么创建比较好?
1)Rowkey是一个二进制码流,Rowkey的长度被很多开发者建议说设计在10~100个字节,不过建议是越短越好,不要超过16个字节。在查找时有索引会加快速度。
2)Rowkey散列原则 、 Rowkey唯一原则 、 针对事务数据Rowkey设计 、 针对统计数据的Rowkey设计 、 针对通用数据的Rowkey设计、 支持多3)总结设计列族:
a、一般不建议设计多个列族
b、数据块的缓存的设计
c、激进缓存设计
d、布隆过滤器的设计(可以提高随机读取的速度)
e、生产日期的设计
f、列族压缩
g、单元时间版本
22、hive 如何调优?
1)在优化时要注意数据的问题,尽量减少数据倾斜的问题,减少job的数量,同事对小的文件进行成大的文件,
2)如果优化的设计那就更好了,因为hive的运算就是mapReduce所以调节mapreduce的参数也会使性能提高,如调节task的数目。
23、hbase 写数据的原理
1)首先,Client通过访问ZK来请求目标数据的地址。
2)ZK中保存了-ROOT-表的地址,所以ZK通过访问-ROOT-表来请求数据地址。
3)同样,-ROOT-表中保存的是.META.的信息,通过访问.META.表来获取具体的RS。
4).META.表查询到具体RS信息后返回具体RS地址给Client。
5)Client端获取到目标地址后,然后直接向该地址发送数据请求
24、hbase宕机了如何处理?
1)HBase的RegionServer宕机超过一定时间后,HMaster会将其所管理的region重新分布到其他活动的RegionServer上,由于数据和日志都持久在HDFS中,该操作不会导致数据丢失。所以数据的一致性和安全性是有保障的。
2)但是重新分配的region需要根据日志恢复原RegionServer中的内存MemoryStore表,这会导致宕机的region在这段时间内无法对外提供服务。
3)而一旦重分布,宕机的节点重新启动后就相当于一个新的RegionServer加入集群,为了平衡,需要再次将某些region分布到该server。
4)因此,Region Server的内存表memstore如何在节点间做到更高的可用,是HBase的一个较大的挑战。
25、Hbase 中的 metastore 用来做什么的?
1)Hbase的metastore是用来保存数据的,
2)其中保存数据的方式有有三种第一种于第二种是本地储存,第二种是远程储存这一种企业用的比较多
26、hbase是怎样预分区的?
如何去进行预分区,可以采用下面三步:
1)取样,先随机生成一定数量的rowkey,将取样数据按升序排序放到一个集合里
2)根据预分区的region个数,对整个集合平均分割,即是相关的splitKeys.
3)HBaseAdmin.createTable(HTableDescriptor tableDescriptor,byte[][] splitkeys)可以指定预分区的splitKey,即是指定region间的rowkey临界值
27、怎样将 mysql 的数据导入到 hbase 中?
1)不能使用 sqoop,速度太慢了,提示如下:
A、一种可以加快批量写入速度的方法是通过预先创建一些空的 regions,这样当数据写入 HBase 时,会按照 region 分区情况,在集群内做数据的负载均衡。
B、hbase 里面有这样一个 hfileoutputformat 类,他的实现可以将数据转换成 hfile格式,通过 new 一个这个类,进行相关配置,这样会在 hdfs 下面产生一个文件,这个时候利用 hbase 提供的 jruby 的 loadtable.rb 脚本就可以进行批量导入。
28、Redis, 传统数据库,hbase,hive 每个之间的区别?
1)Redis 是基于内存的数据库,注重实用内存的计算,
2)hbase是列式数据库,无法创建主键,地从是基于HDFS的,每一行可以保存很多的列,
3)hive是数据的仓库,是为了减轻mapreduce而设计的,不是数据库,是用来与hadoop做交互的。
29、HBase scan setBatch和setCaching的区别
1)scan可以通过setCaching与setBatch方法提高速度(以空间换时间),
2)setCaching设置的值为每次rpc的请求记录数,默认是1;cache大可以优化性能,但是太大了会花费很长的时间进行一次传输。
3)setBatch设置每次取的column size;有些row特别大,所以需要分开传给client,就是一次传一个row的几个column。
30、flume 不采集 Nginx 日志,通过 Logger4j 采集日志,优缺点是什么?
1)在nginx采集日志时无法获取session的信息,然而logger4j则可以获取session的信息,
2)logger4j的方式比较稳定,不会宕机。缺点:不够灵活,logger4j的方式和项目结合过滤紧密,而flume的方式就比较灵活,便于插拔式比较好,不会影响项目的性能。
31、flume 和 kafka 采集日志区别,采集日志时中间停了,怎么记录之前的日志。
1)Flume 采集日志是通过流的方式直接将日志收集到存储层,而 kafka 将日志缓存在 kafka集群,待后期可以采集到存储层。
2)Flume 采集中间停了,可以采用文件的方式记录之前的日志,而 kafka 是采用 offset(偏移量) 的方式记录之前的日志。
32、kafka 中怎样储存数据结构的,data.....目录下有多少个分区,每个分区的存储格式是什么样的?
1)topic 是按照“主题名-分区”存储的
2)分区个数由配置文件决定
3)每个分区下最重要的两个文件是 0000000000.log 和 000000.index,0000000.log,以默认 1G 大小回滚。
33、mr 和 spark 区别,怎么理解 spark-rdd
1)Mr 是文件方式的分布式计算框架,是将中间结果和最终结果记录在文件中,map 和 reduce的数据分发也是在文件中。
2)spark 是内存迭代式的计算框架,计算的中间结果可以缓存内存,也可以缓存硬盘,但是不是每一步计算都需要缓存的。
3)spark-rdd 是一个数据的分区记录集合,是利用内存来计算的,spark之所以快是因为有内存的模式
34、你们的集群规模?
1)这个得看个人在公司的规模,下面介绍一下我们公司的一些配置:
联想System x3750 服务器,价格3.5万,内存容量32G,产品类型机架式,硬盘接口SSD,CPU频率2.6GH,CPU数量2颗,三级缓存15MB,cpu核心6核,cpu线程数12线程,最大内存支持1.5T,网络是千兆网卡,可插拔时硬盘接口12个卡槽,配置1T的容量
详细:http://detail.zol.com.cn/server/index1101243.shtml
名字 | 软件 | 运行管理 |
Hadoop1 | JDK,hadoop | namenode |
Hadoop2 | JDK,hadoop | namenode |
Hadoop3 | JDK,hadoop | secondaryNamenode |
Hadoop4 | JDK,hadoop | secondaryNamenode |
Hadoop5 | JDK,hadoop | datanode |
Hadoop6 | JDK,hadoop | datanode |
Hadoop7 | JDK,hadoop | datanode |
Hadoop8 | JDK,hadoop | datanode |
Hadoop9 | JDK,hadoop | datanode |
Hadoop10 | JDK,zookeeper,tomcat,mvn,kafka | leader |
Hadoop11 | JDK,zookeeper,tomcat,mvn,kafka | follower |
Hadoop12 | JDK,zookeeper,tomcat,mvn,kafka | follower |
Hadoop13 | JDK,hive,mysql,svn,logstarh | hive,mysql,svn |
Hadoop14 | JDK,hbase,mysql备份 | datanode |
Hadoop15 | JDK,nginx,Log日志手机 | datanode |
数据就是每天访问的Log日志不是很大,有的时候大有的时候小的可怜
35、你在项目中遇到了哪些难题,是怎么解决的?
1)在执行任务时发现副本的个数不对,经过一番的查找发现是超时的原因,修改了配置文件hdfs-site.xml:中修改了超时时间。
2)由于当时在分配各个目录空间大小时,没有很好的分配导致有的目录的空间浪费,于是整体商量后把储存的空间调大了一些。