基于内存计算,提高了在大数据环境下数据处理的实时性,同时保证了高容错性和高可伸缩性,
hadoopI/O的效率往往较低,从而影响了MapReduce的运行速度。Spark是MapReduce的替代方案,而且兼容HDFS、Hive,可融入Hadoop的生态系统,弥补MapReduce的不足。
spark四大核心组件
主要有Spark SQL、Spark Streaming、MLlib、GraphX。
1.Spark SQL
Spark SQL是Spark用来操作结构化数据的组件。支持多种数据源类型,如Hive表、Parquet以及JSON等。Spark SQL不仅为Spark提供了一个SQL接口,还支持开发者将SQL语句融入到Spark应用程序开发过程中,用户可以使用SQL或HQL来查询数据。
2.Spark Streaming
Spark Streaming是Spark平台上针对实时数据进行流式计算的组件,提供了丰富的处理数据流的API。
3.MLlib
MLlib是Spark提供的一个机器学习算法库,其中包含了多种经典常见的机器学习算法,主要有分类、回归、聚类、协同过滤等。
4.GraphX
GraphX是Spark面向图计算提供的框架与算法库。GraphX中提出了弹性分布式属性图的概念。
RDD
RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据抽象,可并行计算的集合
. RDD的创建方式
- 通过外部的数据文件创建,如HDFS:
val rdd1 = sc.textFile(“hdfs://XXXX:9000/data.txt”)
- 通过sc.parallelize进行创建:
val rdd1 = sc.parallelize(Array(1,2,3,4,5,6,7,8))
所有转换都是延迟加载的,记住转换动作后,发生一个要求返回结果给Driver的动作时,这些转换才会真正运行
val rdd1 = sc.parallelize(List(5, 6, 4, 7, 3, 8, 2, 9, 1, 10))//通过并行化生成rdd
val rdd2 = rdd1.map(_ * 2).sortBy(x => x, true)//对rdd1里的每一个元素乘2然后排序
val rdd3 = rdd2.filter(_ >= 10) //过滤出大于等于十的元素
rdd3.collect //将元素以数组的方式在客户端显示
val rdd1 = sc.parallelize(Array("a b c", "d e f", "h i j"))
val rdd2 = rdd1.flatMap(_.split(' ')) //将rdd1里面的每一个元素先切分在压平
rdd2.collect
val rdd5 = rdd1.union(rdd2)
val rdd5 = rdd3.reduceByKey(_ + _)
val rdd5 = rdd4.map(t => (t._2, t._1)).sortByKey(false).map(t => (t._2, t._1))
Spark SQL
- Hive是将HQL转换成MapReduce然后提交到集群上执行,大大简化了编写MapReduce的程序的复杂性,但是MapReduce这种计算模型执行效率比较慢。所以Spark SQL的应运而生,它是将Spark SQL转换成RDD,然后提交到集群执行,执行效率非常快,同时Spark SQL也支持从Hive中读取数据,Hive 2.x 执行引擎可以使用Spark。
基本概念:Datasets和DataFrames
Dataset API 支持Scala和Java。DataFrame API支持的语言有Scala,Java,Python和R
DataFrames创建方式:1通过Case Class:读入RDD再转换成DataFrames 2用SparkSession 3使用JSon文件
(参考:https://juejin.im/post/5cd16c00e51d453a51433062#heading-45)
df.createOrReplaceTempView("emp") #需要生成一个视图 /createGlobalTempView
spark.sql("select * from emp").sho
SparkSession
其为用户提供了一个统一的切入点来使用Spark的各项功能,并且允许用户通过它调用DataFrame和Dataset相关API来编写Spark程序。使得我们可以很容易地与Spark交互。SparkConf, SparkContext 以及 SQLContext这些对象已经封装在SparkSession中,不需要再显式地创建
ew SparkContext(new SparkConf().setAppName("DoubanRecommender"))
例子
import scala.collection.Map
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.SparkContext._
import org.apache.spark.broadcast.Broadcast
import org.apache.spark.mllib.recommendation._
import org.apache.spark.rdd.RDD
case class MovieRating(userID: String, movieID: Int, rating: Double) extends scala.Serializable
object DoubanRecommender {
def main(args: Array[String]): Unit = {
val sc = new SparkContext(new SparkConf().setAppName("DoubanRecommender"))
//val base = "/opt/douban/"
val base = if (args.length > 0) args(0) else "/opt/douban/"
//获取RDD :sc.textFile
val rawUserMoviesData = sc.textFile(base + "user_movies.csv")
val rawHotMoviesData = sc.textFile(base + "hot_movies.csv")
//准备数据
preparation(rawUserMoviesData, rawHotMoviesData)
println("准备完数据")
//model(sc, rawUserMoviesData, rawHotMoviesData)
//evaluate(sc,rawUserMoviesData, rawHotMoviesData)
recommend(sc, rawUserMoviesData, rawHotMoviesData,base)
}
spark.ml.feature
Spark机器学习之特征提取、选择、转换
在spark中提供了两个机器学习库mllib和ml,mllib的操作是基于RDD的,而ml则是基于DataFrame,是主流机器学习库。
ml包括三个主要的抽象类:转换器(Transformer)评估器(Estimator)和管道(Pipeline)spark.ml.feature中提供了许多转换器
学习:https://www.jianshu.com/p/20456b512fa7
http://spark.apache.org/docs/latest/api/python/_modules/pyspark/ml/feature.html
from pyspark.ml.feature import HashingTF, IDF, Tokenizer
sentenceData = spark.createDataFrame([
(0.0, "Hi I heard about Spark"),
(0.0, "I wish Java could use case classes"),
(1.0, "Logistic regression models are neat")
],["label", "sentence"])
tokenizer = Tokenizer(inputCol="sentence", outputCol="words")
wordsData = tokenizer.transform(sentenceData)
hashingTF = HashingTF(inputCol="words", outputCol="rawFeatures", numFeatures=20)
featurizedData = hashingTF.transform(wordsData)
#CountVectorizer也可以用于获得项频率向量
idf = IDF(inputCol="rawFeatures", outputCol="features")
idfModel = idf.fit(featurizedData)
rescaledData = idfModel.transform(featurizedData)
rescaledData.select("label", "features").show()
rescaledData.take(1)
输出:
[Row(label=0.0, sentence='Hi I heard about Spark', words=['hi', 'i', 'heard', 'about', 'spark'],
rawFeatures=SparseVector(20, {0: 1.0, 5: 1.0, 9: 1.0, 17: 2.0}), features=SparseVector(20, {0: 0.6931, 5: 0.6931, 9: 0.2877, 17: 1.3863}))]