Spark基础学习--基础介绍

1. Spark基本介绍

1.1 定义

Spark是可以处理大规模数据的统一分布式计算引擎。

1.2 Spark与MapReduce的对比

在之前我们学习过MapReduce,同样作为大数据分布式计算引擎,究竟这两者有什么区别呢?
首先我们回顾一下MapReduce的架构:MR基于HDFS实现大数据存储,基于Yarn做资源调度,且MR是基于进程处理数据的

总结一下MR的缺点:
1.MR是基于进程进行数据处理,进程相对于线程来说,在创建和销毁的过程比较消耗资源,并且数据比较慢
2.MR在运行的时候,中间有大量的磁盘IO过程。也就是磁盘数据到内存,内存到磁盘反复的读写过程
3.MR只提供了非常低级或者说非常底层的编程API,如果想要开发比较复杂的程序,需要写大量的代码

这样对比起来,我们可以总结出Spark的优点:
1.Spark是基于线程来执行任务
2.引入了新的数据结构—RDD(弹性分布式数据集),能够让Spark程序主要基于内存进行运行。内存的读写数据相对磁盘来说要快得多
3.Spark提供了更加丰富的编程API,能够非常轻松地实现功能开发

进程和线程的对比:
1.线程的创建和销毁,比进程会更加的快速,以及更加的节省资源
2.进程很难共享内存中的数据;而同个进程中的线程可以共享内存中的数据
进程和线程具体介绍可以看上一篇笔记。

2. Spark的特点

  1. 高效性–计算速度快
    • 提供了一个全新的数据结构RDD(弹性分布式数据集)
    • 基于内存计算,内存不足时可以放置在磁盘上,避免了反复磁盘读写的操作,提高了计算速度,相比于Hadoop要快100倍
    • 整个流程是基于DAG有向无环图执行方案
    • Task线程完成计算任务的执行
  2. 易用性
    支持多种开发语言,降低编程难度
  3. 通用性
    在Spark基础上,Spark还提供了Spark SQL等多个工具库,可以在一个应用中无缝使用这些库
  4. 兼容性–在任何地方都可运行
    • 支持三方工具接入
    • 支持多个操作系统

3. Spark框架模块

在这里插入图片描述

  • Spark Core API:实现了 Spark 的基本功能。包含RDD、任务调度、内存管理、错误恢复、与存储系统交互等模块。数据结构RDD。
  • Spark SQL:我们可以使用 SQL处理结构化数据。数据结构:Dataset/DataFrame = RDD + Schema。
  • Structured Streaming:基于Spark SQL进行流式/实时的处理组件,主要处理结构化数据。
  • Streaming(Spark Streaming):提供的对实时数据进行流式计算的组件,底层依然是离线计算,只不过时间粒度很小,攒批。
  • MLlib:提供常见的机器学习(ML)功能的程序库。包括分类、回归、聚类、协同过滤等。
  • GraphX:Spark中用于图计算的API,性能良好,拥有丰富的功能和运算符,能在海量数据上自如地运行复杂的图算法。

4. Spark入门案例

Wordcount词频统计

读取文本文件,文件内容是一行一行的文本,每行文本含有多个单词,单词间使用空格分隔。统计文本中每个单词出现的总次数。

文本内容如下:
hello hello spark
hello heima spark

读取数据是一行一行读取的,对每一行数据都要进行内容的切分
在这里插入图片描述

from pyspark import SparkConf, SparkContext
import os# 绑定指定的Python解释器
os.environ['SPARK_HOME'] = '/export/server/spark'
os.environ['PYSPARK_PYTHON'] = '/root/anaconda3/bin/python3'
os.environ['PYSPARK_DRIVER_PYTHON'] = '/root/anaconda3/bin/python3'# 创建main函数
if __name__ == '__main__':pass# 1- 创建对象conf = SparkConf().setAppName("wordcount").setMaster("local[*]")sc = SparkContext(conf=conf)# 2- 数据输入,返回的类型是RDD"""textFile:支持读取HDFS文件系统和本地文件系统HDFS文件系统:hdfs://node1:8020/文件路径本地文件系统:file:///文件路径"""init_rdd= sc.textFile("file:///export/data/tfec/data/words.txt")# 3- 数据处理"""使用到的部分RDD相关算子flatMapmapreduceByKeycollect"""#文本内容切片"""flatMap运行结果:输入数据:['hello hello spark', 'hello heima spark']输出数据:['hello', 'hello', 'spark', 'hello', 'heima', 'spark']map运行结果:输入数据:['hello hello spark', 'hello heima spark']输出数据:[['hello', 'hello', 'spark'], ['hello', 'heima', 'spark']]"""fm_rdd = init_rdd.flatMap(lambda line:line.split(" "))#数据转换"""输入数据:['hello', 'hello', 'spark', 'hello', 'heima', 'spark']输出数据:[('hello', 1), ('hello', 1), ('spark', 1), ('hello', 1), ('heima', 1), ('spark', 1)]"""map_rdd = fm_rdd.map(lambda word:(word,1))#分组和聚合"""输入数据:[('hello', 1), ('hello', 1), ('spark', 1), ('hello', 1), ('heima', 1), ('spark', 1)]输出数据:[('hello', 3), ('spark', 2), ('heima', 1)]reduceByKey底层运行过程分析:1- 该算子同时具备分组和聚合的功能。而且是先对数据按照key进行分组,对相同key的value会形成得到List列表。再对分组后的value列表进行聚合。2- 分组和聚合功能不能分割,也就是一个整体结合案例进行详细分析:1- 分组输入数据:[('hello', 1), ('hello', 1), ('spark', 1), ('hello', 1), ('heima', 1), ('spark', 1)]分组后的结果: key  value列表hello  [1,1,1]spark  [1,1]heima  [1]2- 聚合(以hello为例)lambda agg,curr: agg+curr -> agg表示中间临时value聚合结果,默认取列表中的第一个元素;curr表示当前遍历到的value元素,默认取列表中的第二个元素第一次聚合:agg =列表中的第一个1,curr=列表中的第二个1。聚合结果agg+curr=1+1=2,再将2赋值给agg第二次聚合:agg =上次临时聚合结果2,curr=列表中的第三个1。聚合结果agg+curr=2+1=3,再将3赋值给agg最后发现已经遍历到value列表的最后一个元素,因此聚合过程结果。最终的hello的次数,就是3"""res = map_rdd.reduceByKey(lambda agg,curr:agg+curr)# 4- 数据输出"""collect():用来收集数据,返回值类型是List列表"""print(res.collect())# 5- 释放资源sc.stop()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/413553.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【VTKExamples::Filtering】第一期 TestContoursFromPolyData

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 前言 本文分享VTK样例TestContoursFromPolyData,并解析vtkCutter,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ~YO 1. TestContour…

前后端跨域问题解决

前后端跨域问题解决 一、前端解决跨域问题 找到以下文件 编写以下代码 const { defineConfig } require(vue/cli-service) module.exports defineConfig({transpileDependencies: true,devServer: {//是否自动打开浏览器open: true,//修改默认8080端口号port: 8087,//跨域…

whale-quant 学习 part1:投资与量化投资

投资与量化投资 什么是投资投资的分类金融投资个人投资者投资品种投资-投机 常见的股票投资分析流派什么是量化投资量化投资的优势量化投资的主要风险 量化投资的历史发展**量化投资的一般流程常见量化投资平台参考 什么是投资 从经济学的广泛意义上讲,投资是为了获…

Win10下在Qt项目中配置SQlite3环境

资源下载 官网资源:SQLite Download Page 1、sqlite.h sqlite-amalgamation-3450000.zip (2.60 MiB) 2、sqlite3.def,sqlite3.dll sqlite-dll-win-x64-3450000.zip (1.25 MiB) 3、 win10下安装sqlite3所需要文件 sqlite-tools-win-x64-3450000.zipht…

【单片机】改写DS2431芯片的地址码,地址ROM,DS2431芯片解密

对DS2431里面的128字节可以进行任意读写,方式可以看这里:https://blog.csdn.net/x1131230123/article/details/132248958 但DS2431芯片的地址码是光刻不可修改的,所以只有使用模拟芯片。 原理: https://www.dianyuan.com/article…

el-date-picker默认结束为当前时分秒

在element ui中的日期时间选择组件中默认是00:00,现在需求是点击默认结束时间为当前时分秒,查了很多资料写的都不准确 需求:实现日期时间组件可选择当前日期,比如当前是2024年01月17号下午17:21 那选中时必须结束时间为17&#x…

20230117-yolov5训练环境搭建

文章目录 1.参考资料2.服务器环境3.安装过程4.问题与解决5.补充6.其它技巧 1.参考资料 https://blog.csdn.net/qq_43573527/article/details/132963466 long错误解决方案 https://pytorch.org/get-started/previous-versions/ pytorch下载的位置 2.服务器环境 conda环境&…

Nsis打包Unity Exe文件(通用)

Nsi 脚本 !include "MUI2.nsh"#使用现代UI Unicode true #使用Unicode !define EXENAME "exeName" #定义常量 exe名称 !define SHORTCUT "快捷方式名称" #定义桌面快捷方式的中文名称Name ${EXENAME} #安装程序的title OutFile "${EXENAME…

uniapp开发小程序—scroll-view实现内容滚动时, 标题也滚动

一、需求 scroll-view实现内容滚动时&#xff0c; 标题也滚动 二、效果 三、代码实现 <template><view class"content"><view class"head">头部固定区域</view><view class"list_box"><!-- 菜单左边 -->&l…

对java的interface的理解

一个例子来让我们理解更加深刻 这是我们的整体文件布局 ①A是接口 ②B和C是用来实现接口的类 ③show是我们的运行函数&#xff0c;用来展示 A接口 接口中定义的方法可以不用去实现,用其他类去实现(必须实现) 关键字:interface public interface A { // public static …

threejs(18) - 地图模型加载

GeoJSON是什么 如果你接触过数据可视化&#xff0c;那么大概率会知道GeoJSON。不知道&#xff1f;没关系&#xff0c;本文将为您娓娓道来&#xff01; GeoJSON是一种对各种地理数据结构进行编码的格式&#xff0c;基于Javascript对象表示法的地理空间信息数据交换格式。 官网…

如何通过IDEA创建基于Java8的Spring Boot项目

上次发现我的IDEA创建Spring Boot项目时只支持11和17的JDK版本&#xff0c;于是就通过Maven搭建SpringBoot项目。 究其原因&#xff0c;原来是Spring官方抛弃了Java8&#xff01;&#xff01;&#xff01; 使用IDEA内置的Spring Initializr创建SpringBoot项目时&#xff0c;已…