大数据课程——课后练习3

大数据课程——课后练习3

1.请简述Spark的主要组件及其主要功能。

  • Spark Core:该组件是Spark的核心模块,主要包含两个功能:一是负责任务调度、内存管理、错误恢复与存储系统交互等;二是其包含了对弹性分布式数据集的API定义。它提供了创建和操作这些集合的多个API。

  • Spark SQL:该组件是一个用于结构化数据处理的Spark工具包,提供了面向结构化数据的SQL查询接口,使用户可以通过编写SQL或基于Apache Hive的HiveQL来方便地处理数据。也可以查询Hive中的数据,相当于数据仓库的查询引擎,提供了很强大的计算速度。它还支持开发者将SQL语句融入到Spark应用程序的开发过程中,使得用户可以用SQL语句进行查询和复杂的数据分析。

  • Spark Steaming:该组件是Spark提供的对实时数据进行流式计算的组件,它将流式的计算分解成一系列短小的批处理作业,支持对实时数据流进行可伸缩、高吞吐量、容错的流处理。它还提供了用来操作数据流的API,并且与Spark Core当中的RDD API高度对应,帮助开发人员高效地处理数据流中的数据。且支持与Spark Core同级别的容错性、吞吐量及可伸缩性。Spark Streaming通过将数据流中的数据按指定时间片累计为RDD,然后将每个RDD进行批处理,进而实现大规模的流数据处理。

  • MLib:该组件是Spark的机器学习库。它的目标是使得机器学习具有可拓展性和易用性。其中提供了分类、回归、聚类、协同过滤等常用机器学习算法,以及一系列更加底层的机器学习原语。

  • GraphX:该组件是Spark中图形和图形并行计算的一个新㢟,可以用其创建一个顶点和边都包含任意属性的有向多重图。此外,该组件还包含越来越多的图算法和构建起,以此来简化图形分析任务。

2.Spark的部署模式有哪几种?

一共有三种部署模式:一种是本地(单机)模式;第二种是Yarn集群模式;第三种是Spark自带的Standalone模式。

  • 本地模式:是只运行在一台计算机上,就称为本地模式。
  • Yarn集群模式:Spark On Yarn模式遵循YARN的官方规范,YARN只负责资源的管理和调度,运行哪种应用程序由用户自己实现,因此可能在YARN上同时运行MapReduce程序和Spark程序,YARN很好地对每一个程序实现了资源的隔离。这使得Spark与MapReduce可以运行于同一个集群中,共享集群存储资源与计算资源。
  • Standalone模式:该模式采用经典的Master/Slave架构,资源调度由Spark自己实现。

3.什么是RDD?创建RDD主要由哪几种方式?请举例说明。

RDD是Spark提供的一种对数据的核心抽象,称为弹性分布式数据集(Resilient Distributed Dataset,RDD)。每个RDD被分为多个分区,这些分区运行在集群中的不同节点上。也就是说,RDD是跨集群节点分区的元素集合,并且这些元素可以并行操作。
创建RDD主要有两种方式,一是从文件系统中加载数据创建RDD,二是通过对象集合(数组)创建RDD。
1、从对象集合创建RDD:将一个List集合转化为RDD:

> val rdd = sc.parallelize(List(1,2,3,4,5))

2、从文件系统中加载数据创建RDD:

 > val rdd = sc.textFile(“file:///home/words.txt”)

4.请简述RDD的转化算子和行动算子的主要区别?

  • 转化算子:Spark中转化算子不会立即进行运算,它是惰性的,只是记住对某个RDD的具体操作过程。
  • 行动算子:Spark中遇到行动算子则会执行相应的语句,触发任务调度。

5.什么是Spark惰性机制?这种机制有何优缺点?

Spark惰性机制指整个转化过程只是记录了转化的轨迹,并不会发生真正的计算,只有遇到行动操作时,才会发生真正的计算,开始从血缘关系源头开始,进行物理的转化操作。这样可以避免许多无意义的计算,节省内存。但是每次遇到行动操作,都会从头开始执行计算。每次调用行动操作,都会触发一次从头开始的计算。这对于迭代计算而言,代价是很大的,迭代计算经常需要多次重复使用同一组数据。

6.请列出RDD的主要算子及其作用。

1、转化算子

  • Map()算子:接收一个函数作为参数,并把该函数作用于RDD的每个元素,最后将函数的返回结果作为结果RDD中对应元素的值。
  • Filter(func)算子:通过函数func对源RDD的每个元素进行过滤,并返回一个新的RDD。
  • FlatMap(func)算子:与map()算子类似,但每个传入给函数func的RDD元素会返回0到多个元素,最终会将返回的所有元素合并到一个RDD中。
  • ReduceByKey(func)算子:作用对象元素为(key,value)形式的RDD,可以将相同的key的元素聚集到一起,最终把所有Key相同的元素合并成一个元素。该元素的key值不变,value可以聚合成一个列表或者进行求和等操作。最终返回的RDD的元素类型和原有类型保持一致。
  • Union()算子:该算子能将两个RDD合并成为一个新的RDD,主要用于对不同的数据来源进行合并,两个RDD中的数据类型要保持一致。
  • SortBy(func)算子:该算子可以将RDD中的元素按照某个规则进行排序。

2、行动算子

  • Reduce(func)算子:将RDD中的元素进行聚合计算。
  • Count()算子:返回数据集中元素的数量。
  • CountByKey()算子:统计RDD中key相同的元素的数量。
  • Take(n)算子:返回包含数据集的前n个元素的数组。

7.什么是DataFrame?DataFrame与RDD有什么不同?

DataFrame是Spark SQL提供的一个编程抽象,与RDD类似,也是一个分布式的数据集合。但不同的是,DataFrame的数据都被组织到有名字的列中,在RDD的基础上添加了数据描述信息,就像关系型数据库中的表一样。此外,多种数据都可以转化为DataFrame。

8.创建DataFrame主要由哪几种方式?请举例说明。

1、用SparkSession从不同的数据源中加载数据,并转化成DataFrame。
举例:

> val peopleDF = spark.read.format("json").
| load("file:///spark/examples/src/main/resources/people.json")
> peopleDF.select("name", "age").write.format("csv").
| save("file:///usr/local/spark/mycode/sql/newpeople.csv")

2、从RDD转化得到DataFrame
举例:

//生成字段
scala> val fields = Array(StructField("name",StringType,true), StructField("age",IntegerType,true))
scala> val schema = StructType(fields)
scala> val peopleRDD = spark.sparkContext.
| textFile("file:///spark/examples/src/main/resources/people.txt")
scala> val rowRDD = peopleRDD.map(_.split(",")).
|  map(attributes => Row(attributes(0), attributes(1).trim.toInt))
scala> val peopleDF = spark.createDataFrame(rowRDD, schema)

9.请举例说明如何在Spark中使用SQL进行查询。

//将RDD转换为DataFrame
> val peopleDF = spark.createDataFrame(rowRDD, schema)
//创建临时视图people
> peopleDF.createOrReplaceTempView("people")
//调用SQL语句,进行SQL查询
> val results = spark.sql("SELECT name,age FROM people")
//打印查询结果
> val results.
| map(attributes => "name: " 
|+ attributes(0)+","+"age:"+attributes(1)).show()

10.请简述Spark Streaming的工作机制。

在Spark Streaming中,会有一个组件Receiver,作为一个长期运行的task跑在一个Executor上。
每个Receiver都会负责一个input DStream(比如从文件中读取数据的文件流,比如套接字流,或者从Kafka中读取的一个输入流等)。
Spark Streaming通过input DStream与外部数据源进行连接,读取相关数据。

11.请比较Spark Streaming和Storm有何不同?

  • Spark Streaming和Storm最大的区别在于,Spark Streaming无法实现毫秒级的流计算,而Storm可以实现毫秒级响应
  • Spark Streaming构建在Spark上,一方面是因为Spark的低延迟执行引擎(100ms+)可以用于实时计算,另一方面,相比于Storm,RDD数据集更容易做高效的容错处理
  • Spark Streaming采用的小批量处理的方式使得它可以同时兼容批量和实时数据处理的逻辑和算法,因此,方便了一些需要历史数据和实时数据联合分析的特定应用场合

12.请简述编写Spark Streaming程序的主要步骤。

  • 通过创建输入DStream来定义输入源
  • 通过对DStream应用转化操作和输出操作来定义流计算
  • 用streamingContext.start()来开始接收数据和处理流程
  • 通过streamingContext.awaitTermination()方法来等待处理结束(手动结束或因为错误而结束)
    可以通过streamingContext.stop()来手动结束流计算进程

13.请举例说明DStream主要的有状态转换操作及其作用。

1、滑动窗口转化操作
设定一个滑动窗口长度(也就是持续时间),设定窗口滑动时间(也就是间隔多少时间进行一次计算),让窗口按照指定时间在源DStream上滑动。每次窗口停止的位置上,都会有一部分DStream被新增入窗口内,形成一个小段的DStream,可以启动对该段DStream的计算。

2、UpdateStateByKey操作
需要在跨批次之间维护状态时,就必须使用updateStateByKey操作。

你可能感兴趣的:(大数据课程学习)