Spark基础内容

Spark基本介绍

Spark是什么

定义

Apache Spark是用于大规模数据(large-scala data)处理的统一(unified)分析引擎.

Spark与MapReduce对比

mapreduce架构图如下:

MapReduce的主要缺点:

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

Spark相对MapReduce的优点:

  • 1- Spark底层是基于线程来执行任务
  • 2- 引入了新的数据结构------RDD(弹性分布式数据集),能够让Spark程序主要基于内存进行运行。内存的读写数据相对磁盘来说,要块很多
  • 3- Spark提供了更加丰富的编程API,能够非常轻松的实现功能开发

线程和进程对比

  • 线程的创建和销毁,比进程会更加的快速,以及更加的节省资源
  • 进程很难共享内存中的数据;而同个进程中的线程可以共享内存中的数据

Spark特点

  • 高效性

    • 计算速度快
      • 提供了一个全新的数据结构RDD(弹性分布式数据集)。整个计算操作,基于内存计算。当内存不足的时候,可以放置到磁盘上。整个流程是基于DAG(有向无环图)执行方案。
      • Task线程完成计算任务执行
  • 易用性

    • 支持多种语言开发 (Python,SQL,Java,Scala,R),降低了学习难度
  • 通用性

    • 在 Spark 的基础上,Spark 还提供了包括Spark SQL、Spark Streaming、MLlib 及GraphX在内的多个工具库,我们可以在一个应用中无缝地使用这些工具库。
  • 兼容性(任何地方运行)

    • 支持三方工具接入

      • 存储工具
        • hdfs
        • kafka
        • hbase
      • 资源调度
        • yarn
        • Kubernetes(K8s容器)
        • standalone(spark自带的)
      • 高可用
        • zookeeper
    • 支持多种操作系统

      • Linux
      • windows
      • Mac

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,性能良好,拥有丰富的功能和运算符,能在海量数据上自如地运行复杂的图算法。

基本词频统计案例

python 复制代码
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__':
    print("Spark入门案例: WordCount词频统计")

    # 1- 创建SparkContext对象
    """
        setAppName:设置PySpark程序运行时的名称
        setMaster:设置PySpark程序运行时的集群模式
    """
    conf = SparkConf()\
        .setAppName('spark_wordcount_demo')\
        .setMaster('local[*]')
    sc = SparkContext(conf=conf)

    # 2- 数据输入
    """
        textFile:支持读取HDFS文件系统和本地文件系统
            HDFS文件系统:hdfs://node1:8020/文件路径
            本地文件系统:file:///文件路径
    """
    init_rdd = sc.textFile("file:///export/data/gz16_pyspark/01_spark_core/data/content.txt")

    # 3- 数据处理
    # 文本内容切分
    """
        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']]
    """
    # flatmap_rdd = init_rdd.map(lambda line: line.split(" "))
    flatmap_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 = flatmap_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
    """
    result = map_rdd.reduceByKey(lambda agg,curr: agg+curr)

    # 4- 数据输出
    """
        collect():用来收集数据,返回值类型是List列表
    """
    print(result.collect())

    # 5- 释放资源
    sc.stop()

可能出现的错误:

原因: 找不到JAVA_HOME环境

解决方案: 需要在代码中指定远端的环境地址 以及 在node1环境中初始化JAVA_HOME地址

第一步: 在mian函数上面添加以下内容

os.environ'SPARK_HOME' = '/export/server/spark'

os.environ'PYSPARK_PYTHON' = '/root/anaconda3/bin/python3'

os.environ'PYSPARK_DRIVER_PYTHON' = '/root/anaconda3/bin/python3'

第二步:在node1的 /root/.bashrc 中配置初始化环境的配置

export JAVA_HOME=/export/server/jdk1.8.0_241

注意: 路径需要填写你自己

相关推荐
Raas1001 小时前
MAI Gateway(魔芋企业级AI网关)技术揭秘:AI网关支持哪些模型?从原理到落地
大数据·人工智能·网关·gateway·mai gateway·企业级产品
YangYang9YangYan4 小时前
2026 校招商品分析岗位 JD 拆解,核心指标、工具与面试考点
大数据·数据库·数据分析
大大大大晴天4 小时前
OpenMetadata VS DataHub VS Atlas VS Gravitino
大数据
Qyr997 小时前
2026全球汽车碳刷行业发展全景分析报告
大数据
蓝速科技8 小时前
便民服务大厅 AI 数字人一体机场景适配与落地指南丨蓝速科技
大数据·网络·数据结构·人工智能·自然语言处理·数据分析·运维开发
精益数智工坊8 小时前
云计算环境数据怎么同步?云计算集成方案有哪些?
大数据·人工智能·数据挖掘·数据可视化
huashengzsj9 小时前
什么是DMS经销商管理系统?国内经销商管理系统有哪些品牌
大数据
IT毕设梦工厂10 小时前
计算机毕业设计选题推荐:基于大数据的草鱼价格分析与可视化|毕业设计选题|计算机毕设|选题推荐|毕设指导|项目定制|源码|高质量项目
大数据·hadoop·python·数据挖掘·数据分析·课程设计·大数据毕设项目
辛迪聊物业数字化11 小时前
智慧社区物业管理软件新手部署与实操指南
大数据·php
字节跳动数据平台11 小时前
模型再强,为什么 Demo 还是进不了生产?
大数据