大数据工程师入职京东年薪37w(附:面试真题分享)

总结:引导面试官到自己擅长的领域,掌握主动权,问题回答不一定完整,说出关键点即可。

1、项目规模,一天/月数据量,各组件版本?

数据规模:一般100M数据由300万条数据;数据量:上百G;条数:达到几十亿条数据

美团数据规模:负责每天数百GB的数据存储和分析

大数据工程师入职京东年薪37w(附:面试真题分享)

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、项目上数仓分层如何做的?

大数据工程师入职京东年薪37w(附:面试真题分享)

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、数据质量如何监控