Master挂掉,standby重启也失效,如Master默认使⽤512M内存,当集群中运⾏的任务特别多时,就会挂掉,原因是master会读取每个task的event log⽇志去⽣成spark ui,内存不⾜⾃然
解析:
会OOM,可以在master的运⾏⽇志中看到,通过HA启动的master⾃然也会因为这个原因失败。
1).增加Master的内存占⽤,在Master节点spark-env.sh 中设置:
export SPARK_DAEMON_MEMORY 10g # 根据你的实际情况
2).减少保存在Master内存中的作业信息
spark.ui.retainedJobs 500 # 默认都是1000 spark.ui.retainedStages 500
worker挂掉或假死有时候我们还会在web ui中看到worker节点消失或处于dead状态,在该节点运⾏的任务则会报各种 lost worker 的错误,引发原因和上述⼤体相同,worker内存中保存
解析:
了⼤量的ui信息导致gc时失去和master之间的⼼跳。
解决
1)增加Master的内存占⽤,在Worker节点spark-env.sh 中设置:
export SPARK_DAEMON_MEMORY 2g # 根据你的实际情况
2)减少保存在Worker内存中的Driver,Executor信息
spark.worker.ui.retainedExecutors 200 # 默认都是1000 spark.worker.ui.retainedDrivers 200
报错:ERROR storage.DiskBlockObjectWriter: Uncaught exception while reverting partial writes to file /hadoop/application_1415632483774_448143/spark-local-20141127115224-
解析:
9ca8/04/shuffle_1_1562_27
java.io.FileNotFoundException: /hadoop/application_1415632483774_448143/spark-local-20141127115224-9ca8/04/shuffle_1_1562_27 (No such file or directory)
www.aboutyun.com/thread-24246-1-1.html 48/57
2019/4/24 spark相关的⾯试题跟答案,带着问题学习效果更佳哟。?)-⾯试区-about云开发
表⾯上看是因为shuffle没有地⽅写了,如果后⾯的stack是local space 的问题,那么清⼀下磁盘就好了。上⾯这种问题,是因为⼀个excutor给分配的内存不够,此时,减少excutor-core的数
量,加⼤excutor-memory的值应该就没有问题。
给定a、b两个⽂件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b⽂件共同的url?
解析:
⽅案1:可以估计每个⽂件安的⼤⼩为5G×64=320G,远远⼤于内存限制的4G。所以不可能将其完全加载到内存中处理。考虑采取分⽽治之的⽅法。
遍历⽂件a,对每个url求取hash(url)%1000,然后根据所取得的值将url分别存储到1000个⼩⽂件(记为a0,a1,…,a999)中。这样每个⼩⽂件的⼤约为300M。
遍历⽂件b,采取和a相同的⽅式将url分别存储到1000⼩⽂件(记为b0,b1,…,b999)。这样处理后,所有可能相同的url都在对应的⼩⽂件(a0vsb0,a1vsb1,…,a999vsb999)中,不对应的⼩⽂件
不可能有相同的url。然后我们只要求出1000对⼩⽂件中相同的url即可。
求每对⼩⽂件中相同的url时,可以把其中⼀个⼩⽂件的url存储到hash_set中。然后遍历另⼀个⼩⽂件的每个url,看其是否在刚才构建的hash_set中,如果是,那么就是共同的url,存到⽂件
⾥⾯就可以了。
⽅案2:如果允许有⼀定的错误率,可以使⽤Bloomfilter,4G内存⼤概可以表⽰340亿bit。将其中⼀个⽂件中的url使⽤Bloomfilter映射为这340亿bit,然后挨个读取另外⼀个⽂件的url,检查
是否与Bloomfilter,如果是,那么该url应该是共同的url(注意会有⼀定的错误率)。
Bloomfilter⽇后会在本BLOG内详细阐述。补充:另外⼀种思路,是将url通过算法转为数字类型,转换后的连接就是⽐较数值是否相等了。
有⼀个1G⼤⼩的⼀个⽂件,⾥⾯每⼀⾏是⼀个词,词的⼤⼩不超过16字节,内存限制⼤⼩是1M,要求返回频数最⾼的100个词。
解析:
Step1:顺序读⽂件中,对于每个词x,取hash(x)%5000,然后按照该值存到5000个⼩⽂件(记为f0,f1,...,f4999)中,这样每个⽂件⼤概是200k左右,如果其中的有的⽂件超过了1M⼤⼩,还
可以按照类似的⽅法继续往下分,直到分解得到的⼩⽂件的⼤⼩都不超过1M;
Step2:对每个⼩⽂件,统计每个⽂件中出现的词以及相应的频率(可以采⽤trie树/hash_map等),并取出出现频率最⼤的100个词(可以⽤含100个结点的最⼩堆),并把100词及相应的频率存
⼊⽂件,这样⼜得到了5000个⽂件;
Step3:把这5000个⽂件进⾏归并(类似与归并排序);
www.aboutyun.com/thread-24246-1-1.html 49/57
2019/4/24 spark相关的⾯试题跟答案,带着问题学习效果更佳哟。?)-⾯试区-about云开发
草图如下(分割⼤问题,求解⼩问题,归并):