共计 1790 个字符,预计需要花费 5 分钟才能阅读完成。
锁屏面试题百日百刷,每个工作日保持更新面试题。锁屏面试题 app、小程序现已上线,官网地址:https://www.demosoftware.cn。已收录了每日更新的面试题的所有内容,还蕴含特色的解锁屏幕温习面试题、每日编程题目邮件推送等性能。让你在面试中后人一步! 接下来的是今日的面试题:
1. 为什么要进行序列化
序列化能够缩小数据的体积,缩小存储空间,高效存储和传输数据,不好的是应用的时候要反序列化,十分耗费 CPU。
2. 上面这段代码输入后果是什么?
def joinRdd(sc:SparkContext) {
val name= Array(
Tuple2(1,”spark”), Tuple2(2,”tachyon”), Tuple2(3,”hadoop”)
)
val score= Array(
Tuple2(1,100), Tuple2(2,90), Tuple2(3,80)
)
val namerdd=sc.parallelize(name);
val scorerdd=sc.parallelize(score);
val result = namerdd.join(scorerdd);
result .collect.foreach(println);
}
答案:
(1,(Spark,100))
(2,(tachyon,90))
(3,(hadoop,80))
3.Spark 累加器有哪些特点?
1)累加器在全局惟一的,只增不减,记录全局集群的惟一状态;
2)在 exe 中批改它,在 driver 读取;
3)executor 级别共享的,播送变量是 task 级别的共享两个 application 不能够共享累加器,然而同一个 app 不同的 job 能够共享。
4.spark hashParitioner 的弊病是什么?
HashPartitioner 分区的原理很简略,对于给定的 key,计算其 hashCode,并除于分区的个数取余,如果余数小于 0,则用余数 + 分区的个数,最初返回的值就是这个 key 所属的分区 ID;弊病是数据不平均,容易导致数据歪斜,极其状况下某几个分区会领有 rdd 的所有数据。
5.RangePartitioner 分区的原理?
RangePartitioner 分区则尽量保障每个分区中数据量的平均,而且分区与分区之间是有序的,也就是说一个分区中的元素必定都是比另一个分区内的元素小或者大;然而分区内的元素是不能保障程序的。简略的说就是将肯定范畴内的数映射到某一个分区内。其原理是水塘抽样。
6. 介绍 parition 和 block 有什么关联关系?
1)hdfs 中的 block 是分布式存储的最小单元,等分,可设置冗余,这样设计有一部分磁盘空间的节约,然而参差的 block 大小,便于疾速找到、读取对应的内容;
2)Spark 中的 partion 是弹性分布式数据集 RDD 的最小单元,RDD 是由散布在各个节点上的 partion 组成的。partion 是指的 spark 在计算过程中,生成的数据在计算空间内最小单元,同一份数据(RDD)的 partion 大小不一,数量不定,是依据 application 里的算子和最后读入的数据分块数量决定;
3)block 位于存储空间、partion 位于计算空间,block 的大小是固定的、partion 大小是不固定的,是从 2 个不同的角度去看数据。
7.hbase 预分区个数和 spark 过程中的 reduce 个数雷同么
预分区数和 spark 的 map 个数雷同,reduce 个数如果没有设置和 reduce 前的 map 数雷同。
8.Spark 如何自定义 partitioner 分区器?
1)spark 默认实现了 HashPartitioner 和 RangePartitioner 两种分区策略,咱们也能够本人扩大分区策略,自定义分区器的时候继承 org.apache.spark.Partitioner 类,实现类中的三个办法:
def numPartitions: Int:这个办法须要返回你想要创立分区的个数;
def getPartition(key: Any): Int:这个函数须要对输出的 key 做计算,而后返回该 key 的分区 ID,范畴肯定是 0 到 numPartitions-1;
equals():这个是 Java 规范的判断相等的函数,之所以要求用户实现这个函数是因为 Spark 外部会比拟两个 RDD 的分区是否一样。
2)应用,调用 parttionBy 办法中传入自定义分区对象。