AmosCloud

Library

Have a Question?

If you have any question you can ask below or enter what you are looking for!

Spark

Spark

Spark是什么

  • Apache Spark™ is a multi-language engine for executing data engineering, data science, and machine learning on single-node machines or clusters.

  • Spark是一个支持多语言的数据计算,科学计算,机器学习引擎(框架),同时支持单节点或者集群运行模式。

  • 功能强大:

    1. 批处理
    2. 结构化的SQL计算
    3. 流式计算
    4. 机器学习库
    5. 图计算

file

  • 特点

    • Simple
      Spark提供了简便的编程API,使数据开发的编码量大大缩减(相比较MR等其他计算框架)。

    • Fast
      Spark支持纯内存运算,将DAG的处理过程全部使用内存进行缓存,不需要在计算过程中产生磁盘IO,大大的提高了计算效率。

    • Scalable
      Spark支持Scala、Java、SQL、Python、R多种语言开发,应用开发支持上述所有语言,框架开发支持Scala、Java。

    • Unified
      Spark提供了批、流、结构化、机器学习等各种类型的计算功能。

集群搭建

1. Spark集群的运行模式

  1. local 本地模式 (单机模式)
    通常用于小规模数据统计或者Spark任务的IDEA开发

  2. standalone 独立集群模式
    Spark提供了Master-Worker的主从架构集群,可以通过启动集群角色搭建独立集群

  3. 其他资源管理服务
    Spark支持将Spark任务提交给其他的资源管理组件进行任务调度 例如YARN、Mesos、K8s

搭建Standalone Spark集群

  • 关于版本

    • 重要版本: 1.6.3
    • 企业中常见版本: 2.1.x 2.4.x
    • 最新版: 3.2.0 3.1.2
  1. 下载解压安装包

  2. 修改配置文件

    • 可选:
      删除cmd命令
      修改启动和关闭集群的命令 ,不要使用start-all和stop-all

    • spark-env.sh

# 配置hadoop集群的配置文件目录
# 目的是让Spark可以读取到HDFS数据
HADOOP_CONF_DIR=/opt/hadoop-2.7.7/etc/hadoop
# 配置Spark集群主节点的主机名和端口
SPARK_MASTER_HOST=host02
# Spark任务提交时的服务端口
SPARK_MASTER_PORT=7077
# SparkMaster WebUI 端口
SPARK_MASTER_WEBUI_PORT=8080
# 配置Java home
JAVA_HOME=/opt/jdk1.8
  • spark-defaults.conf
# 配置Spark相关配置
# master节点的配置
spark.master        spark://host02:7077
  • workers
host01
host02
host03
  1. 分发安装包

  2. 配置环境变量

echo 'export SPARK_HOME=/opt/spark-3.1.2' >> /etc/profile
echo 'export PATH=$SPARK_HOME/bin:$SPARK_HOME/sbin:$PATH' >> /etc/profile
source /etc/profile
  1. 启动集群

start-spark-all.sh

----host01的JVM进程----
11684 Worker
----host02的JVM进程----
120542 Master
120638 Worker
----host03的JVM进程----
46213 Worker

file

Spark操作

1. Spark-shell

Spark-shell是一个类似Scala解释器的命令行工具,用于方便开发者直接在命令行进行Spark程序的开发和测试

2. Spark IDEA开发

RDD

  • 是什么:
    RDD 弹性分布式数据集
    是spark中的基本数据抽象

    • 数据抽象
      Spark预先为RDD这种数据结构设计了近百种算子操作,开发者只需要在处理数据时将数据加载到RDD中,就可以直接使用预置的算子进行各种运算
  • RDD的重要特征

    • A list of partitions
      RDD是一个包含多个分区的列表

    • A function for computing each split
      RDD会将算子(函数)操作并发的执行在每一个分区上(分片)

    • A list of dependencies on other RDDs
      RDD会记录与上游RDD的依赖列表

    • Optionally, a Partitioner for key-value RDDs (e.g. to say that the RDD is hash-partitioned)
      对于二元组作为泛型的RDD[(K,V)],可以自定义分区器进行数据的重新分区,Spark默认提供了HashPatitioner和RangePartitioner

    • Optionally, a list of preferred locations to compute each split on (e.g. block locations for an HDFS file)
      Spark会根据数据所在位置优先本地运算,避免网络IO

    • 弹性
      Spark允许在RDD的计算过程中随时调整RDD的分区个数
      Spark会为RDD的每个分区单独启动一个Task(线程)进行并行运算
      可以在元素数量较多时或者计算逻辑较为复杂时增加并发度(增加分区数)提高计算效率,也可以在进行聚合、去重之类操作后缩减分区个数(并发度)节省计算资源

    • 只读
      RDD由于需要记录上游RDD的依赖,所以设计成只读结构,每次RDD的transformation操作都会产生新的RDD,而不是在原有RDD中修改数据

    • 持久化
      RDD如果计算步骤过多,DAG中会出现频繁重试的节点(RDD),可以对相应的RDD进行持久化,目的是简化依赖链条

    • 懒执行
      RDD依赖中如果最终没有调用任何action算子,则整个依赖不真正执行