大数据工程师入职京东年薪37w(附:面试真题分享)
总结:引导面试官到自己擅长的领域,掌握主动权,问题回答不一定完整,说出关键点即可。
1、项目规模,一天/月数据量,各组件版本?
数据规模:一般100M数据由300万条数据;数据量:上百G;条数:达到几十亿条数据
美团数据规模:负责每天数百GB的数据存储和分析
2、Spark 2.x 和Spark 1.x版本的区别?
1)Spark2.x实现了Spark sql和Hive Sql操作API的统一。
2)Spark2.0中引入了 SparkSession 的概念,它为用户提供了一个统一的切入点来使用 Spark 的各项功能, 统一了旧的SQLContext与HiveContext
3) 统 一 DataFrames 和 Datasets 的 API
4)Spark Streaming基于Spark SQL(DataFrame / Dataset )构建了high-level API,使得Spark Streaming充分受益Spark SQL的易用性和性能提升
3、项目中的遇见的问题,如何解决?【讲述数据倾斜】
4、Hive元数据存储了哪些信息?
存储了hive中所有表格的信息,包括表格的名字,表格的字段,字段的类型就是表的定义
5、数据去重怎么做?【UDF使用】
在hive数据清洗这里总结三种常用的去重方式
1.distinct
2.group by
3.row_number()
实例:
SELECT tel, link_name, certificate_no, certificate_type, modify_time
FROM order_info
WHERE deleted = 'F'
AND pay_status = 'payed'
AND create_time >= to_date('2017-04-23', 'yyyy-MM-dd')
AND create_time < to_date('2017-04-24', 'yyyy-MM-dd')
AND row_number() over(PARTITION BY tel ORDER BY tel DESC) = 1
上面SQL对某一字段(tel)排序后分区去重,这样避免了其对不相干字段的数据干扰,影响数据处理的效率
(推荐方法三)
6、udf, udaf, udtf 有什么区别?
UDF:用户自定义普通函数,1对1关系,常用于select语句
UDAF:用户自定义聚合函数,多对1关系,常用于group by语句
UDTF:用户自定义表生成函数,1对多关系 分词 输入一句话输出多个单词
7、项目上数仓分层如何做的?
8、Spark Streaming和Spark联系和区别?
spark (RDD) = spark streaming ( DStream)
spark (RDD DAG) = spark streaming (DStreamGraph)
Dstream 是Spark Streaming特有的数据类型。
DStream代表一系列连续的RDD,带有时间维度的RDD,在原来RDD的基础上加上时间。比如上图的0到1秒有一个RDD,1-2秒有一个RDD,等等
spark-core:RDD开发,RDD-DAG图
spark-Streaming:针对Dstream开发,DstreamGraph
Dstream:代表了一系列连续的RDD,每一个RDD包含特定时间间隔数据
RDD的DAG是一个空间概念,Dstream在RDD基础上加了一个时间维度
Dstream各种操作是可以映射到内部RDD上进行的,对DStream的操作可以通过RDD的transformation生成新的Dstream
算子方面的区别:
RDD算子:transform action
DStream:transform ouput 保证数据有输入和输出 ,遇见输出的时候才**整个DAG图。
9、推荐系统了解吗?里面涉及到的算法?
叙述推荐系统流程,CB,CF,NB
10、Kafka如何保证数据的安全性和可靠性?
可靠性:
每个分区在Kafka集群的若干服务器中都有副本,这样这些持有副本的服务可以共同处理数据和请求,副本数量是可以配置的。副本使Kafka具备了容每个分区都由一个服务器作为“leader”,零或若干服务器作为“followers”,leader负责处理消息的读和写,followers和Leader同步只负责读,fol
followers中的一台则会自动成为leader。集群中的每个服务都会同时扮演两个角色:作为它所持有的一部分分区的leader,同时作为其他分区的follow
安全性:
Kafka 采用的是time-based消息保留策略(SLA),默认保存时间为7天
持久化数据存储:直接到磁盘,没有内存缓存机制。[磁盘为什么慢:大量随机文件的读写]
可进行持久化操作。将消息持久化到磁盘,因此可用于批量消费。
持久化数据存储尽可能进行连续的读写,避免随机的读写
11、Kafka的数据是有序的吗?
Partition的功能
目的:实现负载均衡【partition分布在不同的节点上】,需要保证消息的顺序性
顺序性的保证:订阅消息是从头后读的,写消息是尾部追加,所以对顺序性做了一个保证在一个partition上能保证消息的顺序性,但是在多个partition不能保证全局的顺序性
12、Spark优化?
1.对多次使用的RDD进行持久化处理避免重复计算
cahce()
persist()
checkpoint()
2.避免创建重复的RDD
3.尽可能复用同一个RDD
类似于多个RDD的数据有重叠或者包含的情况,应该尽量复用一个RDD,以尽可能减少RDD的数量,从而减少算子计算次数。
4.尽量避免使用shuffle类算子
Broadcast+map:先将数据collectAsMap收集到Driver段,然后使用map的形式做一个分发,到从节点上做一个join,这种形式只有map操作。
5.使用map-side预聚合的shuffle操作
因为业务需要,一定要使用shuffle操作,无法用map类算子替代,尽量使用map-side预聚合的算子。(在每个节点本地对相同的key进行一次聚合操作map-side预聚合之后,每个节点本地就只会有一条相同的key,因为多条相同的key都被聚合起来了。其他节点在拉取所有节点上的相同key时,就会大通常来说,在可能的情况下,建议使用reduceByKey或者aggregateByKey算子来替代掉groupByKey算子。因为reduceByKey和aggregateByKey算子而groupByKey算子是不会进行预聚合的,全量的数据会在集群的各个节点之间分发和传输,性能相对来说比较差。
6.使用kryo优化序列化性能
13、Spark Streaming计算速度远远小于Kafka缓存的数据,怎么解决?
或者通过反压机制控制
Spark Streaming程序中当计算过程中出现batch processing time > batch interval的情况时,(其中batch processing time为实际计算一个批次花费时间,batch interval为Streaming应用设置的批处理间隔)。
意味着处理数据的速度小于接收数据的速度,如果这种情况持续过长的时间,会造成数据在内存中堆积,导致Receiver所在Executor内存溢出等问题(如果设置StorageLevel包含disk, 则内存存放不下的数据会溢写至disk, 加大延迟)。
可以通过设置参数spark.streaming.receiver.maxRate来限制Receiver的数据接收速率,此举虽然可以通过限制接收速率,来适配当前的处理能力,防止内存溢出,但也会引入其它问题。
比如:producer数据生产高于maxRate,当前集群处理能力也高于maxRate,这就会造成资源利用率下降等问题。为了更好的协调数据接收速率与资源处理能力,动态控制数据接收速率来适配Spark Streaming Backpressure: 根据JobScheduler反馈作业的执行信息来动态调整Receiver数据接收率。
通过属性"spark.streaming.backpressure.enabled"来控制是否启用backpressure机制,默认值false,即不启用
1.spark.streaming.concurrentJobs=10:提高Job并发数,读过源码的话会发现,这个参数其实是指定了一个线程池的核心线程数而已,没有指定
2.spark.streaming.kafka.maxRatePerPartition=2000:设置每秒每个分区最大获取日志数,控制处理数据量,保证数据均匀处理。
3.spark.streaming.kafka.maxRetries=50:获取topic分区leaders及其最新offsets时,调大重试次数。
4.在应用级别配置重试
spark.yarn.maxAppAttempts=5
spark.yarn.am.attemptFailuresValidityInterval=1h
此处需要【注意】:
spark.yarn.maxAppAttempts值不能超过hadoop集群中yarn.resourcemanager.am.max-attempts的值,原因可参照下面的源码或者官网配置。
14、Spark Streaming对接Kafka的两种方式的区别?
15、数据质量如何监控