AmosCloud

Library

Have a Question?

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

Spark入门

Spark

1. 是什么

是大数据生态中的统一计算引擎

2. 特点

1. 速度快

与传统的例如MR这种基于磁盘的运算相比,Spark提供了基于内存的DAG运算调度器。
将所有运算过程中的磁盘IO简化到最低。

2. 简单易用

Spark支持使用 Scala、Java、Python、SQL、R构建数据处理应用、
Spark提供了超过100种高级算子,可以快速使用多种变成方式构建分布式并行计算程序。

3. 通用性

file

Spark框架提供了5个重要模块

  1. SparkCore
    SparkCore提供了RDD这种弹性分布式数据模型,提供了所有Spark其他组件的底层计算引擎

  2. SparkSQL
    支持使用SQL语法对结构化数据进行SQL操作
    本质上是将SQL翻译为SparkCore程序进行底层运算

  3. SparkStreaming
    Spark中的流式计算模块,允许创建流式计算程序
    SparkStreaming是一个微批处理架构

  4. MLlib
    Spark提供的涵盖了各种已经实现的机器学习算法的算法库

  5. GraphX
    Spark提供的包含各种图计算算法和工具的算法库

4. 到处运行(强兼容性)

  • Spark提供多种运行模式

    1. standalone cluster mode 独立集群模式
      Spark提供了Master-Worker的主从架构集群模式,可以独立搭建集群用于任务的提交和资源的管理

    2. Hadoop YARN 资源管理组件
      ResourceManager-NodeManager
      大部分的大数据使用厂商 都是用Hadoop的HDFS存储数据,Spark仅仅提供计算功能,数据的存储依然使用Hadoop平台的HDFS,为了简化Spark的使用,可以不在独立搭建Spark集群,直接将Spark程序提交到已有的Hadoop集群的YARN服务中,进行资源管理和运行

    3. Apache Mesos资源管理组件
      是一个独立的分布式资源管理组件 与YARN功能类似

    4. Kubernetes k8s
      是一个独立的分布式资源管理组件 与YARN功能类似

    5. 支持在云服务中构建Spark应用

3.集群搭建

3.1 集群架构的相关概念

  • 集群结构示意图

file

  • DriverProgram

    • 驱动程序是开发者编写的带有main方法(程序入口)的一个应用程序,
    • 可以是一个Java的class或者是一个Scala的object
    • 驱动程序中需要创建SparkContext对象,并使用SparkContext读取数据进行处理
  • Cluster Manager

    • 集群管理者
    • 独立模式下 指的是Spark的Master节点
    • Spark on YARN模式 指的是Yarn的主节点 ResuorceManager
  • Worker Node

    • 集群中的从节点,用来执行计算任务
  • Executor 执行器

    • spark任务在worker节点上启动的进程
    • 每个job包含多个执行器,分布在多个worker上
    • 每个执行器只能属于一个job
  • Task 任务线程

    • 每个执行器包含多个Task线程
  • Cache 缓存

    • Spark在执行器级别会为每个几点提供一个公共的缓存空间

3.2 standalone集群搭建

  • 关于版本:

    • 最新版本: 3.1.2
    • 生产环境: 2.x 3.x
    • 经典版本: 1.6.3
  • 当前使用Hadoop 2.7.7 Spark3.1.2 Scala 2.12.x

  1. 下载解压

    • bin目录中可以移除所有的cmd结尾文件
    • 将sbin目录中 与hadoop冲突的脚本,修改为唯一名字
  2. 修改配置文件

    • spark-env.sh
# 配置hadoop集群的配置文件目录, 方便Spark读取HDFS配置
HADOOP_CONF_DIR=/opt/hadoop-2.7.7/etc/hadoop
# 设置Spark集群的master节点
SPARK_MASTER_HOST=node01
# 设置Spark集群master节点的服务器端口
# spark://node01:7077
SPARK_MASTER_PORT=7077
# 设置Spark master 的网页界面访问端口
SPARK_MASTER_WEBUI_PORT=8080
# 配置JDK
JAVA_HOME=/opt/jdk1.8
  • spark-default.conf
# 配置集群启动时使用的master节点的信息
spark.master    spark://node01:7077
  • workers
# 配置所有需要启动worker服务的主机名
node01
node02
node03
  1. 分发安装包
#!/bin/bash
HOSTNAME=`hostname`
HOSTS=`cat /etc/hosts | grep node | awk '{print $2}' | grep -v $HOSTNAME `
SRC=$1
DST=$2
for HOST  in  $HOSTS
do
  echo  "-----------将本机的$1 复制到  $HOST 的 $2"
   scp -rq  $SRC  $HOST:$DST
  echo "----------发送完成."
done
  1. 配置环境变量
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

4. Spark使用

4.1 使用Spark-Shell编写并执行Spark程序

  • spark-shell是Spark提供的一个命令行工具

  • 用于直接在集群上编写和执行Spark程序

  1. 启动SaprkShell
spark-shell \
# 设置需要连接的集群的master信息
--master spark://node01:7077 \
# 设置为当前任务启动多少个执行器
--num-executors 3 \
# 设置为当前任务每个执行器分配多少个cpu核心
--executor-cores 2 \
# 每个执行器分配多少内存
--executor-memory 1G
  • 默认会直接分配集群可用的所有CPU核心数,并且默认在每个worker上启动一个executor
  1. 使用SparkShell执行词频统计任务
// SparkShell会自动创建 SparkContext实例用于进行Spark程序的编写

// 使用sc读取HDFS的文件 生成RDD
sc.textFile("hdfs://node01:9000/Harry.txt")
.flatMap(_.split("\\s+"))//切分并压扁
.map(w=>(w.toLowerCase.replaceAll("\\W",""),1))//转小写 替换非单词字符  封装为二元组
.filter(_._1.length!=0)// 过滤空字符串
.reduceByKey(_+_)//按照Key对Value进行聚合
.sortBy(_._2,false)//按照Value(二元组的第二个元素)排序
.saveAsTextFile("hdfs://node01:9000/output911")

4.2 使用IDEA编写Spark程序提交Jar文件到集群运行

  1. 配置jdk,scala运行环境 SDK 插件
  2. 创建maven工程 添加scala依赖
  3. 添加spark-core依赖
  4. 编写Spark应用