一、基础题
1、Scala 语言的特性包含面向对象编程、函数式编程、静态类型、可扩展、可交互操作 2、Scala 中获取元祖中的值是通过下划线加脚标来获取的 3、Scala 中,模式匹配是由关键字match和case组成的 4、Scala 中提供的常见数据结构有数组、元祖、集合 5、在 Scala 中使用case关键字来定义的类被称为样例类 6、在 Scala 中使用object关键字创建的对象为单例对象 7、在 Scala 中Trait(特质) 的功能类似于Java中的接口 8、Spark 生态系统主要包括Spark Core、Spark SQL、Spark Streaming、MLib、GraphX以及独立调度器 9、Spark 的部署模式分为本地单机模式和集群模式,集群模式又分为Standalone模式、Mesos模式、Yarn模式 10、Spark 运行框架主要是由SparkContext、Cluster Manager、Worker组成 11、Spark 的特点,速度快、易用性、通用性、兼容性 12、Spark 是基于内存计算的大数据并行计算框架 13、配置 Spark 集群时,需要修改配置文件spark-env.sh、profile、slaves 14、RDD 是一个容错的并行的数据结构,本质为分布式的数据集合 15、创建 RDD 的方法是textFile和parallelize 16、RDD 采用了惰性调用,在 RDD 的处理过程中,真正的计算发生在RDD 的 “行动” 操作 17、RDD 的转换算子: filter(func)、map(func)、flatmap(func)、groupByKey(func)、reduceByKey(func) 18、RDD 的分区原则: Local模式下,分区的个数尽量等同于集群中 CPU 的核数,Standalone模式或者Yarn模式下,分区数"在集群中所有的 CPU 核数总和"与"2" 这两者中较大值为默认值,Mesos模式下,默认的分区数是8 19、RDD 的依赖关系分为宽依赖和窄依赖 20、RDD 持久化机制的存储级别默认的是MEMORY_ONLY 21、RDD 持久化操作有两个方法分别为cache() 方法和persist() 方法 22、RDD 提供了两种故障恢复的方式,分别是血统方式和设置检查点方式 23、消息传递模式分为点对点消息传递模式和发布订阅式消息传递模式 24、Kafka 的优点:解耦、高吞吐量低延迟、持久性、扩展性、容错性、支持多种客户端语言 25、Producer是数据的生产者,Consumer是数据的消费者 26、Kafka 集群是由生产者(Producer)、消息代理服务器(Broker Server) 和 消费者(Consumer) 组成 27、Kafka 中消息的消费模型有两种,分别为推送模型(Push)和拉取模型(Pull) 28、Kafka 内置了一个流式处理框架客户端 Kafka Streams,开发者可以直接以Kafka为核心构建流式计算系统 29、Spark Streaming 的特点易用性、容错性、易整合性 30、Spark Streaming 支持从多种数据源获取数据,包括Kafka、Flume、Twitter、ZeroMQ等 31、Spark Streaming 中对DStream的转换操作会转换成对RDD的操作 32、Spark Streaming 提供了一个高级抽象的流,即DStream 33、Spark Streaming 中 DStream 的输出操作是真正触发 DStream 上所有转换操作进行计算 34、Scala 中,使用var声明变量,使用val声明常量 35、Scala 中可以使用def语句和val语句定义函数,而定义方法只能使用def语句 36、Scala 中的数组分为定长数组和变长数组
new Array[T](数组长度) //定义定长数组
ArrayBuffer[T]() //定义变长数组
37、在 Scala 中,可以使用Nil 和 ::操作符 来定义列表 38、RDD 的行动算子:count()、first()、take(n)、reduce(func)、collect()、foreach(func) 39、当 RDD 执行 map、filter、union、join with inputs co-partitioned 操作时都会产生窄依赖 40、目前,业内已衍生出许多实时计算数据的框架,如Apache Spark Streaming、Apache Spark Storm、Apache Flink 以及 Yahoo! S4 41、DStream 可以通过Kafka、Flume 和 Kinesis 等数据源创建
二、简答题
1、论述Spark与Hadoop的区别
1)编程方式
a) Hadoop 的 MapReduce 在计算数据时,计算过程必须要转化为 Map 和 Reduce 两个过程,从而难以描述复杂的数据处理过程; b) Spark 的计算模型不局限于 Map 和 Reduce 操作,还提供了多种数据集的操作类型,编程模型比 MapReduce 更加灵活
2)数据存储
a) Hadoop 每次产生的中间结果都存储在本地磁盘中 b) Spark 产生的中间结果存储在内存中
3)数据处理
a) Hadoop 每次执行数据处理都需要从磁盘中读取数据,导致磁盘的I/O开销较大 b) Spark 处理数据时,只需见将数据加载到内存中,之后直接在内存中加载中间结果数据集即可,减少了磁盘的I/O开销
4)数据容错
a) Hadoop 底层实现了备份机制,从而保证了数据容错 b) Spark RDD 实现了基于 Lineage 的容错机制和设置检查点的容错机制,弥补了数据在内存处理时断电丢失的问题
2、简述Spark集群的基本运行流程
1)spark集群启动后,Worker向Master注册信息,spark-submit命令提交程序后,driver和application也会向Master注册信息,创建SparkContext对象:主要的对象包含DAGScheduler和TaskScheduler 2)Driver把Application信息注册给Master后,Master会根据App信息去Worker节点启动Executor 3)Executor内部会创建运行task的线程池,然后把启动的Executor反向注册给Dirver 4)DAGScheduler:负责把Spark作业转换成Stage的DAG(Directed Acyclic Graph有向无环图),根据宽窄依赖切分Stage,然后把Stage封装成TaskSet的形式发送个TaskScheduler;同时DAGScheduler还会处理由于Shuffle数据丢失导致的失败; 5)TaskScheduler:维护所有TaskSet,分发Task给各个节点的Executor(根据数据本地化策略分发Task),监控task的运行状态,负责重试失败的task; 6)所有task运行完成后,SparkContext向Master注销,释放资源;
3、论述批量计算、流式计算、实时计算、离线计算的区别
实时计算和离线计算,主要是在数据处理延迟性上有不同的要求。 离线计算,通常也称为“批处理”,表示那些离线批量、延时较高的静态数据处理过程。 实时计算,通常也称为“实时流计算”、“流式计算”,表示那些实时或者低延时的流数据处理过程。 流式计算和批量计算主要是数据处理的方式不同。 流式计算,就是对数据流进行处理,是实时计算。 批量计算则统一收集数据,存储到数据库中,然后对数据进行批量处理的数据计算方式。
4、简述spark的容错机制
1)血统方式
根据RDD之间依赖关系对丢失数据的RDD进行数据恢复。窄依赖中,在子RDD的分区丢失、重算父RDD分区时,父RDD相应分区的所有数据都是子RDD分区的数据,并不存在冗余计算。在宽依赖中,则需要父RDD所有分区都要进行从头到尾计算,计算过程中存在冗余计算。
2)设置检查点(checkPoint)方式
当RDD进行宽依赖运算时,设置容错文件系统目录作为检查点,将检查点的数据写入之前设置的容错文件系统中进行持久化存储,若后面出现分区数据丢失,则从做检查点的RDD开始重新计算,不需要从头到尾的计算,从而减少开销。
5、论述RDD的五大特征
1)A list of partitions
一组分区:RDD由很多partition构成,有多少partition就对应有多少task
2)A function for computing each split
一个函数:对RDD做计算,相当于对RDD的每个split或partition做计算
3)A list of dependencies on other RDDs
RDD之间有依赖关系,可溯源
4)Optionally, a Partitioner for key-value RDDs (e.g. to say that the RDD is hash-partitioned)
一个Partitioner:即RDD的分片函数,如果RDD里面存的数据是key-value形式,则可以传递一个自定义的Partitioner进行重新分区
5)Optionally, a list of preferred locations to compute each split on (e.g. block locations for an HDFS file)
一个列表:存储存取每个Partition的优先位置(preferred location),计算每个split时,在split所在机器的本地上运行task是最好的,避免了数据的移动,split有多个副本,所以preferred location不止一个
6、简述如何在Spark中划分Stage
从最后一个RDD往前推,遇到窄依赖的父RDD时,就将这个父RDD加入子RDD所在的stage;遇到宽依赖的父RDD时就断开,父RDD被划分为新的stage。每个Stage里task的数量由Stage最后一个RDD中的分区数决定。如果Stage要生成Result,则该Stage里的Task都是ResultTask,否则是ShuffleMapTask。
7、简述Spark Streaming的工作原理
接收实时输入数据流,然后将数据拆分成多个batch,比如每收集1秒的数据封装为一个batch,然后将每个batch交给Spark的计算引擎进行处理,最后会生产出一个结果数据流,其中的数据,也是由一个一个的batch所组成的。
|