随着5G终端的快速增长,产生大量的数字信息,这些数据的采集和挖掘对于企业、政府具有重大意义。目前,对于海量数据的存储和挖掘存在诸多难题,例如:大数据技术人才的匮乏、中小企业开发成本过高,大数据生态的不成熟等问题。本文旨在与大数据开发人员一起学习探讨大数据开发技术问题。有兴趣的可以互关进圈哈。
(1)Java基础、数据结构与算法、计算机网络基础
(2)Linux基础
(3)Hadoop海量数据平台的搭建(Ambari/CDH)
(4)Hadoop集群的核心组件:hdfs、yarn和mapreduce
(5)数据中间件:rabbitmq/kafka/rocketmq、elastic search、redis、hbase、mongodb等
(6)数据查询和计算引擎:hive、spark、flink等
(7)机器学习、深度学习、数据挖掘(统计分析)等算法技术
(8)数据的可视化开发(驾驶舱、表报统计)
(9)项目经验:大数据运维、数仓开发、可视化开发、数据分析和数据挖掘
(1)haooop核心组件介绍
hdfs、yarn和mapreducess
(2)你自己搭过大数据集群吗?那你说说搭建hadoop集群的3个xml文件
core-site.xml、hdfs-site.xml、mapred-site.xml
(3)正常的hadoop集群工作都会启动哪些进程?他们的作用分别是什么?
NameNode DataNode Secondary NameNode
NameNode:主节点,负责维护整个Hdfs文件系统的目录树,以及每个文件所对应的block块信息(元数据)。
DataNode:从节点,负责存储具体的文件数据,并且每个block可以在多个DataNode上存储多个副本。
Secondary NameNode:相当于一个备用的NameNode, 当NameNode死机之后,可以将Secondary NameNode的数据备份到NameNode上面 ,但不能备份完整数据,它有两大功能:
1 镜像备份,
2 日志与镜像定期合并。
Secondary NameNode会经常向NameNode发送请求,是否满足check。
当条件满足时,Secondary NameNode将进行CheckPoint 。
这时NameNode 滚动当前正在写的edits,将刚刚滚动掉的和之前edits文件进行合并。Secondary NameNode下载edis文件,然后将edits文件和自身保存的fsimage文件在内存中进行合并,然后写入磁盘并上传新的fsimage到nameNode,这时NameNode将旧的fsimage用新的替换掉。
(4)HDFS的块默认是保存几份?一个块多大?
默认保存是3份,一个块是128M。
hadoop 1.0 默认是64M, hadoop 2.0 由64M 改为128M
主要是磁盘的存储决定 块的大小,块组成的文件的大小取决于磁盘的传输速率,调整磁盘,可以改变块的大小。
(5)Hdfs的读写过程你了解吗?简单讲讲?
1、客户端跟NameNode 通信,请求上传文件,NameNode检查文件,父目录是否存在,并向客户端返回是否可以上传文件
2、客户端请求第一个block块该上传到哪个DataNode服务器上,NameNode查询从节点之后,返回对应的DataNode 服务器A,B,C等。
3、客户端请求NameNode服务器,采取就近原则,选择A服务器上传数据(本质上是个RPC调用,建立PipeLine),A收到
请求后,A调B,B调C,将每个pipline建立连接,然后逐级返回给客户端
4、客户端开始往A上传第一个block,以Package为单位,A收到一个Package,就会传给B,B传给C,A每传一个package就会放入一个应答队列,等待应答。
5、当第一个block传输完成后,客户端再次请求NameNode上传第二个block。
(6)说一下MapReduce的工作原理?
1、客户端启动一个job,然后向JobTracker请求一个jobID
2、 然后将运行所需要的资源文件上传到HDFS上,包括MapReduce程序打包的jar包,配置文件,以及计算的输入划分信息等
3、 这些文件全部存储在JobTracker专门创建的JobID文件夹中(jar文件会有10个副本,输入划分信息对应着JobTracker应该启动多少个Map任务)
4、JobTracker将这些资源文件放入作业队列中,调度器根据调度算法对作业文件进行调度,根据输入划分信息划分Map任务
并将map任务分配给TaskTracker执行。
5、TaskTracker每隔一段时间发送给JobTracker一个心跳,告诉它自己的运行情况,这个心跳中包含map任务完成的进度等。
6、当最后一个任务完成后,JobTracker会将该任务设为成功,返回给客户端。客户端得到结果,得知任务完成便显示消息给用户。
(7)具体讲一下map中的一些步骤,例如partition,sort,combiner,shuffle
好的,sort 主要是排序,combiner是合并,partition是分片等。
首先Mapper根据文件进行分区,sort将Mapper产生的结果按照key进行排序,combiner将key相同的记录进行合并,partition是把数据均衡的分配个Reducer. shuffle是Mapper将结果传给Reduce,在这期间容易发生数据倾斜等。
(8)数据倾斜一般是在Mapper端发生的还是Reduce中发生的?
Mapper将数据处理完传给Reduce,当Reduce进行处理时,因为一部分key的数据量过大,导致其他分区已经执行完成而数据量过大的key执行时间过长,所以数据倾斜是发生在Reduce端的。
(9)数据倾斜是因为这个key分布不均匀,那你会怎么优化呢?
可以在Mapper期间将大数据量相同的key进行分散,通过添加N以内的随机数前缀,对数据较多的Key进行子扩展,先进行局部操作,再去除随机数之后进行聚合操作,避免在进行Shuffle操作时出现数据倾斜问题。
(10)Mapper端进行combiner之后,除了速度会提升,那从Mapper端到Reduce端的数据量会怎么变?
数据量会减少,因为combiner之后,会将相同的key进行一次聚合,数据量会在这时候减少一部分
(11)map 输出的数据如何超出他的那个小文件内存之后,那他是落地到磁盘还是落地到HDFS中?
落地到磁盘中,因为map,reduce操作,就是一次次的I/O请求
(12)Map到Reduce默认的分区机制是什么?
据那个hash进行计算 对map中的key做hash,对reduce个数取模
(13)hadoop的调优主要针对配置文件的调优你知道哪几种?
1、因为MapReduce运算时是在磁盘中进行的,所以 通过修改磁盘I/O,也就是设置和的预读缓冲区大小
来提高hadoop里面大文件顺序读的性能。以此来提高I/O性能。
2、通过修改三个配置文件的参数如 core-site.xml,mapred-site.xml,hdfs-site.xml等
例如 修改core 文件里面的buffer.size,来修改读写缓冲区的大小,还有hdfs文件里面的block.size修改块的大小等都可以进行调优
(14)出个题,现在有1G的数据文件,里面有四个字段,分别是id,name,age,class,然后要按照class来分组
id来排序,口述一下MapReduce的过程是怎么实现的?这里面会有几个map?思考了一下
1、首先1G文件,那默认一个块是128M,所以可以分为8个块,对应的就是8个Mapper
2、然后定义一个对象,将四个属性封装到对象中,实现序列化和反序列化
3、定义一个类继承partitioner类,调用对象中的class属性设置分组,
4、在map端对文件进行读取,然后通过Split来进行分割,调用对象的id作为key,然后进行局部sort排序,在combiner局部聚合后通过reduce来进行整体聚合。
(15)说说yarn吧,它有什么优势,能解决什么问题?
yarn集群主要分为主节点ResourceManager,从节点 NodeManage ResourceManage负责资源的分配,将集群的资源分配给各个应用使用,资源分配的基本单元是Container,NodeManage则是一个计算节点的管理者,负责启动应用的所需的Conbiner,并对内部资源进行监控等。yarn一般和mapreduce进行结合,主要是对MapReduce中的资源计算进行维护等。
(16)Spark为啥比Mapreduce运行块,原因都有哪些?
1、spark是基于内存计算,mapreduce是基于磁盘运算,所以速度快
2、spark拥有高效的调度算法,是基于DAG,形成一系列的有向无环图
3、spark 是通过RDD算子来运算的,它拥有两种操作,一种转换操作,一种动作操作,可以将先运算的结果存储在内存中,随后在计算出来
4、spark 还拥有容错机制Linage
(17)什么是RDD?
RDD就是弹性分布式数据集,可以理解为一种数据结构,拥有多种不同的RDD算子。
(18)你都知道哪些RDD算子?
比如转换操作,有map().fliter() flatMap(),distinct()等
动作操作 有 collect ,reduce 等.
(19)reduceBykey 和groupBykey有啥区别吗?
reduceByKey会在结果发送至reducer之前会对每个mapper在本地进行merge,有点类似于在MapReduce中的combiner。这样做的好处在于,在map端进行一次reduce之后,数据量会大幅度减小, 从而减小传输,保证reduce端能够更快的进行结果计算。groupByKey会对每一个RDD中的value值进行聚合形成一个序列(Iterator),此操作发生在reduce端, 所以势必会将所有的数据通过网络进行传输,造成不必要的浪费。同时如果数据量十分大, 可能还会造成OutOfMemoryError。
(20)现在有一个业务,当SparkStreaming在消费kafka里面的数据,然后消费了一段时间之后,程序挂了,当下一次程序启动时如何保证SparkStraming能继续消费kafka之前的位置?
可以依靠checkPoint机制来保证,每次SparkStreaming消费kafka数据后,将消费的kafka offsets更新到checkpoint,当程序挂机或升级时,就可以用过读取checkpoint 的记录来接着上次的位置进行读取,实现数据的零丢失。
还可以在sparkStreaming中另外启动一个预写日志,这将同步保存所有收到的kafka数据导入hdfs中,以便发生故障时,恢复到上次的位置和之前的数据。
(21)说说Spark的广播变量?
Spark中因为算子中的真正逻辑是发送到Executor中去运行的,所以当Executor中需要引用外部变量时,需要使用广播变量。广播变量只能在Driver端定义,不能在Executor端定义,在Driver端可以修改广播变量的值,在Executor端无法修改广播变量的值。
(22)你知道累加器吗?
之前看过一点,累机器相当于统筹大变量,常用于计数,统计。累加器常常被作为rdd的map filter操作的副产品等。
(23)说说spark中 job,stage,task,分别代表什么?
Job简单讲就是提交给spark的任务。
Stage是每一个job处理过程要分为的几个阶段。
Task是每一个job处理过程要分几次任务。Task是任务运行的最小单位。最终是要以task为单位运行在executor中。
(24)说说Spark的工作机制?
用户在客户端提交job作业后,会由driver运行main方法并创建SparkContext上下文。执行RDD算子,形成DAG图,然后将DAG图交给DAGScheduler来处理。DAGScheduler按照RDD之间的依赖关系划分stage,输入task Scheduler,task Scheduler会将stage划分为task set分发到各个节点的executer中执行,executor以多线程的方式执行,每个线程负责一个任务,任务结束后,根据不同类型的任务返回不同的结果。
(25) 了解zookeeper吗?
zookeeper 是一个分布式协调服务,zookeeper集群包括 leader 和 follow.
zookeeper的选举过程,比如现在有五台机器,ABCDE依次启动起来,那么哪台是leader?
1.首先更新logicalclock并提议自己为leader并广播出去
2.进入本轮投票的循环
3.从recvqueue队列中获取一个投票信息,如果为空则检查是否要重发自己的投票或者重连,否则
判断投票信息中的选举状态.
(26)hive了解吗?
Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能
(27) 说说内部表和外部表的区别?
内部表的数据是由Hive自身管理的,
外部表的数据是由HDFS管理的;
删除内部表会删除元数据和存储的数据;
删除外部表只删除元数据不删除存储的数据.
(28)知道UDF吗?
UDF就是Hive提供的内置函数无法满足业务处理需要时,可以考虑使用用户自定义函数。
(29)一张大表,一张小表,你写join in时,哪个表放左边,哪个表放右边?
小表放前,大表放后,左查询,根据小表为主进行查询。
(30) 问一下kafka的问题吧,kafka是怎么进行数据备份的?
备份机制是Kafka0.8版本之后出的,一个备份数量为n的集群允许n-1个节点失败。在所有备份节点中,有一个节点作为lead节点,这个节点保存了其它备份节点列表,并维持各个备份间的状态同步。
(31)消费者是从leader中拿数据,还是从follow中拿数据?
写是都往leader上写,但是读并不是任意flower上读都行,读也只在leader上读,flower只是数据的一个备份,
kafka是由follower周期性或者尝试去pull(拉)过来(其实这个过程与consumer消费过程非常相似),
保证leader被挂掉后顶上来,并不往外提供服务。
(32)说说kafka的ISR机制?
kafka 为了保证数据的一致性使用了isr 机制,
leader会维护一个与其基本保持同步的Replica列表,该列表称为ISR(in-sync Replica),每个Partition都会有一个ISR,
而且是由leader动态维护
如果一个flower比一个leader落后太多,或者超过一定时间未发起数据复制请求,则leader将其从ISR中移除
当ISR中所有Replica都向Leader发送ACK时,leader才commit
(33)kafka如何保证数据的不重复和不丢失?
答案上面已经回到了
(34)kafka里面存的数据格式都是什么样的?
topic主题,然后主题进行分区 topic 分为partition , partition里面包含Message。
(35)kafka中存的一个是数据文件,一个是索引文件,说说这个?
。。。。。不太会。。。哇,kafka被虐惨啦
(36)kafka 是如何清理过期数据的?
kafka的日志实际上是以日志的方式默认保存在/kafka-logs文件夹中的,默认7天清理机制,
日志的真正清理时间。当删除的条件满足以后,日志将被“删除”,但是这里的删除其实只是将 该日志进行了“delete”标注,文件只是无法被索引到了而已。但是文件本身,仍然是存在的,只有当过了log.segment.delete.delay.ms 这个时间以后,文件才会被真正的从文件系统中删除。
(37) 一条message中包含哪些信息?
包含 header,body
一个Kafka的Message由一个固定长度的header和一个变长的消息体body组成。
header部分由一个字节的magic(文件格式)和四个字节的CRC32(用于判断body消息体是否正常)构成。
当magic的值为1的时候,会在magic和crc32之间多一个字节的数据:attributes(保存一些相关属性,比如是否压缩、
压缩格式等等);
如果magic的值为0,那么不存在attributes属性body是由N个字节构成的一个消息体,包含了具体的key/value消息
(38)mysql的最左原则吗?
最左原则:顾名思义,就是最左优先,比如现在有一张表,里面建了三个字段ABC,对A进行主键,BC建立索引,就相当于创建了多个索引,A索引,(A,B)组合索引,(A,B,C)组合索引,那查询时,会根据查询最频繁的 放到最左边。
(注意:本文部分技术面试答题摘录过来的,如有侵权,可告知删除。)