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

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

相关推荐
万岳软件开发小城4 小时前
同城O2O系统源码核心架构分析:多商户、订单、支付及运营体系设计
大数据·同城外卖系统源码·同城o2o系统源码·外卖app开发·同城o2o小程序开发·同城o2o软件开发
兴通物联科技4 小时前
SMT PCB 微小 DataMatrix 码扫不动问题分析 兴通 XT8601B 600 万像素工业读码器落地实践
大数据·人工智能·单片机·嵌入式硬件·算法·计算机视觉
进度猫4 小时前
5个甘特图高阶用法,不止简单排工期
大数据·人工智能·产品经理·甘特图·项目管理软件
zww89491115 小时前
AI智能商城APP定制开发实战:从需求到上线完整指南
大数据·人工智能
招财小梗6 小时前
沈阳商贸公司AI企业服务优势几何?
大数据·人工智能·python
董可伦6 小时前
Spark 数据倾斜:原因、定位与处理方法
大数据·分布式·spark
ZKKLLY6 小时前
生成式引擎优化赛道崛起,优质GEO服务商该如何筛选评估
大数据·人工智能
IT古董7 小时前
FDE(Forward Deployed Engineer)详解:AI时代正在崛起的新型工程师
大数据·人工智能·数据挖掘
大大大大晴天8 小时前
大数据K8S基础:从 Pod 到 Service,看懂数据负载如何在云原生上运行
大数据·kubernetes