Spark简介
Apache Spark 是专为大规模数据处理而设计的快速通用的计算引擎。Spark是UC Berkeley AMP lab (加州大学伯克利分校的AMP实验室)所开源的类Hadoop MapReduce的通用并行框架,Spark,拥有Hadoop MapReduce所具有的优点;但不同于MapReduce的是——Job中间输出结果可以保存在内存中,从而不再需要读写HDFS,因此Spark能更好地适用于数据挖掘与机器学习等需要迭代的MapReduce的算法。
Spark 是一种与 Hadoop 相似的开源集群计算环境,但是两者之间还存在一些不同之处,这些有用的不同之处使 Spark 在某些工作负载方面表现得更加优越,换句话说,Spark 启用了内存分布数据集,除了能够提供交互式查询外,它还可以优化迭代工作负载。
Spark 是在 Scala 语言中实现的,它将 Scala 用作其应用程序框架。与 Hadoop 不同,Spark 和 Scala 能够紧密集成,其中的 Scala 可以像操作本地集合对象一样轻松地操作分布式数据集。
Spark生态圈
Spark力图整合机器学习(MLib)、图算法(GraphX)、流式计算(Spark Streaming)和数据仓库(Spark SQL)等领域,通过计算引擎Spark,弹性分布式数据集(RDD),架构出一个新的大数据应用平台。
Spark生态圈以HDFS、S3、Techyon为底层存储引擎,以Yarn、Mesos和Standlone作为资源调度引擎;使用Spark,可以实现MapReduce应用;基于Spark,Spark SQL可以实现即席查询,Spark Streaming可以处理实时应用,MLib可以实现机器学习算法,GraphX可以实现图计算,SparkR可以实现复杂数学计算。
Pig Latin数据流编程语言,将操作组成有向无环图DAG
Pig、Hive基于MapReduce
Pig、Hive基于Tez:多个有依赖的作业转换为一个作业,中间节点减少,只需写一次HDFS
spark的优点
Spark的中间数据放到内存中,对于迭代运算效率更高。
Spark更适合于迭代运算比较多的ML和DM运算。因为在Spark里面,有RDD的抽象概念。
Spark比Hadoop更通用
Spark提供的数据集操作类型有很多
①Transformations转换操作:map,filter, flatMap, sample, groupByKey, reduceByKey, union, join, cogroup,mapValues, sort,partionBy等。
②actions行动操作:Count,collect, reduce, lookup, save等。
一个Spark的“Hello World”程序
读取一个HDFS文件,计算包含字符串“Hello World”行数
val sc= new SparkContext(“spark://localhost:7077”,”Hello World”,
“YOUR_SPARK_HOME”,”YOUR_APP_JAR”)
val fileRDD =sc.textFile(“hdfs://192.168.0.103:9000/examplefile”)
val filterRDD =fileRDD.filter(_.contains(“Hello World”))
filterRDD.cache()
filterRDD.count()
val sc= new SparkContext(“spark://localhost:7077”,”Hello World”,“YOUR_SPARK_HOME”,”YOUR_APP_JAR”) //创建SparkContext对象
在spark程序运行起来后,程序就会创建sparkContext,解析用户的代码,当遇到action算的时候开始执行程序,但是在执行之前还有很多前提工作要在sparkContext中做的。
val fileRDD =sc.textFile(“hdfs://192.168.0.103:9000/examplefile”) //从HDFS文件中读取数据创建一个RDD
RDD是一个分布式对象集合,本质上是一个只读的分区记录集合,每个RDD可以分成多个分区,每个分区就是一个数据集片段,并且一个RDD的不同分区可以被保存到集群中不同的节点上,从而可以在集群中的不同节点上进行并行计算。RDD提供了一种高度受限的共享内存模型.
val filterRDD =fileRDD.filter(_.contains(“Hello World”)) //对fileRDD进行转换操作得到一个新的RDD,即filterRDD。
filterRDD.cache() //对filterRDD进行持久化
把它保存在内存或磁盘中(这里采用cache接口把数据集保存在内存中),方便后续重复使用,当数据被反复访问时(比如查询一些热点数据,或者运行迭代算法),这是非常有用的,而且通过cache()可以缓存非常大的数据集,支持跨越几十甚至上百个节点。
filterRDD.count() //count()是一个行动操作,用于计算一个RDD集合中包含的元素个数
Spark的编程模型
三种编程语言:Scala、Java、Python
Spark的转换和行动操作:
RDD执行过程为DAG
容错性、RDD在内存、数据不需要序列化
根据RDD分区的依赖关系划分阶段
宽依赖、窄依赖
RDD计算模型
(1)创建RDD对象;
(2)SparkContext负责计算RDD之间的依赖关系,构建DAG;
(3)DAGScheduler负责把DAG图分解成多个阶段,每个阶段中包含了多个任务,每个任务会被任务调度器分发给各个工作节点(Worker Node)上的Executor去执行。
流计算:Spark Streaming、交互式分析:Spark SQL、实时计算
Spark与Scala
一、Spark与Scala版本兼容问题:
Spark运行在Java 8 +,Python 2.7 +/ 3.4 +和R 3.1+上。对于Scala API,Spark 2.4.2使用Scala 2.12。您需要使用兼容的Scala版本(2.12.x)。
请注意,自Spark 2.2.0起,对2.6.5之前的Java 7,Python 2.6和旧Hadoop版本的支持已被删除。自2.3.0起,对Scala 2.10的支持被删除。自Spark 2.4.1起,对Scala 2.11的支持已被弃用,将在Spark 3.0中删除。
https://spark.apache.org/docs/latest/index.html
二、官网下载安装Scala:scala-2.12.8.tgz
https://www.scala-lang.org/download/
tar -zxvf scala-2.12.8.tgz -C /opt/module
mv scala-2.12.8 scala
测试:scala -version
启动:scala
三、官网下载安装Spark:spark-2.4.2-bin-hadoop2.7.tgz
https://www.apache.org/dyn/closer.lua/spark/spark-2.4.2/spark-2.4.2-bin-hadoop2.7.tgz
解压、重命名,启动spark
①先启动hadoop 环境
start-all.sh
②启动spark环境
进入到SPARK_HOME/sbin下运行start-all.sh
/opt/module/spark/sbin/start-all.sh
[注] 如果使用start-all.sh时候会重复启动hadoop配置,需要./在当前工作目录下执行命令
jps 观察进程 多出 worker 和 mater 两个进程。
查看spark的web控制页面:http://bigdata128:8080/
显示spark的端口是7070
③启动Spark Shell
此模式用于interactive programming,先进入bin文件夹后运行:spark-shell
SecureCRT 下 spark-shell 下scala> 命令行无法删除,解决办法:
https://blog.csdn.net/nicolewjt/article/details/87368749
④退出Spark Shell
scala> :quit
四、使用Spark Shell编写代码
读取本地文件
显示第一行内容
读取HDFS文件
对上述hdfs根目录下f1.txt文件进行词频统计
flatMap转换操作、 map转换操作、reduceByKey转换操作
查看结果
五、使用Scala编写Spark程序
val spark =new SparkContext(master, appName, [sparkHome], [jars])
val file =spark.textFile("hdfs://...")
val counts =file.flatMap(line => line.split(" ")) .map(word => (word, 1)) .reduceByKey(_+ _)
counts.saveAsTextFile("hdfs://...")
file是根据HDFS上的文件创建的RDD,flatMap、map、reduceByKe都创建出一个新的RDD,一个简短的程序就能够执行很多个转换和动作
总 结
近几年来,大数据机器学习和数据挖掘的并行化算法研究成为大数据领域一个较为重要的研究热点。早几年国内外研究者和业界比较关注的是在 Hadoop 平台上的并行化算法设计。然而, HadoopMapReduce 平台由于网络和磁盘读写开销大,难以高效地实现需要大量迭代计算的机器学习并行化算法。随着 UC Berkeley AMPLab 推出的新一代大数据平台 Spark 系统的出现和逐步发展成熟,近年来国内外开始关注在 Spark 平台上如何实现各种机器学习和数据挖掘并行化算法设计。为了方便一般应用领域的数据分析人员使用所熟悉的 R 语言在 Spark 平台上完成数据分析,Spark 提供了一个称为 SparkR 的编程接口,使得一般应用领域的数据分析人员可以在 R 语言的环境里方便地使用 Spark 的并行化编程接口和强大计算能力。