## Spark面试题(四)
### 1、Spark中的HashShufle的有哪些不足?
1)shuffle产生海量的小文件在磁盘上,此时会产生大量耗时的、低效的IO操作;
2)容易导致内存不够用,由于内存需要保存海量的文件操作句柄和临时缓存信息,如果数据处理规模比较大的话,容易出现OOM;
3)容易出现数据倾斜,导致OOM。
### 2、 conslidate是如何优化Hash shuffle时在map端产生的小文件?
1)conslidate为了解决Hash Shuffle同时打开过多文件导致Writer handler内存使用过大以及产生过多文件导致大量的随机读写带来的低效磁盘IO;
2)conslidate根据CPU的个数来决定每个task shuffle map端产生多少个文件,假设原来有10个task,100个reduce,每个CPU有10个CPU,那么
使用hash shuffle会产生10*100=1000个文件,conslidate产生10*10=100个文件
注意:conslidate部分减少了文件和文件句柄,并行读很高的情况下(task很多时)还是会很多文件。
### 3、spark.default.parallelism这个参数有什么意义,实际生产中如何设置?
1)参数用于设置每个stage的默认task数量。这个参数极为重要,如果不设置可能会直接影响你的Spark作业性能;
2)很多人都不会设置这个参数,会使得集群非常低效,你的cpu,内存再多,如果task始终为1,那也是浪费,
spark官网建议task个数为CPU的核数*executor的个数的2~3倍。
### 4、spark.shuffle.memoryFraction参数的含义,以及优化经验?
1)spark.shuffle.memoryFraction是shuffle调优中 重要参数,shuffle从上一个task拉去数据过来,要在Executor进行聚合操作,
聚合操作时使用Executor内存的比例由该参数决定,默认是20%如果聚合时数据超过了该大小,那么就会spill到磁盘,极大降低性能;
2)如果Spark作业中的RDD持久化操作较少,shuffle操作较多时,建议降低持久化操作的内存占比,提高shuffle操作的内存占比比例,
避免shuffle过程中数据过多时内存不够用,必须溢写到磁盘上,降低了性能。此外,如果发现作业由于频繁的gc导致运行缓慢,意味着task执行用户代码的内存不够用,
那么同样建议调低这个参数的值。
### 5、Spark中standalone模式特点,有哪些优点和缺点?
1)特点:
(1)standalone是master/slave架构,集群由Master与Worker节点组成,程序通过与Master节点交互申请资源,Worker节点启动Executor运行;
(2)standalone调度模式使用FIFO调度方式;
(3)无依赖任何其他资源管理系统,Master负责管理集群资源。
2)优点:
(1)部署简单;
(2)不依赖其他资源管理系统。
3)缺点:
(1)默认每个应用程序会独占所有可用节点的资源,当然可以通过spark.cores.max来决定一个应用可以申请的CPU cores