Spark基础学习笔记01:初步了解Spark
文章目录
- 零、本讲学习目标
- 一、大数据开发总体架构
- 二、Spark简介
- 三、Spark发展史
- 四、Spark特点
- (一)快速
- (二)易用
- (三)通用
- (四)随处运行
- (五)代码简洁
- 1、采用MR实现词频统计
- 2、采用Spark实现词频统计
- 五、Spark主要组件
- (一)Spark Core
- (二)Spark SQL
- (三)Spark Streaming
- (三)MLlib
- (四)GraphX
- 六、Spark应用场景
- (一)腾讯
- (二)Yahoo
- (三)淘宝
- (四)优酷土豆
- 七、课后思考题
零、本讲学习目标
- 了解Spark发展史
- 了解Spark的特点
- 了解Spark存储层次
- 了解Spark生态圈
- 了解Spark应用场景
一、大数据开发总体架构
二、Spark简介
- Apache Spark™ is a multi-language engine for executing data engineering, data science, and machine learning on single-node machines or clusters.
- Apache Spark是一个快速通用的集群计算系统,是一种与Hadoop相似的开源集群计算环境,但是Spark在某些工作负载方面表现得更加优越。它提供了Java、Scala、Python和R的高级API,以及一个支持通用的执行图计算的优化引擎。它还支持一组丰富的高级工具,包括使用SQL进行结构化数据处理的Spark SQL、用于机器学习的MLlib、用于图处理的GraphX,以及用于实时流处理的Spark Streaming。
- Spark作为下一代大数据处理引擎,现已成为当今大数据领域非常活跃、高效的大数据计算平台,很多互联网公司都使用Spark来实现公司的核心业务,例如阿里的云计算平台、京东的推荐系统等,只要和海量数据相关的领域,都有Spark的身影。Spark提供了Java、Scala、Python和R的高级API,支持一组丰富的高级工具,包括使用SQL进行结构化数据处理的SparkSQL,用于机器学习的MLlib,用于图处理的GraphX,以及用于实时流处理的Spark Streaming。这些高级工具可以在同一个应用程序中无缝地组合,大大提高了开发效率,降低了开发难度。
三、Spark发展史
- 对于一个具有相当技术门槛与复杂度的平台,Spark从诞生到正式版本的成熟,经历的时间如此之短,让人感到惊诧。2009年,Spark诞生于伯克利大学AMPLab,最开初属于伯克利大学的研究性项目。它于2010年正式开源,并于2013年成为了Aparch基金项目,并于2014年成为Aparch基金的顶级项目,整个过程不到五年时间。
- Spark目前最新版本是2022年1月26日发布的Spark3.2.1
四、Spark特点
- Spark官网上给出Spark的特点
(一)快速
- 与MapReduce相比,Spark可以支持包括Map和Reduce在内的更多操作,这些操作相互连接形成一个有向无环图(Directed Acyclic Graph,简称DAG),各个操作的中间数据则会被保存在内存中。因此处理速度比MapReduce更加快。Spark通过使用先进的DAG调度器、查询优化器和物理执行引擎,从而能够高性能的实现批处理和流数据处理。
(二)易用
- Spark支持使用Scala、Python、Java及R语言快速编写应用。同时Spark提供超过80个高级运算符,使得编写并行应用程序变得容易并且可以在Scala、Python或R的交互模式下使用Spark。
(三)通用
- Spark可以与SQL、Streaming及复杂的分析良好结合。Spark还有一系列的高级工具,包括Spark SQL、MLlib(机器学习库)、GraphX(图计算)和Spark Streaming,并且支持在一个应用中同时使用这些组件。
(四)随处运行
- 用户可以使用Spark的独立集群模式运行Spark,也可以在EC2(亚马逊弹性计算云)、Hadoop YARN或者Apache Mesos上运行Spark。并且可以从HDFS、Cassandra、HBase、Hive、Tachyon和任何分布式文件系统读取数据。
(五)代码简洁
- 参看【采用多种方式实现词频统计】
1、采用MR实现词频统计
- 编写WordCountMapper
package net.hw.wc;import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;import java.io.IOException;/*** Created by howard on 2018/2/6.*/
public class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable> {@Overrideprotected void map(LongWritable key, Text value, Mapper.Context context)throws IOException, InterruptedException {String line = value.toString();String[] data = line.split(" ");for (int i = 0; i < data.length; i++) {context.write(new Text(data[i]), new IntWritable(1));}}
}
- 编写WordCountReducer
package net.hw.wc;import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;import java.io.IOException;/*** Created by howard on 2018/2/6.*/
public class WordCountReducer extends Reducer<Text, IntWritable, Text, IntWritable> {@Overrideprotected void reduce(Text key, Iterable<IntWritable> values, Context context)throws IOException, InterruptedException {int count = 0;for (IntWritable value : values) {count = count + value.get();}context.write(key, new IntWritable(count));}
}
- 编写WordCountDriver
package net.hw.wc;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;import java.net.URI;/*** Created by howard on 2018/2/6.*/
public class WordCountDriver {public static void main(String[] args) throws Exception {Configuration conf = new Configuration();Job job = Job.getInstance(conf);job.setJarByClass(WordCountDriver.class);job.setMapperClass(WordCountMapper.class);job.setMapOutputKeyClass(Text.class);job.setMapOutputValueClass(IntWritable.class);job.setReducerClass(WordCountReducer.class);job.setOutputKeyClass(Text.class);job.setOutputValueClass(IntWritable.class);String uri = "hdfs://hadoop:9000";Path inputPath = new Path(uri + "/word");Path outputPath = new Path(uri + "/word/result");FileSystem fs = FileSystem.get(new URI(uri), conf);fs.delete(outputPath, true);FileInputFormat.addInputPath(job, inputPath);FileOutputFormat.setOutputPath(job, outputPath);job.waitForCompletion(true);System.out.println("统计结果:");FileStatus[] fileStatuses = fs.listStatus(outputPath);for (int i = 1; i < fileStatuses.length; i++) {System.out.println(fileStatuses[i].getPath());FSDataInputStream in = fs.open(fileStatuses[i].getPath());IOUtils.copyBytes(in, System.out, 4096, false);}}
}
- 运行程序WordCountDriver,查看结果
2、采用Spark实现词频统计
- 编写WordCount
package net.hw.spark.wcimport org.apache.spark.{SparkConf, SparkContext}/*** Created by howard on 2018/2/6.*/
object WordCount {def main(args: Array[String]): Unit = {val conf = new SparkConf().setMaster("local").setAppName("wordcount")val sc = new SparkContext(conf)val rdd = sc.textFile("test.txt").flatMap(_.split(" ")).map((_, 1)).reduceByKey(_ + _)rdd.foreach(println)rdd.saveAsTextFile("result")}
}
- 启动WordCount,查看结果
- 大家可以看出,完成同样的词频统计任务,Spark代码比MapReduce代码简洁很多。
五、Spark主要组件
- Spark是由多个组件构成的软件栈,Spark 的核心(Spark Core)是一个对由很多计算任务组成的、运行在多个工作机器或者一个计算集群上的应用进行调度、分发以及监控的计算引擎。
- 在Spark Core的基础上,Spark提供了一系列面向不同应用需求的组件,例如Spark SQL结构化处理和MLlib机器学习等。这些组件关系密切并且可以相互调用,这样可以方便地在同一应用程序中组合使用。
- Spark自带一个简易的资源调度器,称为独立调度器(
Standalone
)。若集群中没有任何资源管理器,则可以使用自带的独立调度器。当然,Spark也支持在其他的集群管理器上运行,包括Hadoop YARN
、Apache Mesos
等。 - Spark本身并没有提供分布式文件系统,因此Spark的分析大多依赖于HDFS,也可以从HBase和Amazon S3等持久层读取数据。
(一)Spark Core
- Spark Core是Spark的核心模块,主要包含两部分功能:一是负责任务调度、内存管理、错误恢复、与存储系统交互等;二是其包含对弹性分布式数据集(Resilient Distributed Dataset,RDD)的API定义。RDD表示分布在多个计算节点上可以并行操作的元素集合,是Spark主要的编程抽象。SparkCore提供了创建和操作这些集合的多个API。
(二)Spark SQL
- Spark SQL是一个用于结构化数据处理的Spark工具包,提供了面向结构化数据的SQL查询接口,使用户可以通过编写SQL或基于Apache Hive的HiveQL来方便地处理数据。当然,Spark SQL也可以查询数据仓库Hive中的数据,相当于数据仓库的查询引擎,提供了很强大的计算速度。
- Spark SQL还支持开发者将SQL语句融入Spark应用程序开发过程中,使用户可以在单个应用中同时进行SQL查询和复杂的数据分析。
(三)Spark Streaming
- Spark Streaming是Spark提供的对实时数据进行流式计算的组件(比如生产环境中的网页服务器日志,以及网络服务中用户提交的状态更新组成的消息队列,都是数据流),它是将流式的计算分解成一系列短小的批处理作业,支持对实时数据流进行可伸缩、高吞吐量、容错的流处理。数据可以从Kafka、Flume、Kinesis和TCP套接字等许多来源获取,可以对数据使用map、reduce、join和window等高级函数表示的复杂算法进行处理。最后,可以将处理后的数据发送到文件系统、数据库和实时仪表盘。事实上,也可以将Spark的机器学习和图形处理算法应用于数据流。
- Spark Streaming提供了用来操作数据流的API,并且与Spark Core中的RDD API高度对应,可以帮助开发人员高效地处理数据流中的数据。从底层设计来看,Spark Streaming支持与Spark Core同级别的容错性、吞吐量以及可伸缩性。
- Spark Streaming通过将流数据按指定时间片累积为RDD,然后将每个RDD进行批处理,进而实现大规模的流数据处理。
- Spark Streaming接收Kafka、Flume、HDFS等各种来源的实时输入数据,进行处理后,处理结构保存在HDFS、DataBase等各种地方。
- Find words with higher frequency than historic data
(三)MLlib
- MLlib fits into Spark’s APIs and interoperates with NumPy in Python (as of Spark 0.9) and R libraries (as of Spark 1.5). You can use any Hadoop data source (e.g. HDFS, HBase, or local files), making it easy to plug into Hadoop workflows.
- MLlib是Spark的机器学习(Machine Learning,ML)库。它的目标是使机器学习具有可扩展性和易用性。其中提供了分类、回归、聚类、协同过滤等常用机器学习算法,以及一些更加底层的机器学习原语。
(四)GraphX
- Seamlessly work with both graphs and collections. GraphX unifies ETL, exploratory analysis, and iterative graph computation within a single system. You can view the same data as both graphs and collections, transform and join graphs with RDDs efficiently, and write custom iterative graph algorithms using the Pregel API.
- GraphX是Spark中图形和图形并行计算的一个新组件,可以用其创建一个顶点和边都包含任意属性的有向多重图。此外,GraphX还包含越来越多的图算法和构建器,以简化图形分析任务。
六、Spark应用场景
(一)腾讯
- 广点通是最早使用Spark的应用之一。腾讯大数据精准推荐借助Spark快速迭代的优势,围绕“
数据+算法+系统
”这套技术方案,实现了在“数据实时采集、算法实时训练、系统实时预测
”的全流程实时并行高维算法,最终成功应用于广点通pCTR (Predict Click-Through Rate) 投放系统上,支持每天上百亿的请求量。
(二)Yahoo
- Yahoo将Spark用在Audience Expansion中。Audience Expansion是广告中寻找目标用户的一种方法,首先广告者提供一些观看了广告并且购买产品的样本客户,据此进行学习,寻找更多可能转化的用户,对他们定向广告。Yahoo采用的算法是
Logistic Regression
。同时由于某些SQL负载需要更高的服务质量,又加入了专门跑Shark的大内存集群,用于取代商业BI/OLAP工具,承担报表/仪表盘和交互式/即席查询,同时与桌面BI工具对接。
(三)淘宝
- 淘宝技术团队使用了Spark来解决多次迭代的机器学习算法、高计算复杂度的算法等,将Spark运用于淘宝的推荐相关算法上,同时还利用GraphX解决了许多生产问题,包括以下计算场景:基于度分布的中枢节点发现、基于最大连通图的社区发现、基于三角形计数的关系衡量、基于随机游走的用户属性传播等。
(四)优酷土豆
- 目前Spark已经广泛使用在优酷土豆的视频推荐,广告业务等方面,相比Hadoop,Spark交互查询响应快,性能比Hadoop提高若干倍。一方面,使用Spark模拟广告投放的计算效率高、延迟小(同Hadoop比延迟至少降低一个数量级)。另一方面,优酷土豆的视频推荐往往涉及机器学习及图计算,而使用Spark解决机器学习、图计算等迭代计算能够大大减少网络传输、数据落地等的次数,极大地提高了计算性能。
七、课后思考题
- 为什么需要Spark?
- Spark有哪些特点?
- Spark生态圈包含哪些环境?
Spark基础学习笔记01:初步了解Spark相关推荐
- Spark基础学习笔记06:搭建Spark On YARN模式的集群
文章目录 零.本讲学习目标 一.在Spark Standalone模式的集群基础上修改配置 二.运行Spark应用程序 (一)启动Hadoop的HDFS和YARN (二)运行Spark应用程序 (三) ...
- Spark基础学习笔记04:搭建Spark伪分布式环境
文章目录 零.本讲学习目标 一.搭建伪分布式Hadoop (一)登录ied虚拟机 (二)配置免密登录 1.生成密钥对 2.将生成的公钥发送到本机(虚拟机ied) 3.验证虚拟机是否能免密登录本机 (三 ...
- Spark基础学习笔记07:搭建Spark HA集群
文章目录 零.本讲学习目标 一.Spark HA集群概述 二.Spark HA集群架构 三.集群角色分配表 四.Spark HA集群搭建步骤 (一)安装配置ZooKeeper 1.在虚拟机master ...
- Spark基础学习笔记05:搭建Spark Standalone模式的集群
文章目录 零.本讲学习目标 一.Spark集群拓扑 (一)集群拓扑 (二)集群角色分配 二.搭建集群 (一)私有云上创建三台虚拟机 (二)利用SecureCRT登录三台虚拟机 1.登录master虚拟 ...
- Spark基础学习笔记06:搭建Spark On YARN集群
文章目录 零.本讲学习目标 一.Spark On YARN架构 (一)client提交方式 (二)cluster提交方式 二.搭建Spark On YARN集群 (一)搭建Spark Standalo ...
- Spark基础学习笔记05:搭建Spark Standalone集群
文章目录 零.本讲学习目标 一.Spark Standalone架构 (一)client提交方式 (二)cluster提交方式 二.Spark集群拓扑 (一)集群拓扑 (二)集群角色分配 三.搭建三节 ...
- 2022年Spark基础学习笔记目录
一.Spark学习笔记 在私有云上创建与配置虚拟机 Spark基础学习笔记01:初步了解Spark Spark基础学习笔记02:Spark运行时架构 Spark基础学习笔记03:搭建Spark单机版环 ...
- 2022年Spark基础学习笔记
一.Spark学习笔记 在OpenStack私有云上创建与配置虚拟机 Spark基础学习笔记01:初步了解Spark Spark基础学习笔记02:Spark运行时架构 Spark基础学习笔记03:搭建 ...
- Spark基础学习笔记16:创建RDD
文章目录 零.本讲学习目标 一.RDD为何物 (一)RDD概念 (二)RDD示例 (三)RDD主要特征 二.做好准备工作 (一)准备文件 1.准备本地系统文件 2.准备HDFS系统文件 (二)启动Sp ...
最新文章
- android textview图标左侧,Android 自定义 TextView drawableTop 图标与文字左对齐(效果图)...
- 如何在github发布个人网站或开源项目-手把手教您制作并发布个人网站或主页(二)
- 如何用Service来启动背景音乐
- plsql(轻量版)_基本语法
- 《深入浅出DPDK》读书笔记(七):PCIe与包处理I/O
- Enterprise Library +Caliburn.Micro+WPF CM框架下使用企业库验证,验证某一个属性,整个页面的文本框都变红的原因...
- 升级mac Mojave系统,git无法使用
- vim 快捷键大全和插件大全
- 使用计算机创建表步骤,2012年计算机二级VFP表的创建和使用学习教程
- 基于机器视觉技术的表面缺陷检测技术综述
- VMware清理vmdk文件,解决vmdk越来越大的问题
- Linux team多网卡绑定
- Gradle version 和 Android Plugin Version是什么东东,有啥关系
- 交银施罗德基金郭斐:集中心力,布好一盘“成长投资”
- 卡贴机被“全面封杀”?苹果关闭有锁iPhone的ICCID激活服务
- 【工业互联网】郭朝晖:工业互联网平台背景下的工业大数据与智能制造
- 微信网页授权:网页版(一)
- centos 硬盘挂载
- “青软杯”安徽科技学院第六届程序设计大赛_专业组
- Unity WebGL(一)Unity和JS交互
热门文章
- 扎根CNCF社区贡献五年是怎样的体验?听听华为云原生开源团队的负责人怎么说
- Spark的分布式存储系统BlockManager全解析
- 性能达到原生 MySQL 七倍,华为云 Taurus 技术解读
- c语言出勤率随机,c
- 产品ajax无刷新kesion,KesionCMSV6置标使用手册.doc
- SpringBoot自动装配探究
- Kotlin学习笔记 第二章 类与对象 第十节 内部类嵌套类
- GprMax 3.1.5 建模的in文件编写详解(1)
- (组合数学笔记)Pólya计数理论_Part.3_置换群及其性质
- MySQL统计两部分查询结果记录数量比值