大数据面试题 -- 02
1.kafka出现消息堆积怎么办?
1、最简单的原因:消费者太少,增加消费者来解决
2、还有一个原因就是消费者每次poll的数据业务处理时间不能超过kafka的max.poll.interval.ms,该参数在kafka 0.10.2.1 中的默认值是300s,所以要综合业务数据来设置每次poll的数据量。
2.kafka如何实现高吞吐?
顺序读写
在硬盘中采用顺序读写的方式,性能损耗不大
零拷贝
“零拷贝技术”只用将磁盘文件的数据复制到页面缓存中一次,然后将数据从页面缓存直接发送到网络中(发送给不同的订阅者时,都可以使用同一个页面缓存),避免了重复复制操作。
文件分段
读取快速,定位快速。
批量发送
批量发送记录Offset。不是一次只发一条数据。
数据压缩
3.spark算子了解哪些,哪些算子会触发suffle?join会触发suffle吗?
两个RDD的分区数相同,在join的时候设置的分区数也相同,则在join阶段不会产生shuffle
两个RDD的分区数不同,在join的时候设置的分区数不同,则在join阶段都会产生shuffle
两个RDD的分区数不同,在join的时候设置的分区数和其中一个相同,则在join阶段不同的会产生shuffle
*也就是说,当两个rdd分区数和分区方式一样时做join就不会产生shuffle***
4.sqoop是不是和集群对应?
Sqoop只是一个将关系型数据库中的数据和hadoop生态体系的数据进行相互传输的工具,单节点就可以
5.flume怎么提高吞吐量?
可以配置source时批处理的配置batchsize增大;channel中的event条数配置加大;sink配置batchsize参数加大。在source端设置选择器将event写入多个channel中,channel使用memory.
6.Hbase怎么高效写入,如何模糊查询?
先写成一个hfile文件然后直接可以映射进去,比put快很多
模糊查询利用API:使用正则比较器写一个正则模糊查询,然后将比较器绑定到过滤器上,在将过滤器提交到hbase
7.kafka怎么保证一次,语义有哪几种?区别是什么?
使用幂等机制和事务机制来确保消息只发送一次.
语义有3种:
1.at most once : 意思是最多一次,数据不可能重复(类似 ack = 0)
2.at least once : 意思是最少一次,数据可能重复 (类似 ack = -1\all)
3.exactly once : 意思是正好一次,数据不可能重复 ,需要配合幂等机制来实现. 也就是 idempotent + at least once = exactly once (开启幂等机制的方法:在配置文件中添加 enable.idempotence = true)
8.## 机架感知了解吗
2.8.2之前是近近远 ,也就是客户端访问的服务器保存一份副本,与第一份副本同机架不同节点保存一份副本,与前两份副本不同机架随机节点保存一份副本
2.8.2之后是近远远 ,也就是客户端访问的服务器保存一份副本,与第一份副本不同机架随机节点存储一份副本,与第二份副本相同机架不同节点存储一份副本。
9.Dataframe和RDD的区别,要对比,他说DF比rdd效率高,为啥效率高?
RDD:弹性分布式数据集.是spark最底层的数据的抽象,内部的数据可以并行计算,是一种数据结构.
弹性:自动切换内存和磁盘;某一个RDD数据丢失,可以根据血缘从父RDD上重新计算;任务或者某一个阶段失败会自动进行重试;RDD中的数据是有分区的,分区的大小可以*设置和更细力度的调整.
分布式:就是可以存放在多个节点上.
数据集:就是一个存放数据的集合.
DataFrame比RDD多了一个schema元数据信息,可以说成是表名,表头,字段类型.
DF比RDD效率高的原因:
1.使用DF会使用Spark的解析器来对我们写的sql进行解析编译,并且进行优化,大部分情况下是要比开发人员写的要效率高.
2.DF使用列式存储
10.Spark2.x版的新特性
一、API
1. 出现新的上下文接口:SparkSession,统一了SQLContext和HiveContext,并且为SparkSession开发了新的流式调用的configuration API
2. 统一了DataFrame和DataSet。DataFrame相当于DataSet[Row],以及DataSet的增强聚合API
3. 增强了累加器accumulator的功能,支持Web UI,便捷的API,性能更高
二、SQL
1. 支持SQL2003标准
2. 支持ansi-sql 和hive ql的sql parser(SQL解析器)
3. 支持DDL,支持子查询(in/not in 、 exists/ not exists)
三、性能
1. 通过whole-stage-code generation(全流程代码生成)技术将SparkSQL和DataSet的性能提升了2~10倍。(在下一篇博文中会浅谈全流程代码生成技术)
2. 通过vectorization(向量化)技术提升parquet文件的扫描吞吐量
3. 提升orc文件的读写性能
4. 提升catalyst查询优化器的性能
5. 通过native实现方式提升窗口函数的性能
四、 Spark Streaming
1. Structured Streaming在Spark2.0中是测试版,2.0之后是released(发布)版,它基于SparkSQL和Catalyst引擎构建,支持DataFrame风格的API进行流式计算。
2. 基于DStream的API支持kafka0.10版本
五、Spark MLlib
1. 基于DataFrame的API支持持久化保存、加载模型、Pipeline,支持更多的算法,支持向量和矩阵使用性能更高的序列化机制。
2. Spark R支持MLlib算法,包括线性回归、朴素贝叶斯等
3. 未来Spark MLlib将主要基于DataSet API来实现,基于RDD和API将转为维护阶段
六、Other
1. 支持csv文件
2. 支持hive风格的bucket表
3. 支持缓存和程序运行的堆外内存管理
4. 完全移除了对akka的依赖
5. 使用Scala2.11代替了Scala2.10,要求基于Scala2.11版本进行开发,而不是Scala2.10
6. Mesos粗粒度模式下,支持启动多个Executor
11.kafka中的controller是干什么的?
Kafka集群中多个broker,有一个会被选举为controller leader,负责管理整个集群中分区和副本的状态,比如partition的leader 副本故障,由controller 负责为该partition重新选举新的leader 副本;当检测到ISR列表发生变化,有controller通知集群中所有broker更新其MetadataCache信息;或者增加某个topic分区的时候也会由controller管理分区的重新分配工作
当broker启动的时候,都会创建KafkaController对象,但是集群中只能有一个leader对外提供服务,这些每个节点上的KafkaController会在指定的zookeeper路径下创建临时节点,只有第一个成功创建的节点的KafkaController才可以成为leader,其余的都是follower。当leader故障后,所有的follower会收到通知,再次竞争在该路径下创建节点从而选举新的leader
KafkaController vs ReplicaManager
KafkaController: 负责管理整个集群中分区和副本的状态
ReplicaManager:负责管理当前broker所有分区和副本的信息,会处理KafkaController发起的一些请求,副本状态的切换,添加/读取消息等