一、spark streaming和storm有何区别?
一个实时毫秒,一个准实时亚秒,不过storm的吞吐率比较低。
二、spark有哪些组件?
Master:管理集群和节点,不参与计算。
Worker:计算节点,进程本身不参与计算,和master汇报。
Driver:运行程序的main方法,创建sparkcontext对象。
Spark context:控制整个application的生命周期,包括DAGSchedular和TaskSchedular等组件。
Client:用户提交程序的入口。
三、spark的工作机制
用户在client端提交作业后,会由Driver运行main方法并创建spark context。
执行RDD算子,形成DAG图输入DAGSchedular,按照RDD之间的依赖关系划分stage输入TaskSchedular。
TaskSchedular会将stage划分为task set分发到各个节点的executor中执行。
四、spark中的宽窄依赖
RDD和他依赖的父RDD的关系有两种不同的类型,即窄依赖(narrow dependency)和宽依赖(wide dependency)。
宽依赖:指的是多个子RDD的partition会依赖同一个父RDD的partition。
窄依赖:指的是每一个父RDD的partition最多被子RDD的一个Partition使用。
五、spark中如何划分stage?
1.spark application中可以因为不同的action触发众多的job,一个Application中可以有很多job,每个job是有一个或多个stage构成的,后面的stage依赖于前面的stage,也就是说只有前面的stage计算完毕后,后面的stage才会运行。
2.stage划分的依据是宽依赖,何时产生宽依赖,例如ReduceBykey,GroupByKey的算子,会导致宽依赖的产生。
3.由Action算子(例如collect)导致了SparkContext.RunJob的执行,最终导致了DAGSchedular的submitJob的执行,其核心是通过发送一个case class Jobsubmitted对象给eventProcessLoop。
EventProcessLoop是DAGSchedularEventProcessLoop的具体事例,而DAGSchedularEventProcessLoop是eventLoop的子类,具体实现EventLoop的onReceiver方法,onReceiver方法转过来回调doOnReceive。
4.在handleJobSubmitted中首先创建finalStage,创建finalStage时候会建立父Stage的依赖链条。
总结:依赖是从代码的逻辑层面上来展开说的,可以简单点说:写介绍什么是RDD中的宽窄依赖,然后再根据DAG有向无环图进行划分,从当前job的最后一个算子往前推,遇到宽依赖,那么当前在这个批次中的所有算子操作都划分成一个stage,然后继续按照这种方式再继续往前推,如再遇到宽依赖,又划分成一个stage,一直到最前面的一个算子。最后整个job会被划分成多个stage,而stage之间又存在依赖关系,后面的stage依赖于前面的stage。
六、spark-submit的时候如何引入外部jar包
在通过spark-submit提交任务时,可以通过添加配置参数来指定:
--driver-class-path 外部jar包
--jars 外部jar包
七、spark中cache和persist的区别?
Cache:缓存数据,默认是缓存在内存中,,其本质还是调用persist
Persist:缓存数据,有丰富的缓存策略。数据可以保存在内存也可以保存在磁盘中,使用的时候指定对应的缓存级别。
八、flume整合Spark S