Spark(1)

第一章 Spark框架概述

1 初识Spark

1.1简介

什么是spark
Apache Spark是用于大规模数据(large-scala data)处理的统一(unified)分析引擎。Spark基于内存的计算引擎,加州伯克利大学教授发表论文,基于论文进行开发的。RDD弹性分布式数据集,是spark的核心

RDD 是一种分布式内存抽象,其使得程序员能够在大规模集群中做内存运算,并且有一定的容错方式。而这也是整个 Spark 的核心数据结构,Spark 整个平台都围绕着RDD进行。

spark的思想:
分而治之的思想,把大的任务拆分成若干个小任务,解决后再进行合并,保留了其分布式并行计算的优点并改进了其明显的缺陷。让中间数据存储在内存中提高了运行速度、并提供丰富的操作数据的API提高了开发速度
Spark架构
1)数据结构(编程模型):Spark框架核心
RDD:弹性分布式数据集,认为是列表List
Spark 框架将要处理的数据封装到集合RDD中,调用RDD中函数处理数据
RDD 数据可以放到内存中,内存不足可以放到磁盘中
2)Task任务运行方式:以线程Thread方式运行
MapReduce中Task是以进程Process方式运行,当时Spark Task以线程Thread方式运行。
线程Thread运行在进程Process中,启动和销毁是很快的(相对于进程来说)。

spark是使用Scala语言开发:

java

  • xxx.java源代码
  • xxx.class字节码文件
  • xxx.jar文件(zip压缩文件)
  • jvm(java virtual machine)把jar中class文件翻译成cpu可以执行的指令

scala,多范式编程语言,面向对象,函数式

  • xxx.scala
  • xxx.class

spark提供了python的接口,pyspark进行开发

spark执行效率高的原因:!

1 提供新的数据结构(编程模型)RDD使得程序员从原来的数据操作者变成规则定义者,规则定义完成后,所有的操作都是spark内部帮我们完成的。这些所有的计算都是基于RDD,有RDD后,迭代更加方法,可以基于内存进行运算
2 spark基于线程,mr基于进程,线程调度比进程的调度快。

hadoop基于进程计算和spark基于线程计算的优缺点:!

hadoop的mapreduce是基于进程,进程的好处是每个进程独享资源,任务之间不方便共享数据,导致执行效率低,多个任务都读取同一份数据,这个数据就被加载多次。基于线程是为了数据共享,和提高执行效率,会产生资源竞争。

1.2 Spark的发展

Spark 是加州大学伯克利分校AMP实验室(Algorithms Machines and People Lab)开发的通用大数据出来框架。
Spark的发展历史,经历过几大重要阶段,如下图所示:
Spark的发展

1.3 Spark的特点

1、速度快

原因1:spark基于内存,RDD数据结构,也可以基于磁盘进行运算,可以提供更加方便迭代计算,结果可以保存在内存中也可以存在磁盘中
原因2:spark基于线程,方便数据共享,线程启动 销毁 切换消耗的资源更少

2、易用性

1 提供多种编程语言的api:scala、java、Python、R、sql
2 提供更加高级的api:很多功能都定义好,比如:转换,遍历,排序,不同编程语言函数名字非常接近,便于阅读其他语言编写的代码

3、通用性

spark提供了多种组件,可以应对不同的场景
SparkCore spark的核心:学习spark的基础,其中最为重要的就是RDD
会了解各种语言的客户端,使用python语言操作RDD,操作的接口封装在sparkCore中
SparkSQL :DataFrame,可以使用sql语言进行数据分析处理,DSL语言(domain specified language),都是把代码翻译成对rdd的操作,从而执行
Spark Streaming:进行流式处理,现官方已放弃,了解
Machine Learning:MLlib 线性回归 逻辑回归 聚类算法
GraphX:图计算
Structrued Streaming :结构化流,进行流式处理

4、随处运行

spark可以在不同资源调度平台进行运行:local模式,Spark集群模式,yarn,mesos,可以在云服务中运行
spark和Hadoop大数据生态集成很完善了

2 Spark安装

2.1 安装spark

直接加压安装包到指定目录中,进入到spark/bin执行./pyspark(命令,可执行的脚本程序)

[root@node1 spark]# tar -zxf spark-3.1.2-bin-hadoop3.2.tgz  -C /export/server/
[root@node1 spark]# /export/server/spark/bin/pyspark

安装成功后为了方便使用可以更名: (两种方式二选一即可, 推荐软连接方案),切换到安装路径下:cd /export/server
方法一: 软连接方案: ln -s spark-3.1.2-bin-hadoop3.2 spark
方法二: 直接重命名: mv spark-3.1.2-bin-hadoop3.2 spark
spark目录结构说明:

[root@node1 spark]# ll
总用量 124
drwxr-xr-x 2 1000 1000  4096 74 11:27 bin  ## 可行性文件
drwxr-xr-x 2 1000 1000   197 524 2021 conf	## 配置文件
drwxr-xr-x 5 1000 1000    50 524 2021 data	## 示例程序使用数据
drwxr-xr-x 4 1000 1000    29 524 2021 examples	## 示例程序
drwxr-xr-x 2 1000 1000 12288 524 2021 jars	## 依赖的jar包
drwxr-xr-x 4 1000 1000    38 524 2021 kubernetes
-rw-r--r-- 1 1000 1000 23235 524 2021 LICENSE
drwxr-xr-x 2 1000 1000  4096 524 2021 licenses
-rw-r--r-- 1 1000 1000 57677 524 2021 NOTICE
drwxr-xr-x 9 1000 1000   327 524 2021 python	## Python API包
drwxr-xr-x 3 1000 1000    17 524 2021 R
-rw-r--r-- 1 1000 1000  4488 524 2021 README.md
-rw-r--r-- 1 1000 1000   183 524 2021 RELEASE
drwxr-xr-x 2 1000 1000  4096 524 2021 sbin	## 集群管理命令
drwxr-xr-x 2 1000 1000    42 524 2021 yarn	## 整合yarn相关内容

测试查看是否安装成功

[root@node1 spark]# ./bin/spark-shell

如下所示界面安装成功

Spark context Web UI available at http://node1:4040
Spark context available as 'sc' (master = local[*], app id = local-1688474426263).
Spark session available as 'spark'.
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /___/ .__/\_,_/_/ /_/\_\   version 3.1.2
      /_/

Using Scala version 2.12.10 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_241)
Type in expressions to have them evaluated.
Type :help for more information.

scala>

2.2 安装Anaconda环境包

安装PySpark需要首先具备Python环境,这里使用Anaconda环境
安装版本:https://www.anaconda.com/distribution/#download-section
Python3.8.8版本:Anaconda3-2021.05-Linux-x86_64.sh
在虚拟机上安装anaconda,下载好安装包后上传到虚拟机环境,在安装包存放路径下执行脚本安装

[root@node3 ~]# bash Anaconda3-2021.05-Linux-x86_64.sh

一路yes,安装成功后自动创建base沙箱环境,是anaconda的默认的初始环境,也可以构建更多的虚拟环境, 用于隔离各个Python环境操作, 如果不想到base里, 也可以选择直接退出即。执行conda deactivate退出base虚拟环境
重新访问的时会重新进入了base,若让其默认不进去呢, 可以修改.bashrc这个配置文件

[root@node3 ~]# vim ~/.bashrc

在文件的末尾添加:conda deactivate
在这里插入图片描述

2.3 初体验Anaconda,安装pyspark

注:conda主要作用是创建和管理虚拟环境(沙箱sandbox环境);pip是安装卸载python的包的命令

eg:创建沙箱环境pyspark_env:conda create 虚拟环境名称 python=版本号

[root@node3 ~]# conda create -n pyspark_env  python=3.8

eg:查看当前有那些虚拟环境: conda env list

[root@node3 ~]# conda env list
# conda environments:
#
base                  *  /root/anaconda3
pyspark_env              /root/anaconda3/envs/pyspark_env

eg:进入pyspark_env虚拟环境(激活),并安装pyspark(spark官方提供的使用python操作spark的一系列包库)
conda activate pyspark_envsource activate pyspark_env

[root@node3 ~]# conda activate pyspark_env
(pyspark_env) [root@node3 ~]# pip install pyspark==3.1.2 -i https://mirrors.ustc.edu.cn/pypi/web/simple

安装pyspark
方法一:上传pyspark-3.1.2.tar.gz到指定目录,注意这里安装时不需要解压缩

(pyspark_env) [root@node3 ~]# pip install /export/software/pyspark-3.1.2.tar.gz -i https://mirrors.ustc.edu.cn/pypi/web/simple

方法二:pip install pyspark==版本号 -i https://mirrors.ustc.edu.cn/pypi/web/simple
pip list
查看安装列表,三台机安装成功都如下所示pyspark 3.1.2

(pyspark_env) [root@node3 ~]# pip list
Package    Version
---------- -------
pip        23.1.2
py4j       0.10.9
pyspark    3.1.2
setuptools 67.8.0
wheel      0.38.4

eg:退出虚拟环境:conda deactivatedeactivate pyspark_env
方法一:
登录:source activate;退出:source deactivate

[root@node3 ~]# source activate pyspark_env
(pyspark_env) [root@node3 ~]# source deactivate pyspark_env
DeprecationWarning: 'source deactivate' is deprecated. Use 'conda deactivate'.

警告是在提醒source deactivate命令在conda中已被弃用,建议使用conda deactivate来替代
方法二:
登录:conda activate;退出:conda deactivate

[root@node3 ~]# conda activate pyspark_env
您在 /var/spool/mail/root 中有新邮件
(pyspark_env) [root@node3 ~]# conda deactivate
[root@node3 ~]#

Spark集群模式架构
Spark集群模式架构

3 pycharm连接远程环境

在 PyCharm 中连接远程环境,你可以按照以下步骤操作:

1、打开 PyCharm 并进入项目。
2、点击菜单栏上的 “File”(文件),然后选择 “Settings”(设置)。
3、在弹出的窗口中,找到 “Project: <your_project_name>”(项目:<你的项目名称>)并展开。
4、选择 “Python Interpreter”(Python 解释器)。
5、点击右侧的设置按钮(齿轮图标),然后选择 “Add…”(新增)。
6、在弹出的 “Add Python Interpreter”(新增 Python 解释器)窗口中,选择 “SSH Interpreter”(SSH 解释器)。
7、输入远程服务器的连接信息,包括主机名、用户名和密码等。你还可以选择使用密钥文件进行认证。
8、点击 “Next”(下一步)按钮,PyCharm 将会连接到远程环境并检测可用的解释器。
9、选择你想要使用的远程解释器,然后点击 “Next”(下一步)按钮。
10、完成设置,点击 “OK”(确定)按钮。

现在应该可以在 PyCharm 中使用远程环境进行开发了。请先确保远程服务器已经配置好了相应的 Python 环境,并且网络能通,可以通过 SSH 连接访问。

3.1 词频统计案例

import os
from pyspark import SparkContext,SparkConf
# 配置环境变量
os.environ['SPARK_HOME'] = '/export/server/spark'
os.environ['PYSPARK_PYTHON'] = '/root/anaconda3/envs/pyspark_env/bin/python'
os.environ['PYSPARK_DRIVER_PYTHON'] = '/root/anaconda3/envs/pyspark_env/bin/python'
os.environ['JAVA_HOME'] = '/export/server/jdk1.8.0_241'

if __name__ == '__main__':
    # 1、创建spark运行环境
    sparkConf=SparkConf().setAppName('wordCount').setMaster('local[*]')
    sc=SparkContext(conf=sparkConf)
    # 2、读取文件(可以在本地磁盘linux,也可以在hdfs中)
    # 获取本地磁盘linux下的hello.txt文件
    rdd_file=sc.textFile("file:///root/pybigdata/day01/hello.txt")
    # # 获取HDFS根目录下的hello.txt文件
    # rdd_file=sc.textFile("hdfs://node1:8020/hello.txt")
    print(rdd_file,rdd_file.collect())
    # 3、对句子进行分割操作, flatMap()高阶函数:处理的每个元素,再进行拼接操作
    rdd_flat=rdd_file.flatMap(lambda  line:line.split())
    print(rdd_flat,rdd_flat.collect())
    # 4、把单词和1进行映射得到键值对
    rdd_map=rdd_flat.map(lambda word:(word,1))
    print(rdd_map,rdd_map.collect())
    # 5、分组聚合,reduceByKey():默认使用下标为0的元素作为key进行分组,接收的函数进行聚合操作
    result=rdd_map.reduceByKey(lambda agg,curr:agg+curr)
    # 6、输出结果,惰性计算,不调用collect()不计算
    print(result.collect())
    # 将结果输出到HDFS根目录下result下
    result.saveAsTextFile("hdfs://node1:8020/result")

排序相关的API:

1 sortBy(参数1,参数2):

  • 参数1: 自定义函数,通过函数指定按照谁来进行排序操作
  • 参数2: 可选的,boolean类型,表示是否为升序。默认为True,表示升序

2 sortByKey(参数1):

  • 参数1: 可选的,boolean类型,表示是否为升序。默认为True 表示升序
  • 默认是根据key进行排序操作,需要将排序的字段放置到key上

3 top(N,函数):

  • 参数1: 取前N个元素
  • 参数2: 可选的。如果kv类型,默认是根据key进行排序操作,如果想根据其他排序,可以定义函数指定
    注意: 只能进行【降序】排序,而且直接将结果返回

相关其他API:

  • flatMap(函数): 根据指定的函数对元素进行转换操作,支持将一个元素转换为多个元素
  • map(函数): 根据指定的函数对元素进行转换操作,支持一对一的转换操作,传入一个返回一个
  • reduceByKey(函数): 根据key进行分组操作,将同一分组内的value数据合并为一个列表,然后执行传入的函数。函数传入的参数有两个,参数1表示的是局部聚合结果,参数2表示遍历的每一个列表中value值
  • collect(): 收集,将程序中全部的结果数据收集回来,形成一个列表返回
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值