Java大数据工程师最常见的25道面试题,建议收藏

1、kafka 的message 包括哪些信息

一个Kafka 的Message 由一个固定长度的header 和一个变长的消息体body 组成
header 部分由一个字节的magic(文件格式)和四个字节的CRC32(用于判断body 消息体
是否正常)构成。当magic 的值为1 的时候,会在magic 和crc32 之间多一个字节的数据:
attributes(保存一些相关属性,比如是否压缩、压缩格式等等);如果magic 的值为0,那
么不存在attributes 属性

body 是由N 个字节构成的一个消息体,包含了具体的key/value 消息

2、怎么查看kafka 的offset

0.9 版本以上,可以用最新的Consumer client 客户端,有consumer.seekToEnd() / c
onsumer.position() 可以用于得到当前最新的offset

进大厂的其他资料

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、spark 集群运算的模式

Spark 有很多种模式,最简单就是单机本地模式,还有单机伪分布式模式,复杂的则运行
在集群中,目前能很好的运行在Yarn 和Mesos 中,当然Spark 还有自带的Standalo
ne 模式,对于大多数情况Standalone 模式就足够了,如果企业已经有Yarn 或者Mes
os 环境,也是很方便部署的。

standalone(集群模式):典型的Mater/slave 模式,不过也能看出Master 是有单点故障的;
Spark 支持ZooKeeper 来实现HA

on yarn(集群模式): 运行在yarn 资源管理器框架之上,由yarn 负责资源管理,Spar
k 负责任务调度和计算

on mesos(集群模式): 运行在mesos 资源管理器框架之上,由mesos 负责资源管理,
Spark 负责任务调度和计算

on cloud(集群模式):比如AWS 的EC2,使用这个模式能很方便的访问Amazon 的S
3;Spark 支持多种分布式存储系统:HDFS 和S3

5、HDFS 读写数据的过程

读:
1、跟namenode 通信查询元数据,找到文件块所在的datanode 服务器
2、挑选一台datanode(就近原则,然后随机)服务器,请求建立socket 流
3、datanode 开始发送数据(从磁盘里面读取数据放入流,以packet 为单位来做校验)
4、客户端以packet 为单位接收,现在本地缓存,然后写入目标文件

写:
1、根namenode 通信请求上传文件,

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值