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中图形和图形并行计算的一个新㢟,可以用其创建一个顶点和边都包含任意属性的有向多重图。此外,该组件还包含越来越多的图算法和构建起,以此来简化图形分析任务。
一共有三种部署模式:一种是本地(单机)模式;第二种是Yarn集群模式;第三种是Spark自带的Standalone模式。
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”)
Spark惰性机制指整个转化过程只是记录了转化的轨迹,并不会发生真正的计算,只有遇到行动操作时,才会发生真正的计算,开始从血缘关系源头开始,进行物理的转化操作。这样可以避免许多无意义的计算,节省内存。但是每次遇到行动操作,都会从头开始执行计算。每次调用行动操作,都会触发一次从头开始的计算。这对于迭代计算而言,代价是很大的,迭代计算经常需要多次重复使用同一组数据。
1、转化算子
2、行动算子
DataFrame是Spark SQL提供的一个编程抽象,与RDD类似,也是一个分布式的数据集合。但不同的是,DataFrame的数据都被组织到有名字的列中,在RDD的基础上添加了数据描述信息,就像关系型数据库中的表一样。此外,多种数据都可以转化为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)
//将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()
在Spark Streaming中,会有一个组件Receiver,作为一个长期运行的task跑在一个Executor上。
每个Receiver都会负责一个input DStream(比如从文件中读取数据的文件流,比如套接字流,或者从Kafka中读取的一个输入流等)。
Spark Streaming通过input DStream与外部数据源进行连接,读取相关数据。
1、滑动窗口转化操作
设定一个滑动窗口长度(也就是持续时间),设定窗口滑动时间(也就是间隔多少时间进行一次计算),让窗口按照指定时间在源DStream上滑动。每次窗口停止的位置上,都会有一部分DStream被新增入窗口内,形成一个小段的DStream,可以启动对该段DStream的计算。
2、UpdateStateByKey操作
需要在跨批次之间维护状态时,就必须使用updateStateByKey操作。