一二, Spark概述和快速入门
一, Spark概述
1.1 什么是Spark
- Spark是一种基于内存的快速,通用,可扩展的
大数据分析计算引擎
; - “Apache Spark” is a unified analytics engine for large-scale data processing.
1.2 Spark && Hadoop
1.2.1 Spark 速度快
- Spark运行速度相对于hadoop提高100倍;
- Apache Spark使用最先进的DAG调度程序, 查询优化程序和物理执行引擎, 实现批量和流式数据的高性能;
☆☆☆:
Spark 比Hadoop快的原因
(面试!)
详见文章: 点我
1.2.2 Spark 易用
- 可以通过各种不同语言快速编写Spark程序(Scala, Java, Python, R, SQL等)
1.2.3 Spark 通用
- Spark框架不再是一个简单的框架, 可以把Spark理解成一个Spark生态系统, 它的内部包含了很多模块, 基于不同的应用场景可以选择对应的模块去使用:
- SparkSQL: 通过SQL去开发Spark程序做一些
离线分析;
- SparkStreaming:
实时计算
, 去处理一些流式数据; - MLib: 封装了一些
机器学习的算法库
; - GraphX:
图计算
;
- SparkSQL: 通过SQL去开发Spark程序做一些
1.2.4 Spark 兼容性
spark程序就是一个计算逻辑程序,这个任务要运行就需要计算资源(内存、cpu、磁盘),哪里可以给当前这个任务提供计算资源,就可以把spark程序提交到哪里去运行。
目前主要的运行方式是下面的standAlone和yarn
。
- standAlone:它是spark自带的独立运行模式,整个任务的资源分配由spark集群的老大Master负责
- yarn:可以把spark程序提交到yarn中运行,整个任务的资源分配由yarn中的老大ResourceManager负责
- mesos:它也是apache开源的一个类似于yarn的资源调度平台
1.3 Spark vs Hadoop
SPark | Hadoop |
---|---|
1.Scala开发, 快速通用,扩展的大数据分析引擎 | 1. Java开发, 在分布式服务器集群上存储海量数据并运行分布式分析应用的开源框架 |
2. Spark Core 提供了Spark最基础,核心的内容 | 2. HDFS基于GFS理论, 分布式存储数据 |
3. SpaekSQL 是Spark用来操作结构化数据的组件, 通过Spark SQL, 用户可使用SQL或者HQL来查询数据 | 3. MapReduce基于Goole MapReduce, 分布式计算 |
4. SparkStreaming是Spark平台上针对实时数据进行了流式计算的组件, 提供了丰富的处理数据流的API | 5. Hbase基于Bigtable, 分布式数据库, 擅长实时的随机读写超大规模数据集 |
- 一次性数据计算:
框架在处理数据的时候, 会从存储设备中读取数据, 进行逻辑操作, 然后将处理的结果重新存储到介质中。
二, Spark 快速上手
- 简单的WordCount程序
- 必须的环境:
- IDEA装好
Scala插件
: 参考本文
- IDEA装好
2.1 创建Maven项目
new project ->选则合适的project jdk(jdk 1.8) ->下一步->填好合适的gav
在 settings -> plugins
安装好scala插件
, 并给参考本文在 project structure -> global Libraries中
添加 scala的sdk
在maven项目中新建新的module, 对项目进行
分类
pom文件中, 添加Spark 3.0 的
依赖
<dependencies><dependency><groupId>org.apache.spark</groupId><artifactId>spark-core_2.12</artifactId><version>3.0.0</version></dependency></dependencies>
- 配置log4j, 更好的跟踪程序执行日志, 即在maven项目的resources目录创建log4j.properties文件, 并添加日志配置信息如下:
- 控制日志级别. 只有ERROR才会显示
log4j.rootCategory=ERROR, console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.target=System.err
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yy/MM/dd
HH:mm:ss} %p %c{1}: %m%n
# Set the default spark-shell log level to ERROR. When running the spark-shell,
the
# log level for this class is used to overwrite the root logger's log level, so
that
# the user can have different defaults for the shell and regular Spark apps.
log4j.logger.org.apache.spark.repl.Main=ERROR
# Settings to quiet third party logs that are too verbose
log4j.logger.org.spark_project.jetty=ERROR
log4j.logger.org.spark_project.jetty.util.component.AbstractLifeCycle=ERROR
log4j.logger.org.apache.spark.repl.SparkIMain$exprTyper=ERROR
log4j.logger.org.apache.spark.repl.SparkILoop$SparkILoopInterpreter=ERROR
log4j.logger.org.apache.parquet=ERROR
log4j.logger.parquet=ERROR
# SPARK-9183: Settings to avoid annoying messages when looking up nonexistent
UDFs in SparkSQL with Hive support
log4j.logger.org.apache.hadoop.hive.metastore.RetryingHMSHandler=FATAL
log4j.logger.org.apache.hadoop.hive.ql.exec.FunctionRegistry=ERROR
2.2 Spark’s WordCount
- 让我们先用Scala的思路写一遍wordcount流程
不熟悉Scala集合函数的可以翻看笔者的文章: 五-2, Scala集合常用函数全总结
object SparkWordCountDemo {def main(args: Array[String]): Unit = {/spark api 操作//2. 创建配置对象, 并设置好必须的参数var conf = new SparkConfconf.setMaster("local[*]") //本地模式conf.setAppName("WordCountEasy")//1.创建Spark上下文,var sc: SparkContext = new SparkContext(conf)//3. 操作//3.1 读取文件数据val line: RDD[String] = sc.textFile("spark_demo_data/input")/3.2 把每行的数据按空格切分, 然后每个单词单独存储起来val words: RDD[String] = line.flatMap(x => x.split(" ")) /// ? 产生的是怎样的数据/3.3 对单词进行分组. 记住, 组名作为key, 每一组的元素是一个valueval groupedWords: RDD[(String, Iterable[String])] = words.groupBy(words => words)3.4 转换单词组为 (word, words集合) => (wrods, String的一个迭代器) => (words, words.size)val resRDD: RDD[(String, Int)] = groupedWords.map(x => (x._1, x._2.size))3.5 将转换结果采集到控制台val res: Array[(String, Int)] = resRDD.collect()println("=====")println(res.mkString("Array(",",",")"))//sc.groupBy//4. 关闭连接sc.stop()}
}
- 既然我们已经在学习Spark了, 就要尝试下用spark的聚合计算方法 ‘reduceByKey’
object WordCount {def main(args: Array[String]): Unit = {//2. 创建Spark的配置文件对象, 并设置一些必要的配置val conf = new SparkConf()conf.setMaster("local[*]")conf.setAppName("StandardWordCount")//1. 创建Spark上下文,//2.1 向上下文对象中传入配置对象val sc = new SparkContext(conf)//3. 读取文件的每一行val line: RDD[String] = sc.textFile("spark_demo_data/input")//4. 格式化每一行, 分词val words: RDD[String] = line.flatMap(_.split(" "))//5. 给每个单词都加上1标识, 即 (word, 1)val wordsWithOne: RDD[(String, Int)] = words.map(x => (x, 1))//6. 规约val resRDD: RDD[(String, Int)] = wordsWithOne.reduceByKey(_ + _)//7. 从内存中把结果取出来, 并输出val resArray: Array[(String, Int)] = resRDD.collect()println(resArray.mkString("Array(",",",")") + "\n")//8. 关闭资源连接sc.stop()}
}
- 沿着上面的这个思路, 我们还可以利用Scala集合的高级函数实现wordcount
package cn.cyy.spark.core.wordcountdemo.wordcountimport org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}object WordCount {def main(args: Array[String]): Unit = {//2. 创建Spark的配置文件对象, 并设置一些必要的配置val conf = new SparkConf()conf.setMaster("local[*]")conf.setAppName("StandardWordCount")//1. 创建Spark上下文,//2.1 向上下文对象中传入配置对象val sc = new SparkContext(conf)//3. 读取文件的每一行val line: RDD[String] = sc.textFile("spark_demo_data/input")//4. 格式化每一行, 分词val words: RDD[String] = line.flatMap(_.split(" "))//5. 给每个单词都加上1标识, 即 (word, 1)val wordsWithOne: RDD[(String, Int)] = words.map(x => (x, 1))//5.1 分组val groupedWordWithOne: RDD[(String, Iterable[(String, Int)])] = wordsWithOne.groupBy(tuple => tuple._1)//5.2 先reduce, 之后mapval resRDD: RDD[(String, Int)] = groupedWordWithOne.map {case (word, list) => {list.reduce((x, y) => {(x._1, x._2 + y._2)})}}// //6. 规约
// val resRDD: RDD[(String, Int)] = wordsWithOne.reduceByKey(_ + _)//7. 从内存中把结果取出来, 并输出val resArray: Array[(String, Int)] = resRDD.collect()println(resArray.mkString("Array(",",",")"))//8. 关闭资源连接sc.stop()}
}
一二, Spark概述和快速入门相关推荐
- 尚硅谷大数据技术Spark教程-笔记01【Spark(概述、快速上手、运行环境、运行架构)】
视频地址:尚硅谷大数据Spark教程从入门到精通_哔哩哔哩_bilibili 尚硅谷大数据技术Spark教程-笔记01[Spark(概述.快速上手.运行环境.运行架构)] 尚硅谷大数据技术Spark教 ...
- 小汤学编程之JDBC(一)——JDBC概述和快速入门
一.JDBC概述 1.概念 2.作用 二.JDBC快速入门 1.实现步骤 2.查询数据和操作数据 3.SQL注入 4.事务管理 5.Statement与Prep ...
- (一)Flume概述及快速入门
目录 一.Flume概述 1. Flume定义 2. Flume基础架构 2.1 Agent 2.2 Source 2.3 Sink 2.4 Channel 2.5 Event 二.Flume快速入门 ...
- Day14-HTTP协议 web开发概述 servlet快速入门
HTTP:HyperText Transfer Protocol 超文本传输协议 用于定义web浏览器和web服务器之间交换数据的过程 特点: 基于请求/响应模型的协议.请求和相应必须成对出现,现有请 ...
- 腾讯云云直播CSS产品概述和快速入门
腾讯云云直播CSS产品概述 云直播(Cloud Streaming Services)为您提供极速.稳定.专业的直播云端处理服务,根据业务中不同直播场景的需求,云直播提供标准直播.慢直播.快直播和云导 ...
- arm rtx教程_ARM CMSIS标准概述及快速入门
CMSIS的创建是为了帮助行业实现标准化,减少了客户学习曲线,开发成本,缩短产品上市时间. 再来看看CMSIS是什么,有哪些工具提供及快速入门~ CMSIS:(Cortex Microcontroll ...
- [JavaWeb-Servlet]概述与快速入门
Servlet: server applet * 概念:运行在服务器端的小程序* Servlet就是一个接口,定义了Java类被浏览器访问到(tomcat识别)的规则.* 将来我们自定义一个类,实现S ...
- VueJS 概述与快速入门
vue 调试插件及jar 链接:https://pan.baidu.com/s/1wh_ibqxD82w2jvg29N8RZg 提取码:5gqo VueJS介绍 1.1 Vue.js是一个构建数据驱 ...
- Spring框架概述(快速入门)
Spring 框架概述: 目录 Spring 框架概述: 1.Spring 是轻量级的开源的 javaEE 框架 2.Spring 有两个核心部分:IOC 和 AOP: 3.Spirng 特点: 4. ...
最新文章
- 【转载】wpf学习笔记1
- oracle在日期区间分页查询,Oracle 日期分页
- 三层架构的原理及实现
- Chrome DevTools 之 Network,网络加载分析利器
- 科大星云诗社动态20201129
- nginx日志切割并使用flume-ng收集日志
- [UE4]给Widget增加参数,Pre Construct和Construct的区别
- mongoengine.NotUniqueError
- C# 中 Struct 和 Class 的区别总结
- DEV控件中GridView中的复选框与CheckBox实现联动的全选功能
- 【xml】利用OpenCV解析
- Pspice 使用指南(中文)
- iphone开发常用编码
- Web(4)servlet
- “我爱淘”冲刺阶段Scrum站立会议9
- The Beatles - Don't bother me 歌词翻译
- 5种尊重您隐私的替代搜索引擎
- Altium-Designer6.9安装报错Application Error
- vsCode自动保存与浏览器自动刷新
- DELL T7600工作站重新安装WIN7系统