⼤数据⾯试题以及答案整理(⼀)
kafka的message包括哪些信息
⼀个Kafka的Message由⼀个固定长度的header和⼀个变长的消息体body组成
header部分由⼀个字节的magic(⽂件格式)和四个字节的CRC32(⽤于判断body消息体是否正常)构成。当magic的值为1的时候,会在magic 和crc32之间多⼀个字节的数据:attributes(保存⼀些相关属性,⽐如是否压缩、压缩格式等等);如果magic的值为0,那么不存在attributes 属性
body是由N个字节构成的⼀个消息体,包含了具体的key/value消息
怎么查看kafka的offset
0.9版本以上,可以⽤最新的Consumer client 客户端,有consumer.seekToEnd() / consumer.position() 可以⽤于得到当前最新的offset:
hadoop的shuffle过程
⼀、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过程就结束了。
⼆、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上。
spark集运算的模式
Spark 有很多种模式,最简单就是单机本地模式,还有单机伪分布式模式,复杂的则运⾏在集中,⽬前能很好的运⾏在 Yarn和 Mesos 中,当然 Spark 还有⾃带的 Standalone 模式,对于⼤多数情况 Standalone 模式就⾜够了,如果企业已经有 Yarn 或者 Mesos 环境,也是很⽅便部署的。
standalone(集模式):典型的Mater/slave模式,不过也能看出Master是有单点故障的;Spark⽀持ZooKeeper来实现 HA
on yarn(集模式):运⾏在 yarn 资源管理器框架之上,由 yarn 负责资源管理,Spark 负责任务调度和计算
on mesos(集模式):运⾏在 mesos 资源管理器框架之上,由 mesos 负责资源管理,Spark 负责任务调度和计算
on cloud(集模式):⽐如 AWS 的 EC2,使⽤这个模式能很⽅便的访问 Amazon的 S3;Spark ⽀持多种分布式存储系统:HDFS 和 S3
HDFS读写数据的过程
读:
1、跟namenode通信查询元数据,到⽂件块所在的datanode服务器
2、挑选⼀台datanode(就近原则,然后随机)服务器,请求建⽴socket流
3、datanode开始发送数据(从磁盘⾥⾯读取数据放⼊流,以packet为单位来做校验)
4、客户端以packet为单位接收,现在本地缓存,然后写⼊⽬标⽂件
写:
1、根namenode通信请求上传⽂件,namenode检查⽬标⽂件是否已存在,⽗⽬录是否存在
2、namenode返回是否可以上传
3、client请求第⼀个 block该传输到哪些datanode服务器上
4、namenode返回3个datanode服务器ABC
5、client请求3台dn中的⼀台A上传数据(本质上是⼀个RPC调⽤,建⽴pipeline),A收到请求会继续调⽤B,然后B调⽤C,将真个pipeline建⽴完成,逐级返回客户端
6、client开始往A上传第⼀个block(先从磁盘读取数据放到⼀个本地内存缓存),以packet为单位,A收到⼀个packet就会传给B,B传给
C;A每传⼀个packet会放⼊⼀个应答队列等待应答
7、当⼀个block传输完成之后,client再次请求namenode上传第⼆个block的服务器。
RDD中reduceBykey与groupByKey哪个性能好,为什么
reduceByKey:reduceByKey会在结果发送⾄reducer之前会对每个mapper在本地进⾏merge,有点类似于在MapReduce中的combiner。这样做的好处在于,在map端进⾏⼀次reduce之后,数据量会⼤幅度减⼩,从⽽减⼩传输,保证reduce端能够更快的进⾏结果计算。
groupByKey:groupByKey会对每⼀个RDD中的value值进⾏聚合形成⼀个序列(Iterator),此操作发⽣在reduce端,所以势必会将所有的数据通过⽹络进⾏传输,造成不必要的浪费。同时如果数据量⼗分⼤,可能还会造成OutOfMemoryError。
通过以上对⽐可以发现在进⾏⼤量数据的reduce操作时候建议使⽤reduceByKey。不仅可以提⾼速度,还是可以防⽌使⽤groupByKey造成的内存溢出问题。
spark sql怎么取数据的差集
好像不⽀持
spark2.0的了解
更简单:ANSI SQL与更合理的API
速度更快:⽤Spark作为编译器
更智能:Structured Streaming
rdd 怎么分区宽依赖和窄依赖
宽依赖:⽗RDD的分区被⼦RDD的多个分区使⽤例如 groupByKey、reduceByKey、sortByKey等操作会产⽣宽依赖,会产⽣shuffle
窄依赖:⽗RDD的每个分区都只被⼦RDD的⼀个分区使⽤例如map、filter、union等操作会产⽣窄依赖
spark streaming 读取kafka数据的两种⽅式
这两种⽅式分别是:
Receiver-base
使⽤Kafka的⾼层次Consumer API来实现。receiver从Kafka中获取的数据都存储在Spark Executor的内存中,然后Spark Streaming启动的job会去处理那些数据。然⽽,在默认的配置下,这种⽅式可能会因为底层的失败⽽丢失数据。如果要启⽤⾼可靠机制,让数据零丢失,就必须启⽤Spark Streaming的预写⽇志机制(Write Ahead Log,WAL)。该机制会同步地将接收到的Kafka数据写⼊分布式⽂件系统(⽐如HDFS)上的预写⽇志中。所以,即使底层节点出现了失败,也可以使⽤预写⽇志中的数据进⾏恢复。
Direct
Spark1.3中引⼊Direct⽅式,⽤来替代掉使⽤Receiver接收数据,这种⽅式会周期性地查询Kafka,获得每个topic+partition的最新的offset,从⽽定义每个batch的offset的范围。当处理数据的job启动时,就会使⽤Kafka的简单consumer api来获取Kafka指定offset范围的数据。kafka的数据存在内存还是磁盘
jvm面试题总结及答案
Kafka最核⼼的思想是使⽤磁盘,⽽不是使⽤内存,可能所有⼈都会认为,内存的速度⼀定⽐磁盘快,我也不例外。在看了Kafka的设计思想,查阅了相应资料再加上⾃⼰的测试后,发现磁盘的顺序读写速度和内存持平。
⽽且Linux对于磁盘的读写优化也⽐较多,包括read-ahead和write-behind,磁盘缓存等。如果在内存做这些操作的时候,⼀个是JAVA对象的内存开销很⼤,另⼀个是随着堆内存数据的增多,JAVA的GC时间会变得很长,使⽤磁盘操作有以下⼏个好处:
磁盘缓存由Linux系统维护,减少了程序员的不少⼯作。
磁盘顺序读写速度超过内存随机读写。
JVM的GC效率低,内存占⽤⼤。使⽤磁盘可以避免这⼀问题。
系统冷启动后,磁盘缓存依然可⽤。
怎么解决kafka的数据丢失

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。