hive,spark部分面试考察点

mapWithState只返回变化后的key的值,这样做的好处是,我们可以只是关心那些已经发生的变化的key,对于没有数据输入,则不会返回那些没有变化的key的数据。这样的话,即使数据量很大,checkpoint也不会像updateStateByKey那样,占用太多的存储,效率比较高(再生产环境中建议使用这个)。
适用场景  updateStateByKey可以用来统计历史数据。例如统计不同时间段用户平均消费金额,消费次数,消费总额,网站的不同时间段的访问量等指标  mapWithState可以用于一些实时性较高,延迟较少的一些场景,例如你在某宝上下单买了个东西,付款之后返回你账户里的余额信息。

spark的有几种部署模式是
SparkRDD默认的存储级别是
Spark中的RDD的五大特性是RDD的两中依赖是
Stage的Task的数量由 决定
三、问答题
1.spark中的RDD是什么,有哪些特性?
3.1、分区:RDD逻辑上是分区的,每个分区的数据是抽象存在的,计算的时候会通过一个计算函数得到每个分区的数据。
3.2、只读:RDD是只读的,要想改变RDD中的数据,只能在现用的RDD基础上创建新的RDD,可以通过操作算子实现。RDD的操作算子包括两类: 1)一个类叫做转换算子(transformations),它是用来将RDD进行转换的; 2)另一类叫做行动算子(actions),它是用来触发RDD的计算
3.3、依赖:RDD通过操作算子进行转换,转换得到的新的RDD包含了从其他RDD衍生所必须的信息,RDD之间维护着这种血统关系,也称之为 依赖关系。依赖包含两种: 1)窄依赖:RDD之间分区是一一对应的 2)宽依赖:子RDD的每个分区与父RDD的每个分区都有关,是多对多的关系
3.4、缓存:如果在应用程序中多次使用用一个RDD,可以将该RDD缓存起来,在后续其他地方用到该RDD的时候,会直接从缓存处取出而不用再 根据依赖关系计算,这样就加速后期的重用。
3.5、CheckPoint:对于长时间迭代型应用来说,随着迭代的进行,RDD之间的依赖关系会越来越长。一旦在后续迭代过程中出错,则需要通过 非常长的依赖关系去重建,势必影响性能。为此,RDD支持checkpoint将数据保存到持久化的存储中,这样就可以切断之前 的依赖关系。因为checkpoint后的RDD不需要知道他的父RDD了,它可以从checkpoint处拿到数据。

2.cache和pesist有什么区别?
3.spark rdd 如何区分宽依赖和窄依赖?
4.hadoop和spark的都是并行计算,那么他们有什么相同和区别
5. 哪些算子操作涉及到shuffle?
6. spark 如何防止内存溢出 ?
增大driver的内存参数:spark.driver.memory (default 1g)这个参数用来设置Driver的内存。在Spark程序中,SparkContext,DAGScheduler都是运行在Driver端的。对应rdd的Stage切分也是在Driver端运行,如果用户自己写的程序有过多的步骤,切分出过多的Stage,这部分信息消耗的是Driver的内存,这个时候就需要调大Driver的内存。
map过程产生大量对象导致内存溢出
这种溢出的原因是在单个map中产生了大量的对象导致的,例如:rdd.map(x=>for(i <- 1 to 10000) yield i.toString),这个操作在rdd中,每个对象都产生了10000个对象,这肯定很容易产生内存溢出的问题。针对这种问题,在不增加内存的情况下,可以通过减少每个Task的大小,以便达到每个Task即使产生大量的对象Executor的内存也能够装得下。具体做法可以在会产生大量对象的map操作之前调用repartition方法,分区成更小的块传入map。例如:rdd.repartition(10000).map(x=>for(i <- 1 to 10000) yield i.toString)。面对这种问题注意,不能使用rdd.coalesce方法,这个方法只能减少分区,不能增加分区,不会有shuffle的过程。
数据不平衡导致内存溢出
数据不平衡除了有可能导致内存溢出外,也有可能导致性能的问题,解决方法和上面说的类似,就是调用repartition重新分区。这里就不再累赘了。shuffle后内存溢出shuffle内存溢出的情况可以说都是shuffle后,单个文件过大导致的。在Spark中,join,reduceByKey这一类型的过程,都会有shuffle的过程,在shuffle的使用,需要传入一个partitioner,大部分Spark中的shuffle操作,默认的partitioner都是HashPatitioner,默认值是父RDD中最大的分区数,这个参数通过spark.default.parallelism控制(在spark-sql中用spark.sql.shuffle.partitions) , spark.default.parallelism参数只对HashPartitioner有效,所以如果是别的Partitioner或者自己实现的Partitioner就不能使用spark.default.parallelism这个参数来控制shuffle的并发量了。如果是别的partitioner导致的shuffle内存溢出,就需要从partitioner的代码增加partitions的数量。
standalone模式下资源分配不均匀导致内存溢出在standalone的模式下如果配置了–total-executor-cores 和 --executor-memory 这两个参数,但是没有配置–executor-cores这个参数的话,就有可能导致,每个Executor的memory是一样的,但是cores的数量不同,那么在cores数量多的Executor中,由于能够同时执行多个Task,就容易导致内存溢出的情况。这种情况的解决方法就是同时配置–executor-cores或者spark.executor.cores参数,确保Executor资源分配均匀。使用rdd.persist(StorageLevel.MEMORY_AND_DISK_SER)代替rdd.cache()rdd.cache()和rdd.persist(Storage.MEMORY_ONLY)是等价的,在内存不足的时候rdd.cache()的数据会丢失,再次使用的时候会重算,而rdd.persist(StorageLevel.MEMORY_AND_DISK_SER)在内存不足的时候会存储在磁盘,避免重算,只是消耗点IO时间。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

预警:黄牛用户统计/黑名单的统计/异常用户的统计
实时ETL/实时转发对实时数据做一个预测(sparkstreaming+机器学习)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值