spark相关面试题

1、spark的几种部署模式?
  本地模式、standalone模式、spark on yarn模式、spark on mesos模式
2、spark为什么比mapreduce快?
  1、基于内存计算,减少了低效的磁盘交互
  2、高效的调度算法,基于DAG
  3、容错机制
3、spark怎么提交保证不会有jar冲突,spark-submit提交会占用网络IO,有什么其他方式提交可以优化网络IO?
  造成这个原因有两个:
  一是在提交任务时候breeze包没有添加,启动时候添加--jars breeze_2.11-0.13.1.jar即可
  二是由于spark本身的breeze包版本不一样,缺失所需的函数,而spark启动时候默认优先读取spark内部breeze包。
  解决方法
  是在启动时候添加配置--driver-class-path breeze_2.11-0.13.1.jar 即可
4、spark的缓存?
  通过cache()设置缓存
5、spark说明:
  spark系统是分布式批处理和分析挖掘引擎,计算分为离线处理(批处理)和实时(流式处理,在线)
  容错性:mr的错误点:在计算的过程中,某一台的计算服务挂掉(网线掉了,司机、内存不足、超时等等),
  对于mr来说,整个程序是不是挂了?
  并不会,会将该台服务器上处理的块数据,迁移到另一台块的主机上,继续进行计算(会影响job的整体时间),
  但是对于job的结果不会有影响
  spark的容错性基本和mr一致(一台主机挂掉,将计算迁移到另一台主机接着计算)
  扩展性:mr增加nodemanager节点(slaves文件中增加),就等于增加了计算单元
  spark与mr一样,就是可以的动态的加节点(服务器)
6、spark on yarn执行过程:
  client提交application
  rm为application分配资源启动COntainer
  sparkContext向RM申请运行EXecutor资源
  SparkContext启动standloneExecutorBackend并等待task
  executor报告task状态直至完成
  注销application,归还资源
7、RDD
  弹性分布式数据集
  分为转换算子和行动算子,转换算子在使用的时候,spark不会真正的执行,直到遇到行动算子之后才执行
  在spark中每一个算子在计算之后就会产生一个RDD
8、为什么spark需要行动算子真正执行后才会开始计算?
  如果每一个算子在创建的时候就执行的话,执行的结果每一步会产生一个新的RDD,但这些RDD优先存到内存当中,
  如果很长时间都没有遇到行动算子的话,可能会造成数据丢失或者数据移到硬盘上
9、如果某一个RDD在计算的时候出错(如服务器挂掉),在spark怎么解决?
  spark内部中有一个叫血统容错的机制(有一个RDD挂掉之后,spark会从它的上一步去拿RDD,如果上一步也挂了,则继续往上找,直到拿到RDD)
10、一个RDD可以同时存在内存和硬盘中
11、怎么知道某一个 RDD有多少个分区?makeRdd.getNumPartitions
11、RDD机制:
  RDD分布式弹性数据集,所有的算子都基于RDD来执行,RDD执行过程中会形成DAG图
12、如何设置RDD的分区?
  1、在 sparkconf当中设置setMaster的值,可以设置RDD的分区
  2、在创建RDD的时候,直接指定RDD的分区数
  3、通过repartition修改某个RDD的分区值
  4、spark自定义分区
  注意:分区数会被对应成TASK任务,也就是分区数也多,那么处理额速度会越快,但是占用的服务器资源越多,比如:内存、cpu等
13、宽依赖、窄依赖
  依赖关系说明:RDD之间有一个血统关系,所有除了第一个RDD(创建的RDD)之外,其他的RDD都会依赖于父RDD
  宽依赖:子RDD拥有所有父RDD的分区值
  窄依赖:父RDD的分区值最多被一个子RDD所拥有
14、stage:
  一个app程序,包含一组task任务的组合
15、转换算子
  map、flatmap、filter、groupByKey、refuceByKey、union、join等
  行动算子count、collect、reduce、lookup、sortBy等
16、spark程序的发布:
  最简单的格式:spark-submit --class 主类的全路径 jar的路径
17、spark sql:
  设计基于hive组件中的优化 ,同时将查询的引擎从mapreduce改成了spark
  spark sql不管对方是一个关系型数据库还是普通文本(必须是结构化数据),那么spark sql 就可以通过自己的方式,将文件中的内容通过sql操作

18、spark sql读取文件的时候,如果文件缺少dataFrame的schema应该怎么做?
  1、使用反射推断模式
  将文件转换成RDD,在将RDD转成dataFrame
  2、用户自定义模式
  将文件转成RDD
  构造出StructType类型
  构造RDD[Row]
  创建dataFrame
19、spark sql中反射推断模式与用户自定义模式对比?
  在构造的时候不同,反射推断模式是采用case class的方式,而用户自定义模式是采用的 StructType的方式
  主要解决的问题是将一些没有schema新的源文件,进行sql操作
20、spark sql支持的数据源格式?
  json格式、parquet格式(列式存储)、jdbc格式、txt格式(采用反射推断模式或者用户自定义模式)
21、Spark Streaming和Storm有何区别?
  一个实时毫秒一个准实时亚秒,不过storm的吞吐率比较低
22、hadoop和spark的区别?
  基本原理上:hadoop和spark最大的区别在于hadoop是基于磁盘的大数据批处理系统
  而spark是基于弹性分布式数据集(RDD,显示地将数据存储到磁盘和内存中)
  模型上:hadoop以mapreduce模型为核心,而spark除了map和reduce函数操作之外还有很多函数,如join、groupBYKey、reduceByKey等
23、spark作业执行流程描述:
  1、客户端提交作业给Master
  2、Master让一个Worker启动Driver,即SchedulerBackend。Worker创建一个DriverRunner线程,DriverRunner启动SchedulerBackend进程。
  3、另外Master还会让其余Worker启动Exeuctor,即ExecutorBackend。Worker创建一个ExecutorRunner线程,ExecutorRunner会启动ExecutorBackend进程。
  4、ExecutorBackend启动后会向Driver的SchedulerBackend注册。SchedulerBackend进程中包含DAGScheduler,它会根据用户程序,生成执行计划,并调度执行。对于每个stage的task,都会被存放到TaskScheduler中,ExecutorBackend向SchedulerBackend汇报的时候把TaskScheduler中的task调度到ExecutorBackend执行。
  5、所有stage都完成后作业结束。
24、spark shuffle什么时候产生的?
  spark shuffle是在DAGScheduler划分stage时候产生的,task schedular会将stage封装task set到exector去执行
25、spark-streaming获取kafka数据的两种方式:
  receiver方式:是使用kafka的高层次Comsumer api来实现的,receiver从kafka中获取的数据都是存储在spark executor的内存中,然后Spark Streaming启动的job会去处理那些数据。然而,在默认的配置下,这种方式可能会因为底层的失败而丢失数据。如果要启用高可靠机制,让数据零丢失,就必须启用Spark Streaming的预写日志机制(Write Ahead Log,WAL)。该机制会同步地将接收到的Kafka数据写入分布式文件系统(比如HDFS)上的预写日志中。所以,即使底层节点出现了失败,也可以使用预写日志中的数据进行恢复。
  direct方式:
  这种方式会周期性地查询Kafka,来获得每个topic+partition的最新的offset,从而定义每个batch的offset的范围。
  当处理数据的job启动时,就会使用Kafka的简单consumer api来获取Kafka指定offset范围的数据。
  direct方式优点:
  1、简化并行读取:如果要读取多个partition,不需要创建多个输入DStream然后对它们进行union操作。
  2、高性能:如果要保证零数据丢失,在基于receiver的方式中,需要开启WAL机制
  3、一次且仅一次的事务机制:















猜你喜欢

转载自www.cnblogs.com/yfb918/p/10475746.html